Skip to content

Commit 9d193ab

Browse files
authored
Merge pull request #89 from tmontes/cleaner-fake-tkinter
Cleaner fake tkinter.
2 parents 8e1f88d + f72a35f commit 9d193ab

8 files changed

+136
-110
lines changed

tests/fake_tkinter.py

+22-22
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111

1212

13-
class FakeCanvas:
13+
class Canvas:
1414

15-
def __init__(self):
15+
def __init__(self, *args, **kwargs):
16+
self.init_args = mock.call(*args, **kwargs)
1617
self.pack = mock.Mock()
1718
self.config = mock.Mock()
1819
self.xview_scroll = mock.Mock()
@@ -21,23 +22,16 @@ def __init__(self):
2122
self.coords = mock.Mock()
2223
self.update = mock.Mock()
2324
self.delete = mock.Mock()
24-
self.create_polygon_coords = None
25-
self.create_polygon_kwargs = None
25+
self.create_polygon = mock.Mock(return_value=42)
2626
self.create_image = mock.Mock(return_value=24)
2727
self.create_line = mock.Mock(return_value=42)
2828
self.itemconfig = mock.Mock()
2929
self.tag_lower = mock.Mock()
3030
self.tag_raise = mock.Mock()
3131

32-
def create_polygon(self, coords, **kwargs):
33-
self.create_polygon_coords = coords
34-
self.create_polygon_kwargs = kwargs
35-
# Return some numeric id.
36-
return 42
37-
3832

3933

40-
class FakeWindow:
34+
class Window:
4135

4236
def __init__(self, screen_width, screen_height):
4337
self.winfo_screenwidth = mock.Mock(return_value=screen_width)
@@ -82,15 +76,15 @@ def winfo_height(self):
8276
return self._h
8377

8478

85-
class FakeTk(FakeWindow):
79+
class Tk(Window):
8680
pass
8781

8882

89-
class FakeToplevel(FakeWindow):
83+
class Toplevel(Window):
9084
pass
9185

9286

93-
class FakePhotoImage:
87+
class PhotoImage:
9488

9589
def __init__(self):
9690
self.copies = 0
@@ -103,28 +97,34 @@ def __init__(self):
10397

10498
def copy(self):
10599
self.copies += 1
106-
return FakePhotoImage()
100+
return PhotoImage()
107101

108102

109103

110-
class FakeTkinter:
104+
class Module:
111105

112106
def __init__(self, screen_width, screen_height):
113107
self.screen_width = screen_width
114108
self.screen_height = screen_height
115-
self.canvas_init_calls = []
109+
self.windows = []
110+
self.canvases = []
116111
self.photoimage_init_calls = []
117112

118113
def Tk(self):
119-
return FakeTk(self.screen_width, self.screen_height)
114+
window = Tk(self.screen_width, self.screen_height)
115+
self.windows.append(window)
116+
return window
120117

121118
def Toplevel(self):
122-
return FakeToplevel(self.screen_width, self.screen_height)
119+
window = Toplevel(self.screen_width, self.screen_height)
120+
self.windows.append(window)
121+
return window
123122

124123
def Canvas(self, *args, **kwargs):
125-
self.canvas_init_calls.append((args, kwargs))
126-
return FakeCanvas()
124+
canvas = Canvas(*args, **kwargs)
125+
self.canvases.append(canvas)
126+
return canvas
127127

128128
def PhotoImage(self, *args, **kwargs):
129129
self.photoimage_init_calls.append((args, kwargs))
130-
return FakePhotoImage()
130+
return PhotoImage()

tests/test_base_sprites.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class TestDefaultSprite(test_base.TestCase):
2222

2323
def setUp(self):
2424

25-
self.canvas = fake_tkinter.FakeCanvas()
25+
self.canvas = fake_tkinter.Canvas()
2626

2727

2828
def test_create(self):
@@ -332,7 +332,7 @@ class TestNonDefaultSprite(test_base.TestCase):
332332

333333
def setUp(self):
334334

