1import unittest
2from unittests import wtc
3import wx
4import sys, os
5
6WAIT=50
7
8#---------------------------------------------------------------------------
9
10class MouseEventsPanel(wx.Panel):
11    def __init__(self, parent, eventBinders):
12        wx.Panel.__init__(self, parent, size=parent.GetClientSize())
13        self.SetBackgroundColour('pink')
14        self.events = list()
15        if not isinstance(eventBinders, (list, tuple)):
16            eventBinders = [eventBinders]
17        for binder in eventBinders:
18            self.Bind(binder, self.onMouseEvent)
19
20    def onMouseEvent(self, evt):
21        self.events.append( (evt.EventType, evt.Position) )
22        print( (evt.EventType, evt.Position) )
23        evt.Skip()
24
25
26
27class uiaction_MouseTests(wtc.WidgetTestCase):
28
29
30    def cmp(self, info, evtType, pos):
31        if isinstance(evtType, tuple):
32            if info[0] not in evtType:
33                return False
34        else:
35            if info[0] != evtType:
36                return False
37        # TODO: The mouse pos may be off by 1 on MSW, is this expected?
38        if abs(info[1].x - pos[0]) > 1:
39            return False
40        if abs(info[1].y - pos[1]) > 1:
41            return False
42        return True
43
44    def setUp(self):
45        super(uiaction_MouseTests, self).setUp()
46        self.frame.WarpPointer(-10,-10)
47
48
49    def test_uiactionMouseMotion(self):
50        p = MouseEventsPanel(self.frame, wx.EVT_MOTION)
51        self.myYield()
52
53        uia = wx.UIActionSimulator()
54        uia.MouseMove(p.ClientToScreen((1,1)));   self.waitFor(WAIT)
55        uia.MouseMove(p.ClientToScreen((5,5)));   self.waitFor(WAIT)
56        uia.MouseMove(p.ClientToScreen((10,10)).x, p.ClientToScreen((10,10)).y)
57        self.waitFor(WAIT)
58        self.waitFor(WAIT)
59
60        self.assertEqual(len(p.events), 3)
61        self.assertTrue(self.cmp(p.events[0], wx.wxEVT_MOTION, (1,1)))
62        self.assertTrue(self.cmp(p.events[1], wx.wxEVT_MOTION, (5,5)))
63        self.assertTrue(self.cmp(p.events[2], wx.wxEVT_MOTION, (10,10)))
64
65
66    def test_uiactionMouseLeftDownUp(self):
67        p = MouseEventsPanel(self.frame, [wx.EVT_LEFT_DOWN, wx.EVT_LEFT_UP])
68        self.myYield()
69
70        uia = wx.UIActionSimulator()
71        uia.MouseMove(p.ClientToScreen((10,10)));   self.waitFor(WAIT)
72        uia.MouseDown();                            self.waitFor(WAIT)
73        uia.MouseUp();                              self.waitFor(WAIT)
74        self.waitFor(WAIT)
75
76        self.assertTrue(len(p.events) == 2)
77        self.assertTrue(self.cmp(p.events[0], wx.wxEVT_LEFT_DOWN, (10,10)))
78        self.assertTrue(self.cmp(p.events[1], wx.wxEVT_LEFT_UP, (10,10)))
79
80
81    def test_uiactionMouseRightDownUp(self):
82        p = MouseEventsPanel(self.frame, [wx.EVT_RIGHT_DOWN, wx.EVT_RIGHT_UP])
83        self.myYield()
84
85        uia = wx.UIActionSimulator()
86        uia.MouseMove(p.ClientToScreen((10,10)));  self.waitFor(WAIT)
87        uia.MouseDown(wx.MOUSE_BTN_RIGHT);         self.waitFor(WAIT)
88        uia.MouseUp(wx.MOUSE_BTN_RIGHT);           self.waitFor(WAIT)
89        self.waitFor(WAIT)
90
91        self.assertTrue(len(p.events) == 2)
92        self.assertTrue(self.cmp(p.events[0], wx.wxEVT_RIGHT_DOWN, (10,10)))
93        self.assertTrue(self.cmp(p.events[1], wx.wxEVT_RIGHT_UP, (10,10)))
94
95
96    def test_uiactionMouseLeftClick(self):
97        p = MouseEventsPanel(self.frame, [wx.EVT_LEFT_DOWN, wx.EVT_LEFT_UP])
98        self.myYield()
99
100        uia = wx.UIActionSimulator()
101        uia.MouseMove(p.ClientToScreen((10,10)));  self.waitFor(WAIT)
102        uia.MouseClick();                          self.waitFor(WAIT)
103        self.waitFor(WAIT)
104
105        self.assertTrue(len(p.events) == 2)
106        self.assertTrue(self.cmp(p.events[0], wx.wxEVT_LEFT_DOWN, (10,10)))
107        self.assertTrue(self.cmp(p.events[1], wx.wxEVT_LEFT_UP, (10,10)))
108
109
110    def test_uiactionMouseLeftDClick(self):
111        p = MouseEventsPanel(self.frame, [wx.EVT_LEFT_DOWN, wx.EVT_LEFT_UP, wx.EVT_LEFT_DCLICK])
112        self.myYield()
113
114        uia = wx.UIActionSimulator()
115        uia.MouseMove(p.ClientToScreen((10,10)));  self.waitFor(WAIT)
116        uia.MouseDblClick();                       self.waitFor(WAIT)
117        self.waitFor(WAIT)
118
119        self.assertTrue(len(p.events) == 4)
120        self.assertTrue(self.cmp(p.events[0], wx.wxEVT_LEFT_DOWN, (10,10)))
121        self.assertTrue(self.cmp(p.events[1], wx.wxEVT_LEFT_UP, (10,10)))
122        self.assertTrue(self.cmp(p.events[2], (wx.wxEVT_LEFT_DOWN, wx.wxEVT_LEFT_DCLICK), (10,10)))
123        self.assertTrue(self.cmp(p.events[3], wx.wxEVT_LEFT_UP, (10,10)))
124
125
126    def test_uiactionMouseDD(self):
127        p = MouseEventsPanel(self.frame, [wx.EVT_MOTION, wx.EVT_LEFT_DOWN, wx.EVT_LEFT_UP])
128
129        x1, y1 = p.ClientToScreen((10,10))
130        x2 = x1 + 20
131        y2 = y1 + 20
132
133        uia = wx.UIActionSimulator()
134        uia.MouseDragDrop(x1,y1, x2,y2);  self.waitFor(WAIT)
135        self.waitFor(WAIT)
136
137        self.assertEqual(len(p.events), 4)
138        self.assertTrue(self.cmp(p.events[0], wx.wxEVT_MOTION, (10,10)))
139        self.assertTrue(self.cmp(p.events[1], wx.wxEVT_LEFT_DOWN, (10,10)))
140        self.assertTrue(self.cmp(p.events[2], wx.wxEVT_MOTION, (30,30)))
141        self.assertTrue(self.cmp(p.events[3], wx.wxEVT_LEFT_UP, (30,30)))
142
143
144#---------------------------------------------------------------------------
145
146
147class uiaction_KeyboardTests(wtc.WidgetTestCase):
148
149    def setUp(self):
150        super(uiaction_KeyboardTests, self).setUp()
151        pnl = wx.Panel(self.frame)
152        pnl.SetBackgroundColour('pink')
153        self.tc = wx.TextCtrl(pnl)
154        self.tc.SetFocus()
155        self.waitFor(WAIT)
156
157
158    def test_uiactionKeyboardKeyDownUp(self):
159        uia = wx.UIActionSimulator()
160        for c in "This is a test":
161            if c.isupper():
162                uia.KeyDown(wx.WXK_SHIFT);  self.waitFor(WAIT)
163            uia.KeyDown(ord(c));            self.waitFor(WAIT)
164            uia.KeyUp(ord(c));              self.waitFor(WAIT)
165            if c.isupper():
166                uia.KeyUp(wx.WXK_SHIFT);    self.waitFor(WAIT)
167        self.waitFor(WAIT*2)
168
169        self.assertEqual(self.tc.GetValue(), "This is a test")
170
171
172    @unittest.skipIf(sys.platform == 'darwin', 'wx.UIActionSimulator.Char needs work...')
173    def test_uiactionKeyboardChar(self):
174        uia = wx.UIActionSimulator()
175        for c in "This is a test":
176            mod = wx.MOD_NONE
177            if c.isupper():
178                mod = wx.MOD_SHIFT
179            uia.Char(ord(c), mod);
180            self.waitFor(WAIT)
181        self.waitFor(WAIT*2)
182
183        self.assertEqual(self.tc.GetValue(), "This is a test")
184
185
186    @unittest.skipIf(sys.platform == 'darwin', 'wx.UIActionSimulator.Text needs work...')
187    def test_uiactionKeyboardText(self):
188        uia = wx.UIActionSimulator()
189        uia.Text("This is a test")
190        self.waitFor(WAIT*2)
191
192        self.assertEqual(self.tc.GetValue(), "This is a test")
193
194
195#---------------------------------------------------------------------------
196
197
198if __name__ == '__main__':
199    unittest.main()
200