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()