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