python (3.12.0)
1 import unittest
2 import tkinter
3 from test import support
4 from test.support import os_helper
5 from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest, requires_tk
6
7 support.requires('gui')
8
9
10 class ESC[4;38;5;81mMiscTest(ESC[4;38;5;149mAbstractTkTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
11
12 def test_image_types(self):
13 image_types = self.root.image_types()
14 self.assertIsInstance(image_types, tuple)
15 self.assertIn('photo', image_types)
16 self.assertIn('bitmap', image_types)
17
18 def test_image_names(self):
19 image_names = self.root.image_names()
20 self.assertIsInstance(image_names, tuple)
21
22
23 class ESC[4;38;5;81mDefaultRootTest(ESC[4;38;5;149mAbstractDefaultRootTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
24
25 def test_image_types(self):
26 self.assertRaises(RuntimeError, tkinter.image_types)
27 root = tkinter.Tk()
28 image_types = tkinter.image_types()
29 self.assertIsInstance(image_types, tuple)
30 self.assertIn('photo', image_types)
31 self.assertIn('bitmap', image_types)
32 root.destroy()
33 tkinter.NoDefaultRoot()
34 self.assertRaises(RuntimeError, tkinter.image_types)
35
36 def test_image_names(self):
37 self.assertRaises(RuntimeError, tkinter.image_names)
38 root = tkinter.Tk()
39 image_names = tkinter.image_names()
40 self.assertIsInstance(image_names, tuple)
41 root.destroy()
42 tkinter.NoDefaultRoot()
43 self.assertRaises(RuntimeError, tkinter.image_names)
44
45 def test_image_create_bitmap(self):
46 self.assertRaises(RuntimeError, tkinter.BitmapImage)
47 root = tkinter.Tk()
48 image = tkinter.BitmapImage()
49 self.assertIn(image.name, tkinter.image_names())
50 root.destroy()
51 tkinter.NoDefaultRoot()
52 self.assertRaises(RuntimeError, tkinter.BitmapImage)
53
54 def test_image_create_photo(self):
55 self.assertRaises(RuntimeError, tkinter.PhotoImage)
56 root = tkinter.Tk()
57 image = tkinter.PhotoImage()
58 self.assertIn(image.name, tkinter.image_names())
59 root.destroy()
60 tkinter.NoDefaultRoot()
61 self.assertRaises(RuntimeError, tkinter.PhotoImage)
62
63
64 class ESC[4;38;5;81mBitmapImageTest(ESC[4;38;5;149mAbstractTkTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
65
66 @classmethod
67 def setUpClass(cls):
68 AbstractTkTest.setUpClass.__func__(cls)
69 cls.testfile = support.findfile('python.xbm', subdir='imghdrdata')
70
71 def test_create_from_file(self):
72 image = tkinter.BitmapImage('::img::test', master=self.root,
73 foreground='yellow', background='blue',
74 file=self.testfile)
75 self.assertEqual(str(image), '::img::test')
76 self.assertEqual(image.type(), 'bitmap')
77 self.assertEqual(image.width(), 16)
78 self.assertEqual(image.height(), 16)
79 self.assertIn('::img::test', self.root.image_names())
80 del image
81 support.gc_collect() # For PyPy or other GCs.
82 self.assertNotIn('::img::test', self.root.image_names())
83
84 def test_create_from_data(self):
85 with open(self.testfile, 'rb') as f:
86 data = f.read()
87 image = tkinter.BitmapImage('::img::test', master=self.root,
88 foreground='yellow', background='blue',
89 data=data)
90 self.assertEqual(str(image), '::img::test')
91 self.assertEqual(image.type(), 'bitmap')
92 self.assertEqual(image.width(), 16)
93 self.assertEqual(image.height(), 16)
94 self.assertIn('::img::test', self.root.image_names())
95 del image
96 support.gc_collect() # For PyPy or other GCs.
97 self.assertNotIn('::img::test', self.root.image_names())
98
99 def assertEqualStrList(self, actual, expected):
100 self.assertIsInstance(actual, str)
101 self.assertEqual(self.root.splitlist(actual), expected)
102
103 def test_configure_data(self):
104 image = tkinter.BitmapImage('::img::test', master=self.root)
105 self.assertEqual(image['data'], '-data {} {} {} {}')
106 with open(self.testfile, 'rb') as f:
107 data = f.read()
108 image.configure(data=data)
109 self.assertEqualStrList(image['data'],
110 ('-data', '', '', '', data.decode('ascii')))
111 self.assertEqual(image.width(), 16)
112 self.assertEqual(image.height(), 16)
113
114 self.assertEqual(image['maskdata'], '-maskdata {} {} {} {}')
115 image.configure(maskdata=data)
116 self.assertEqualStrList(image['maskdata'],
117 ('-maskdata', '', '', '', data.decode('ascii')))
118
119 def test_configure_file(self):
120 image = tkinter.BitmapImage('::img::test', master=self.root)
121 self.assertEqual(image['file'], '-file {} {} {} {}')
122 image.configure(file=self.testfile)
123 self.assertEqualStrList(image['file'],
124 ('-file', '', '', '',self.testfile))
125 self.assertEqual(image.width(), 16)
126 self.assertEqual(image.height(), 16)
127
128 self.assertEqual(image['maskfile'], '-maskfile {} {} {} {}')
129 image.configure(maskfile=self.testfile)
130 self.assertEqualStrList(image['maskfile'],
131 ('-maskfile', '', '', '', self.testfile))
132
133 def test_configure_background(self):
134 image = tkinter.BitmapImage('::img::test', master=self.root)
135 self.assertEqual(image['background'], '-background {} {} {} {}')
136 image.configure(background='blue')
137 self.assertEqual(image['background'], '-background {} {} {} blue')
138
139 def test_configure_foreground(self):
140 image = tkinter.BitmapImage('::img::test', master=self.root)
141 self.assertEqual(image['foreground'],
142 '-foreground {} {} #000000 #000000')
143 image.configure(foreground='yellow')
144 self.assertEqual(image['foreground'],
145 '-foreground {} {} #000000 yellow')
146
147 def test_bug_100814(self):
148 # gh-100814: Passing a callable option value causes AttributeError.
149 with self.assertRaises(tkinter.TclError):
150 tkinter.BitmapImage('::img::test', master=self.root, spam=print)
151 image = tkinter.BitmapImage('::img::test', master=self.root)
152 with self.assertRaises(tkinter.TclError):
153 image.configure(spam=print)
154
155
156 class ESC[4;38;5;81mPhotoImageTest(ESC[4;38;5;149mAbstractTkTest, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
157
158 @classmethod
159 def setUpClass(cls):
160 AbstractTkTest.setUpClass.__func__(cls)
161 cls.testfile = support.findfile('python.gif', subdir='imghdrdata')
162
163 def create(self):
164 return tkinter.PhotoImage('::img::test', master=self.root,
165 file=self.testfile)
166
167 def colorlist(self, *args):
168 if tkinter.TkVersion >= 8.6 and self.wantobjects:
169 return args
170 else:
171 return tkinter._join(args)
172
173 def check_create_from_file(self, ext):
174 testfile = support.findfile('python.' + ext, subdir='imghdrdata')
175 image = tkinter.PhotoImage('::img::test', master=self.root,
176 file=testfile)
177 self.assertEqual(str(image), '::img::test')
178 self.assertEqual(image.type(), 'photo')
179 self.assertEqual(image.width(), 16)
180 self.assertEqual(image.height(), 16)
181 self.assertEqual(image['data'], '')
182 self.assertEqual(image['file'], testfile)
183 self.assertIn('::img::test', self.root.image_names())
184 del image
185 support.gc_collect() # For PyPy or other GCs.
186 self.assertNotIn('::img::test', self.root.image_names())
187
188 def check_create_from_data(self, ext):
189 testfile = support.findfile('python.' + ext, subdir='imghdrdata')
190 with open(testfile, 'rb') as f:
191 data = f.read()
192 image = tkinter.PhotoImage('::img::test', master=self.root,
193 data=data)
194 self.assertEqual(str(image), '::img::test')
195 self.assertEqual(image.type(), 'photo')
196 self.assertEqual(image.width(), 16)
197 self.assertEqual(image.height(), 16)
198 self.assertEqual(image['data'], data if self.wantobjects
199 else data.decode('latin1'))
200 self.assertEqual(image['file'], '')
201 self.assertIn('::img::test', self.root.image_names())
202 del image
203 support.gc_collect() # For PyPy or other GCs.
204 self.assertNotIn('::img::test', self.root.image_names())
205
206 def test_create_from_ppm_file(self):
207 self.check_create_from_file('ppm')
208
209 def test_create_from_ppm_data(self):
210 self.check_create_from_data('ppm')
211
212 def test_create_from_pgm_file(self):
213 self.check_create_from_file('pgm')
214
215 def test_create_from_pgm_data(self):
216 self.check_create_from_data('pgm')
217
218 def test_create_from_gif_file(self):
219 self.check_create_from_file('gif')
220
221 def test_create_from_gif_data(self):
222 self.check_create_from_data('gif')
223
224 @requires_tk(8, 6)
225 def test_create_from_png_file(self):
226 self.check_create_from_file('png')
227
228 @requires_tk(8, 6)
229 def test_create_from_png_data(self):
230 self.check_create_from_data('png')
231
232 def test_configure_data(self):
233 image = tkinter.PhotoImage('::img::test', master=self.root)
234 self.assertEqual(image['data'], '')
235 with open(self.testfile, 'rb') as f:
236 data = f.read()
237 image.configure(data=data)
238 self.assertEqual(image['data'], data if self.wantobjects
239 else data.decode('latin1'))
240 self.assertEqual(image.width(), 16)
241 self.assertEqual(image.height(), 16)
242
243 def test_configure_format(self):
244 image = tkinter.PhotoImage('::img::test', master=self.root)
245 self.assertEqual(image['format'], '')
246 image.configure(file=self.testfile, format='gif')
247 self.assertEqual(image['format'], ('gif',) if self.wantobjects
248 else 'gif')
249 self.assertEqual(image.width(), 16)
250 self.assertEqual(image.height(), 16)
251
252 def test_configure_file(self):
253 image = tkinter.PhotoImage('::img::test', master=self.root)
254 self.assertEqual(image['file'], '')
255 image.configure(file=self.testfile)
256 self.assertEqual(image['file'], self.testfile)
257 self.assertEqual(image.width(), 16)
258 self.assertEqual(image.height(), 16)
259
260 def test_configure_gamma(self):
261 image = tkinter.PhotoImage('::img::test', master=self.root)
262 self.assertEqual(image['gamma'], '1.0')
263 image.configure(gamma=2.0)
264 self.assertEqual(image['gamma'], '2.0')
265
266 def test_configure_width_height(self):
267 image = tkinter.PhotoImage('::img::test', master=self.root)
268 self.assertEqual(image['width'], '0')
269 self.assertEqual(image['height'], '0')
270 image.configure(width=20)
271 image.configure(height=10)
272 self.assertEqual(image['width'], '20')
273 self.assertEqual(image['height'], '10')
274 self.assertEqual(image.width(), 20)
275 self.assertEqual(image.height(), 10)
276
277 def test_configure_palette(self):
278 image = tkinter.PhotoImage('::img::test', master=self.root)
279 self.assertEqual(image['palette'], '')
280 image.configure(palette=256)
281 self.assertEqual(image['palette'], '256')
282 image.configure(palette='3/4/2')
283 self.assertEqual(image['palette'], '3/4/2')
284
285 def test_bug_100814(self):
286 # gh-100814: Passing a callable option value causes AttributeError.
287 with self.assertRaises(tkinter.TclError):
288 tkinter.PhotoImage('::img::test', master=self.root, spam=print)
289 image = tkinter.PhotoImage('::img::test', master=self.root)
290 with self.assertRaises(tkinter.TclError):
291 image.configure(spam=print)
292
293 def test_blank(self):
294 image = self.create()
295 image.blank()
296 self.assertEqual(image.width(), 16)
297 self.assertEqual(image.height(), 16)
298 self.assertEqual(image.get(4, 6), self.colorlist(0, 0, 0))
299
300 def test_copy(self):
301 image = self.create()
302 image2 = image.copy()
303 self.assertEqual(image2.width(), 16)
304 self.assertEqual(image2.height(), 16)
305 self.assertEqual(image.get(4, 6), image.get(4, 6))
306
307 def test_subsample(self):
308 image = self.create()
309 image2 = image.subsample(2, 3)
310 self.assertEqual(image2.width(), 8)
311 self.assertEqual(image2.height(), 6)
312 self.assertEqual(image2.get(2, 2), image.get(4, 6))
313
314 image2 = image.subsample(2)
315 self.assertEqual(image2.width(), 8)
316 self.assertEqual(image2.height(), 8)
317 self.assertEqual(image2.get(2, 3), image.get(4, 6))
318
319 def test_zoom(self):
320 image = self.create()
321 image2 = image.zoom(2, 3)
322 self.assertEqual(image2.width(), 32)
323 self.assertEqual(image2.height(), 48)
324 self.assertEqual(image2.get(8, 18), image.get(4, 6))
325 self.assertEqual(image2.get(9, 20), image.get(4, 6))
326
327 image2 = image.zoom(2)
328 self.assertEqual(image2.width(), 32)
329 self.assertEqual(image2.height(), 32)
330 self.assertEqual(image2.get(8, 12), image.get(4, 6))
331 self.assertEqual(image2.get(9, 13), image.get(4, 6))
332
333 def test_put(self):
334 image = self.create()
335 image.put('{red green} {blue yellow}', to=(4, 6))
336 self.assertEqual(image.get(4, 6), self.colorlist(255, 0, 0))
337 self.assertEqual(image.get(5, 6),
338 self.colorlist(0, 128 if tkinter.TkVersion >= 8.6
339 else 255, 0))
340 self.assertEqual(image.get(4, 7), self.colorlist(0, 0, 255))
341 self.assertEqual(image.get(5, 7), self.colorlist(255, 255, 0))
342
343 image.put((('#f00', '#00ff00'), ('#000000fff', '#ffffffff0000')))
344 self.assertEqual(image.get(0, 0), self.colorlist(255, 0, 0))
345 self.assertEqual(image.get(1, 0), self.colorlist(0, 255, 0))
346 self.assertEqual(image.get(0, 1), self.colorlist(0, 0, 255))
347 self.assertEqual(image.get(1, 1), self.colorlist(255, 255, 0))
348
349 def test_get(self):
350 image = self.create()
351 self.assertEqual(image.get(4, 6), self.colorlist(62, 116, 162))
352 self.assertEqual(image.get(0, 0), self.colorlist(0, 0, 0))
353 self.assertEqual(image.get(15, 15), self.colorlist(0, 0, 0))
354 self.assertRaises(tkinter.TclError, image.get, -1, 0)
355 self.assertRaises(tkinter.TclError, image.get, 0, -1)
356 self.assertRaises(tkinter.TclError, image.get, 16, 15)
357 self.assertRaises(tkinter.TclError, image.get, 15, 16)
358
359 def test_write(self):
360 image = self.create()
361 self.addCleanup(os_helper.unlink, os_helper.TESTFN)
362
363 image.write(os_helper.TESTFN)
364 image2 = tkinter.PhotoImage('::img::test2', master=self.root,
365 format='ppm',
366 file=os_helper.TESTFN)
367 self.assertEqual(str(image2), '::img::test2')
368 self.assertEqual(image2.type(), 'photo')
369 self.assertEqual(image2.width(), 16)
370 self.assertEqual(image2.height(), 16)
371 self.assertEqual(image2.get(0, 0), image.get(0, 0))
372 self.assertEqual(image2.get(15, 8), image.get(15, 8))
373
374 image.write(os_helper.TESTFN, format='gif', from_coords=(4, 6, 6, 9))
375 image3 = tkinter.PhotoImage('::img::test3', master=self.root,
376 format='gif',
377 file=os_helper.TESTFN)
378 self.assertEqual(str(image3), '::img::test3')
379 self.assertEqual(image3.type(), 'photo')
380 self.assertEqual(image3.width(), 2)
381 self.assertEqual(image3.height(), 3)
382 self.assertEqual(image3.get(0, 0), image.get(4, 6))
383 self.assertEqual(image3.get(1, 2), image.get(5, 8))
384
385 def test_transparency(self):
386 image = self.create()
387 self.assertEqual(image.transparency_get(0, 0), True)
388 self.assertEqual(image.transparency_get(4, 6), False)
389 image.transparency_set(4, 6, True)
390 self.assertEqual(image.transparency_get(4, 6), True)
391 image.transparency_set(4, 6, False)
392 self.assertEqual(image.transparency_get(4, 6), False)
393
394
395 if __name__ == "__main__":
396 unittest.main()