335-
self.canvas = fake_tkinter.FakeCanvas()
335+
self.canvas = fake_tkinter.Canvas()
336336
self.sprite = base.Sprite(
337337
canvas=self.canvas,
338338
shape=None,
@@ -549,7 +549,7 @@ class AsyncAnimationBase(test_base.TestCase):
549549

550550
def setUp(self):
551551

552-
self.canvas = fake_tkinter.FakeCanvas()
552+
self.canvas = fake_tkinter.Canvas()
553553

554554
self.asyncio = fake_asyncio.FakeAsyncio()
555555
self._exit_stack = contextlib.ExitStack()
@@ -1382,7 +1382,7 @@ class SyncAnimationBase(test_base.TestCase):
13821382

13831383
def setUp(self):
13841384

1385-
self.canvas = fake_tkinter.FakeCanvas()
1385+
self.canvas = fake_tkinter.Canvas()
13861386

13871387
self.time = mock.Mock()
13881388
self._exit_stack = contextlib.ExitStack()
@@ -1974,7 +1974,7 @@ class TestRegressionSpriteInitializedWithUpdateTrue(test_base.TestCase):
19741974

19751975
def setUp(self):
19761976

1977-
self.canvas = fake_tkinter.FakeCanvas()
1977+
self.canvas = fake_tkinter.Canvas()
19781978
self.sprite = base.Sprite(self.canvas, shape=None, update=True)
19791979

19801980

tests/test_bitmap_shapes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class _TkBasedTests(unittest.TestCase):
6161
def setUp(self):
6262

6363
# PIL code path tests run against fake_tkinter.
64-
self.tkinter = fake_tkinter.FakeTkinter(640, 480)
64+
self.tkinter = fake_tkinter.Module(640, 480)
6565

6666
# Replace tkinter with the fake one.
6767
self.save_tkinter = bitmap.tkinter

tests/test_bitmap_sprites.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class TestDefaultSprite(base.TestCase):
2626

2727
def setUp(self):
2828

29-
self.canvas = fake_tkinter.FakeCanvas()
29+
self.canvas = fake_tkinter.Canvas()
3030

3131

3232
def test_create(self):

tests/test_canvas.py

+40-29
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class TestInvertedTkYCanvas(unittest.TestCase):
2323

2424
def setUp(self):
2525

26-
self.tkinter = fake_tkinter.FakeTkinter(
26+
self.tkinter = fake_tkinter.Module(
2727
screen_width=SCREEN_WIDTH,
2828
screen_height=SCREEN_HEIGHT,
2929
)
@@ -44,40 +44,33 @@ def test_create_creates_tkinter_Canvas(self):
4444

4545
_c = canvas.InvertedYCanvas(self.master, 'background')
4646

47-
tkinter_canvas_call_args = self.tkinter.canvas_init_calls
48-
49-
self.assertEqual(len(tkinter_canvas_call_args), 1, 'tkinter.Canvas call count')
47+
self.assertEqual(len(self.tkinter.canvases), 1, 'tkinter.Canvas call count')
5048

5149

5250
def test_create_creates_tkinter_Canvas_with_given_master(self):
5351

5452
_c = canvas.InvertedYCanvas(self.master, 'background')
5553

56-
tkinter_canvas_call_args = self.tkinter.canvas_init_calls
54+
canvas_init_args = self.tkinter.canvases[0].init_args
5755

5856
# Passed a single positional argument: self.master
59-
(single_arg,), _kwargs = tkinter_canvas_call_args[0]
60-
self.assertIs(single_arg, self.master)
57+
self.assertIs(canvas_init_args.args[0], self.master)
6158

6259

6360
def test_create_creates_tkinter_Canvas_with_given_background(self):
6461

6562
_c = canvas.InvertedYCanvas(self.master, 'background')
6663

67-
tkinter_canvas_call_args = self.tkinter.canvas_init_calls
68-
69-
_args, kwargs = tkinter_canvas_call_args[0]
70-
self.assertEqual(kwargs['background'], 'background')
64+
canvas_init_args = self.tkinter.canvases[0].init_args
65+
self.assertEqual(canvas_init_args.kwargs['background'], 'background')
7166

7267

7368
def test_create_creates_tkinter_Canvas_with_zero_highlightthickness(self):
7469

7570
_c = canvas.InvertedYCanvas(self.master, 'background')
7671

77-
tkinter_canvas_call_args = self.tkinter.canvas_init_calls
78-
79-
_args, kwargs = tkinter_canvas_call_args[0]
80-
self.assertEqual(kwargs['highlightthickness'], 0)
72+
canvas_init_args = self.tkinter.canvases[0].init_args
73+
self.assertEqual(canvas_init_args.kwargs['highlightthickness'], 0)
8174

8275

8376
def test_create_polygon_returns_integer_item_id(self):
@@ -96,9 +89,13 @@ def test_create_polygon_inverts_y_coordinates(self):
9689
coords = [0, 0, 1, 1, 2, -2]
9790
_item_id = c.create_polygon(coords, fill='fill', outline='outline', width=42)
9891

99-
args = c._canvas.create_polygon_coords
100-
101-
self.assertEqual(args, [0, 0, 1, -1, 2, 2])
92+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
93+
wrapped_tkinter_canvas.create_polygon.assert_called_once_with(
94+
[0, 0, 1, -1, 2, 2],
95+
fill=mock.ANY,
96+
outline=mock.ANY,
97+
width=mock.ANY,
98+
)
10299

103100

104101
def test_create_polygon_passes_args_to_Canvas_create_polygon(self):
@@ -107,8 +104,13 @@ def test_create_polygon_passes_args_to_Canvas_create_polygon(self):
107104

108105
_item_id = c.create_polygon([], fill='fill', outline='outline', width=42)
109106

110-
kwargs = c._canvas.create_polygon_kwargs
111-
self.assertEqual(kwargs, dict(fill='fill', outline='outline', width=42))
107+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
108+
wrapped_tkinter_canvas.create_polygon.assert_called_once_with(
109+
mock.ANY,
110+
fill='fill',
111+
outline='outline',
112+
width=42,
113+
)
112114

113115

114116
def test_create_image_returns_integer_item_id(self):
@@ -126,7 +128,8 @@ def test_create_image_inverts_y_coordinate(self):
126128

127129
_item_id = c.create_image(42, 24, image=None, anchor=None)
128130

129-
c._canvas.create_image.assert_called_with(
131+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
132+
wrapped_tkinter_canvas.create_image.assert_called_with(
130133
42, -24, image=mock.ANY, anchor=mock.ANY
131134
)
132135

@@ -137,7 +140,8 @@ def test_create_image_passes_args_to_Canvas_create_image(self):
137140

138141
_item_id = c.create_image(42, 24, image='image', anchor='anchor')
139142

140-
c._canvas.create_image.assert_called_with(
143+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
144+
wrapped_tkinter_canvas.create_image.assert_called_with(
141145
mock.ANY, mock.ANY, image='image', anchor='anchor'
142146
)
143147

@@ -158,7 +162,8 @@ def test_create_line_inverts_y_coordinates(self):
158162
coords = [0, 0, 1, 1, 2, -2]
159163
_item_id = c.create_line(coords, fill='fill', width=42, capstyle='capstyle')
160164

161-
c._canvas.create_line.assert_called_with(
165+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
166+
wrapped_tkinter_canvas.create_line.assert_called_with(
162167
[0, 0, 1, -1, 2, 2], fill=mock.ANY, width=mock.ANY, capstyle=mock.ANY,
163168
)
164169

@@ -169,7 +174,8 @@ def test_create_line_passes_args_to_Canvas_create_line(self):
169174

170175
_item_id = c.create_line([], fill='fill', width=42, capstyle='capstyle')
171176

172-
c._canvas.create_line.assert_called_with(
177+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
178+
wrapped_tkinter_canvas.create_line.assert_called_with(
173179
mock.ANY, fill='fill', width=42, capstyle='capstyle',
174180
)
175181

@@ -180,7 +186,8 @@ def test_move_calls_canvas_move_with_same_item_id(self):
180186

181187
c.move(42, 0, 0)
182188

183-
c._canvas.move.assert_called_with(42, mock.ANY, mock.ANY)
189+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
190+
wrapped_tkinter_canvas.move.assert_called_with(42, mock.ANY, mock.ANY)
184191

185192

186193
def test_move_calls_canvas_move_with_inverted_y(self):
@@ -189,7 +196,8 @@ def test_move_calls_canvas_move_with_inverted_y(self):
189196

190197
c.move(None, 42, 24)
191198

192-
c._canvas.move.assert_called_with(mock.ANY, 42, -24)
199+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
200+
wrapped_tkinter_canvas.move.assert_called_with(mock.ANY, 42, -24)
193201

194202

195203
def test_coords_calls_canvas_coords_with_same_item_id(self):
@@ -198,7 +206,8 @@ def test_coords_calls_canvas_coords_with_same_item_id(self):
198206

199207
c.coords(42, [])
200208

201-
c._canvas.coords.assert_called_with(42, mock.ANY)
209+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
210+
wrapped_tkinter_canvas.coords.assert_called_with(42, mock.ANY)
202211

203212

204213
def test_coords_calls_canvas_coords_with_inverted_y_coords(self):
@@ -207,7 +216,8 @@ def test_coords_calls_canvas_coords_with_inverted_y_coords(self):
207216

208217
c.coords(None, [1, 2, 3, 4, 5, 6])
209218

210-
c._canvas.coords.assert_called_with(
219+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
220+
wrapped_tkinter_canvas.coords.assert_called_with(
211221
mock.ANY, [1, -2, 3, -4, 5, -6]
212222
)
213223

@@ -228,8 +238,9 @@ def test_attribute_access_returns_tkinter_Canvas_attribute(self):
228238
'tag_raise',
229239
)
230240

241+
wrapped_tkinter_canvas = self.tkinter.canvases[0]
231242
for name in names:
232243
with self.subTest(attr_name=name):
233244
result = getattr(c, name)
234-
underlying = getattr(c._canvas, name)
245+
underlying = getattr(wrapped_tkinter_canvas, name)
235246
self.assertIs(result, underlying)

0 commit comments

Comments
 (0)