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