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
5import unittest
6import sys
7import os
8from PIL import Image
9
10import image_tools
11
12
13def _GenImage(size, color):
14  return Image.new('RGBA', size, color)
15
16
17def _AllPixelsOfColor(image, color):
18  return not any(px != color for px in image.getdata())
19
20
21class 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
182if __name__ == '__main__':
183  unittest.main()
184