1 # Copyright 2013 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 import unittest 6 import sys 7 import os 8 from PIL import Image 9 10 import image_tools 11 12 13 def _GenImage(size, color): 14 return Image.new('RGBA', size, color) 15 16 17 def _AllPixelsOfColor(image, color): 18 return not any(px != color for px in image.getdata()) 19 20 21 class ImageToolsTest(unittest.TestCase): 22 23 def setUp(self): 24 self.black25 = _GenImage((25, 25), (0, 0, 0, 255)) 25 self.black50 = _GenImage((50, 50), (0, 0, 0, 255)) 26 self.white25 = _GenImage((25, 25), (255, 255, 255, 255)) 27 self.white50 = _GenImage((50, 50), (255, 255, 255, 255)) 28 29 def testAreTheSameSize(self): 30 self.assertTrue(image_tools._AreTheSameSize([self.black25, self.black25])) 31 self.assertTrue(image_tools._AreTheSameSize([self.white25, self.white25])) 32 self.assertTrue(image_tools._AreTheSameSize([self.black50, self.black50])) 33 self.assertTrue(image_tools._AreTheSameSize([self.white50, self.white50])) 34 self.assertTrue(image_tools._AreTheSameSize([self.black25, self.white25])) 35 self.assertTrue(image_tools._AreTheSameSize([self.black50, self.white50])) 36 37 self.assertFalse(image_tools._AreTheSameSize([self.black50, self.black25])) 38 self.assertFalse(image_tools._AreTheSameSize([self.white50, self.white25])) 39 self.assertFalse(image_tools._AreTheSameSize([self.black25, self.white50])) 40 self.assertFalse(image_tools._AreTheSameSize([self.black50, self.white25])) 41 42 self.assertRaises(Exception, image_tools._AreTheSameSize, []) 43 self.assertRaises(Exception, image_tools._AreTheSameSize, [self.black50]) 44 45 def testGetDifferenceWithMask(self): 46 self.assertTrue(_AllPixelsOfColor(image_tools._GetDifferenceWithMask( 47 self.black25, self.black25)[0], (255, 255, 255, 255))) 48 self.assertTrue(_AllPixelsOfColor(image_tools._GetDifferenceWithMask( 49 self.white25, self.black25)[0], (210, 0, 0, 255))) 50 self.assertTrue(_AllPixelsOfColor(image_tools._GetDifferenceWithMask( 51 self.black25, self.black25, mask=self.black25)[0], 52 (255, 255, 255, 255))) 53 self.assertTrue(_AllPixelsOfColor(image_tools._GetDifferenceWithMask( 54 self.black25, self.black25, mask=self.white25)[0], 55 (225, 225, 225, 255))) 56 self.assertTrue(_AllPixelsOfColor(image_tools._GetDifferenceWithMask( 57 self.black25, self.white25, mask=self.black25)[0], 58 (210, 0, 0, 255))) 59 self.assertTrue(_AllPixelsOfColor(image_tools._GetDifferenceWithMask( 60 self.black25, self.white25, mask=self.white25)[0], 61 (225, 225, 225, 255))) 62 self.assertRaises(Exception, image_tools._GetDifferenceWithMask, 63 self.white25, 64 self.black50) 65 self.assertRaises(Exception, image_tools._GetDifferenceWithMask, 66 self.white25, 67 self.white25, 68 mask=self.black50) 69 70 def testCreateMask(self): 71 m1 = image_tools.CreateMask([self.black25, self.white25]) 72 self.assertTrue(_AllPixelsOfColor(m1, (255, 255, 255, 255))) 73 m2 = image_tools.CreateMask([self.black25, self.black25]) 74 self.assertTrue(_AllPixelsOfColor(m2, (0, 0, 0, 255))) 75 m3 = image_tools.CreateMask([self.white25, self.white25]) 76 self.assertTrue(_AllPixelsOfColor(m3, (0, 0, 0, 255))) 77 78 def testAddMasks(self): 79 m1 = image_tools.CreateMask([self.black25, self.white25]) 80 m2 = image_tools.CreateMask([self.black25, self.black25]) 81 m3 = image_tools.CreateMask([self.black50, self.black50]) 82 self.assertTrue(_AllPixelsOfColor(image_tools.AddMasks([m1]), 83 (255, 255, 255, 255))) 84 self.assertTrue(_AllPixelsOfColor(image_tools.AddMasks([m2]), 85 (0, 0, 0, 255))) 86 self.assertTrue(_AllPixelsOfColor(image_tools.AddMasks([m1, m2]), 87 (255, 255, 255, 255))) 88 self.assertTrue(_AllPixelsOfColor(image_tools.AddMasks([m1, m1]), 89 (255, 255, 255, 255))) 90 self.assertTrue(_AllPixelsOfColor(image_tools.AddMasks([m2, m2]), 91 (0, 0, 0, 255))) 92 self.assertTrue(_AllPixelsOfColor(image_tools.AddMasks([m3]), 93 (0, 0, 0, 255))) 94 self.assertRaises(Exception, image_tools.AddMasks, []) 95 self.assertRaises(Exception, image_tools.AddMasks, [m1, m3]) 96 97 def testTotalDifferentPixels(self): 98 self.assertEquals(image_tools.TotalDifferentPixels(self.white25, 99 self.white25), 100 0) 101 self.assertEquals(image_tools.TotalDifferentPixels(self.black25, 102 self.black25), 103 0) 104 self.assertEquals(image_tools.TotalDifferentPixels(self.white25, 105 self.black25), 106 25*25) 107 self.assertEquals(image_tools.TotalDifferentPixels(self.white25, 108 self.black25, 109 mask=self.white25), 110 0) 111 self.assertEquals(image_tools.TotalDifferentPixels(self.white25, 112 self.white25, 113 mask=self.white25), 114 0) 115 self.assertEquals(image_tools.TotalDifferentPixels(self.white25, 116 self.black25, 117 mask=self.black25), 118 25*25) 119 self.assertEquals(image_tools.TotalDifferentPixels(self.white25, 120 self.white25, 121 mask=self.black25), 122 0) 123 self.assertRaises(Exception, image_tools.TotalDifferentPixels, 124 self.white25, self.white50) 125 self.assertRaises(Exception, image_tools.TotalDifferentPixels, 126 self.white25, self.white25, mask=self.white50) 127 128 def testSameImage(self): 129 self.assertTrue(image_tools.SameImage(self.white25, self.white25)) 130 self.assertFalse(image_tools.SameImage(self.white25, self.black25)) 131 132 self.assertTrue(image_tools.SameImage(self.white25, self.black25, 133 mask=self.white25)) 134 self.assertFalse(image_tools.SameImage(self.white25, self.black25, 135 mask=self.black25)) 136 self.assertTrue(image_tools.SameImage(self.black25, self.black25)) 137 self.assertTrue(image_tools.SameImage(self.black25, self.black25, 138 mask=self.white25)) 139 self.assertTrue(image_tools.SameImage(self.white25, self.white25, 140 mask=self.white25)) 141 self.assertRaises(Exception, image_tools.SameImage, 142 self.white25, self.white50) 143 self.assertRaises(Exception, image_tools.SameImage, 144 self.white25, self.white25, 145 mask=self.white50) 146 147 def testInflateMask(self): 148 cross_image = Image.new('RGBA', (3, 3)) 149 white_image = Image.new('RGBA', (3, 3)) 150 dot_image = Image.new('RGBA', (3, 3)) 151 b = (0, 0, 0, 255) 152 w = (255, 255, 255, 255) 153 dot_image.putdata([b, b, b, 154 b, w, b, 155 b, b, b]) 156 cross_image.putdata([b, w, b, 157 w, w, w, 158 b, w, b]) 159 white_image.putdata([w, w, w, 160 w, w, w, 161 w, w, w]) 162 self.assertEquals(list(image_tools.InflateMask(dot_image, 1).getdata()), 163 list(cross_image.getdata())) 164 self.assertEquals(list(image_tools.InflateMask(dot_image, 0).getdata()), 165 list(dot_image.getdata())) 166 self.assertEquals(list(image_tools.InflateMask(dot_image, 2).getdata()), 167 list(white_image.getdata())) 168 self.assertEquals(list(image_tools.InflateMask(dot_image, 3).getdata()), 169 list(white_image.getdata())) 170 self.assertEquals(list(image_tools.InflateMask(self.black25, 1).getdata()), 171 list(self.black25.getdata())) 172 173 def testPNGEncodeDecode(self): 174 self.assertTrue(_AllPixelsOfColor( 175 image_tools.DecodePNG( 176 image_tools.EncodePNG(self.white25)), (255, 255, 255, 255))) 177 self.assertTrue(_AllPixelsOfColor( 178 image_tools.DecodePNG( 179 image_tools.EncodePNG(self.black25)), (0, 0, 0, 255))) 180 181 182 if __name__ == '__main__': 183 unittest.main() 184