source: products/quintagroup.analytics/branches/treemap/quintagroup/analytics/tests/test_treemap.py @ 3404

Last change on this file since 3404 was 3404, checked in by potar, 8 years ago

fixed 'import PIL', pylint

File size: 12.9 KB
Line 
1import unittest
2from unittest import TestSuite, makeSuite, TestCase
3from itertools import izip
4from PIL import ImageDraw
5
6from quintagroup.analytics.browser.treemap import TreemapBTree, Treemap, \
7                                                  TreemapControl, \
8                                                  TreemapHtml, \
9                                                  TreemapImage
10
11#class TestQRectangle(unittest.TestCase):
12#    def setUp(self):
13#        self.rect = QRectangle(100,100,200,200,1000)
14#        self.rect.append(QRectangle(size=10))
15#        self.rect.append(QRectangle(size=20))
16#   
17#    def test_length(self):
18#        """ Testing lengths 'self' object """
19#        self.assertEqual(2, self.rect.length())
20#
21#    def test_coordinates(self):
22#        """ Testing setCoordinates() and getCoordinates """
23#        self.rect.setCoordinates((5,5,10,10))
24#        self.assertEqual((5,5,10,10), self.rect.getCoordinates())
25#
26#    def test_size(self):
27#        """ Testing getSize() and setSize() """
28#        self.rect.setSize(10)
29#        self.assertEqual(10.0, self.rect.getSize())
30#   
31#    def test_getWeight(self):
32#        """ Tests method that returns size of QRectangle objects"""
33#        self.assertEqual(30.0, self.rect.getWeight())
34#   
35#    def test_addItem(self):
36#        """ Tests method that add QRectangle object in QRectangle list """
37#        self.assertEqual(1, self.rect.addItem(QRectangle(size=10)))
38#        self.assertEqual(0, self.rect.addItem(QRectangle(size=0)))
39#
40#    def test_layout(self):
41#        """ Tests method that forms (x1, y1, x2, y2) for rectangles """
42#        self.rect.layout()
43#        isNumber = lambda x: abs(x - round(x, 1)) < 0.1
44#        self.assertEqual((True, True, True, True),
45#                             tuple(imap(isNumber, self.rect[0].getCoordinates())))
46#        self.assertEqual((True, True, True, True),
47#                             tuple(imap(isNumber, self.rect[1].getCoordinates())))
48
49
50def createTreemap(cls=Treemap):
51    """ Method dedicated to create tests instance """
52    treemap = cls(x=0, y=0, w=100,h=100)
53    treemap.addItems([Treemap(size=50, color='#ad3333', title='admin4'),
54                      Treemap(size=30, color='#4af6a0', title='admin2'),
55                      Treemap(size=20, color='#9c1b9c', title='admin3'),
56                      Treemap(size=10, color='#fde5be', title='admin1')])
57    return treemap
58
59def getCoordinates(treemap, nominal):
60     for i,x in enumerate(treemap):
61          for coord in zip(x.coordinates, nominal[i]):
62              yield coord
63   
64
65class StubSizeByPath:
66    @staticmethod
67    def getTreemapInfo():
68        return [{'size': 10, 'id': 'admin1', 'type': 'Image'},
69                {'size': 30, 'id': 'admin2', 'type': 'File'},
70                {'size': 20, 'id': 'admin3', 'type': 'File'},
71                {'size': 50, 'id': 'admin4', 'type': 'Image'}]
72   
73   
74class TestTreemapBTree(unittest.TestCase):
75    """ Class dedicated to test treemap binary tree """
76    def createTreemap(self):
77        """ Method dedicated to create tests instance """
78        treemap = Treemap(size=100)
79        for x in [10, 20, 30,40]: 
80            treemap.append(Treemap(size=x))
81        treemap[3].addItems([Treemap(size=20), Treemap(size=20)])
82        return treemap
83
84    def setUp(self):
85        self.treemap = self.createTreemap()
86        self.btree = TreemapBTree(data=self.treemap)
87
88    def test_getWeight(self):
89        """ Tests method that returns size of objects """
90        self.assertEqual(100, self.btree.getWeight(self.treemap))
91
92    def test_getHalfSize(self):
93        """ Tests method that returns half size of objects"""
94        self.assertEqual(3, self.btree.getHalfSize(self.treemap))
95   
96    def test_addNodes(self):
97        """ Tests method adds treemap objects into TreemapBTree """
98        def getItems(treemap):
99            if not(treemap.left and treemap.right):
100                return [treemap.data.size]
101            res = [treemap.data.size] + getItems(treemap.left) + \
102                    getItems(treemap.right)
103            return res
104
105        self.btree.addNodes(self.treemap) 
106        self.assertEqual([100.0, 60.0, 30.0, 10.0, 20.0, 30.0, 40.0, 20.0, 20.0], getItems(self.btree))
107
108        treemap = Treemap(title='Root')
109        treemap.append(self.treemap) 
110        btree = TreemapBTree(data=treemap)
111        btree.addNodes(treemap) 
112        self.assertEqual(1,len(btree.data))
113
114class TestTreemapControl(unittest.TestCase):
115    """ Class dedicated to test Treemap objects """
116    def setUp(self):
117        self.control = TreemapControl(None, None, Treemap(), StubSizeByPath())
118        self.treemap = createTreemap()
119
120    def test_setFieldColor(self):   
121        """ Method dedicated to test treemap attributes """
122        self.assertEqual([{'color': '#fde5be', 'type': 'Image', 'id': 'admin1', 'size': 10}, 
123                         {'color': '#4af6a0', 'type': 'File', 'id': 'admin2', 'size': 30}, 
124                         {'color': '#9c1b9c', 'type': 'File', 'id': 'admin3', 'size': 20},
125                         {'color': '#ad3333', 'type': 'Image', 'id': 'admin4', 'size': 50}],
126                         self.control.setFieldColor(StubSizeByPath.getTreemapInfo()))   
127
128    def test_sortItems(self):
129        """ Method dedicated to test fields """
130        self.assertEqual([{'type': 'Image', 'id': 'admin4', 'size': 50}, 
131                          {'type': 'File', 'id': 'admin2', 'size': 30}, 
132                          {'type': 'File', 'id': 'admin3', 'size': 20}, 
133                          {'type': 'Image', 'id': 'admin1', 'size': 10}],
134                          self.control.sortItems(StubSizeByPath.getTreemapInfo()))
135
136    def test_createRectangles(self):
137        """ Method dedicated to test treemap rectangles """
138        self.control.createRectangles(StubSizeByPath.getTreemapInfo())
139        self.assertEqual(self.treemap, self.control.treemap)
140
141    def test_setTreemapData(self):
142        self.control.setTreemapData()
143        self.assertEqual(self.treemap, self.control.treemap)
144       
145class TestTreemap(unittest.TestCase):
146    """ Class dedicated to test rectangles """
147    def setUp(self):
148        self.treemap = createTreemap()
149        self.btree = TreemapBTree(data=self.treemap)
150
151    def test_coordinates(self):
152        """ Method dedicated to test rectangle coordinates (set and get)  """
153        self.treemap.coordinates = (1,2,3,4)
154        self.assertEqual((1,2,3,4), self.treemap.coordinates)
155   
156    def test_addItem(self):
157        """ Method dedicated to test treemap object (adding into root treemap) """ 
158        self.treemap.addItem(Treemap(size=0.0, title = 'test'))
159        self.assertNotEqual('test', self.treemap[-1].title)
160
161        self.treemap.addItem(Treemap(size=1, title='test'))
162        self.assertEqual('test', self.treemap[-1].title)
163
164    def test_addItems(self):
165        """ Method dedicated to test treemap objects (adding into root treemap) """ 
166        self.treemap.addItems([Treemap(size=1, title='test1'), 
167                               Treemap(size=2, title='test2')])   
168        self.assertEqual('test2', self.treemap[-1].title)
169        self.assertEqual('test1', self.treemap[-2].title)
170
171    def test_setCoordinates(self):
172        """ Method dedicated to test recursive method """
173        nominal = [(0, 0, 100, 45.45), 
174                   (0, 45.45, 50.0, 54.54),
175                   (50.0, 45.45, 50.0, 36.36),
176                   (50.0, 81.81, 50.0, 18.18)] 
177
178        self.btree.addNodes(self.treemap)
179        self.treemap.setCoordinates(self.btree)
180        for x in getCoordinates(self.treemap, nominal):
181            self.assertAlmostEqual(x[0], x[1], 1) 
182
183class TestTreemapHtml(unittest.TestCase):
184    """ Class dedicated to test Treemap objects """
185    def setUp(self):
186        self.treemap = createTreemap(cls=TreemapHtml)
187        self.btree = TreemapBTree(data=self.treemap)
188        self.btree.addNodes(self.treemap)
189        self.treemap.setTreemapData(self.btree)
190
191    def test_getClasses(self):
192        """ Method dedicated to test html tag (<div>) """
193        self.treemap.setCoordinates(self.btree)
194        self.assertEqual('horizontal prop100',
195                         self.treemap.getClasses(self.btree))
196        self.assertEqual('', self.treemap.getClasses(self.btree.left))
197        self.assertEqual('vertical prop40', 
198                         self.treemap.getClasses(self.btree.right.right))
199
200    def test_writeHtml(self):
201        """ Method dedicated to test html tag (<div>) """
202        self.assertEqual("", self.treemap._writeHtml(self.btree.left)) 
203        self.assertEqual('<div class="" style="background-color:#4af6a0"></div>' + \
204                          '<div class="horizontal prop70" style="background-color:None">' + \
205                          '<div class="" style="background-color:#9c1b9c"></div>' + \
206                          '<div class="" style="background-color:#fde5be"></div></div>',
207                          self.treemap._writeHtml(self.btree.right)) 
208
209
210    def test_createTreemap(self):
211        """ Method dedicated to test html tag (treemap) """
212        self.assertEqual('<div class="horizontal prop50"><div class="" ' +\
213                         'style="background-color:#ad3333"></div>' +\
214                         '<div class="vertical prop50" style="background-color:None">' +\
215                         '<div class="" style="background-color:#4af6a0"></div>' +\
216                         '<div class="horizontal prop70" style="background-color:None">' +
217                         '<div class="" style="background-color:#9c1b9c"></div>' +\
218                         '<div class="" style="background-color:#fde5be"></div>' +\
219                         '</div></div></div>',
220                         self.treemap.createTreemap(self.btree))
221       
222    def test_setTreemapData(self):
223        """ Method dedicated to test coordinates """
224        nominal = [(None, None, 45.45, 100), 
225                   (None, None, 100, 50.0),
226                   (None, None, 66.66, 100),
227                   (None, None, 33.33, 100)] 
228
229        for x in getCoordinates(self.treemap, nominal):
230            if x[0] and x[1]:
231                self.assertAlmostEqual(x[0], x[1], 1) 
232
233class TestTreemapImage(unittest.TestCase):
234    """ Class dedicated to test treemap image """
235    def setUp(self):
236        self.treemap = createTreemap(cls=TreemapImage)
237        self.btree = TreemapBTree(data=self.treemap)
238        self.btree.addNodes(self.treemap)
239        self.treemap.setCoordinates(self.btree)
240
241    def test_drawContainer(self):
242        treemap = self.treemap.drawContainer()
243        self.assertEqual(self.treemap.image.getbbox(), treemap.getbbox())
244        self.assertEqual(('R', 'G', 'B'), treemap.getbands())
245   
246    def test_rgbHexToDecimal(self):
247        self.assertEqual((253, 229, 190),
248                          self.treemap.rgbHexToDecimal('#fde5be'))
249       
250    def test_getHlsPIL(self):
251        self.assertEqual('hsl(10,10%,20%)', 
252                          self.treemap.getHlsPIL(10,10,20))
253
254    def test_getFontSize(self):
255        self.assertEqual(15, self.treemap.getFontSize(self.treemap[0]))
256        self.assertEqual(81, self.treemap.getFontSize(Treemap(w=900,h=700)))
257
258    def test_createFont(self):
259        import PIL
260        font = self.treemap.createFont(15)
261        self.assertEqual(True, isinstance(font, PIL.ImageFont.FreeTypeFont))
262
263    def test_setMask(self):
264        rgb =  self.treemap.image.getpixel((10,10))
265
266        treemap = Treemap(w=1,h=1)
267        self.treemap.setMask(treemap)
268        self.assertEqual(rgb, self.treemap.image.getpixel((10,10)))
269
270        self.treemap.setMask(self.treemap)
271        self.assertNotEqual(rgb, self.treemap.setMask(self.treemap))
272       
273    def test_getPilColor(self):
274        self.assertEqual('hsl(37,144%,56%)', 
275                          self.treemap.getPilColor('#fde5be'))
276       
277#    def checkImage(self):
278#        return len([x for x in self.treemap.image.tostring().split('\xff')
279#                               if x != ''])
280
281    def test_writeText(self):
282        def istitle(self, result, width, height):
283            treemap = TreemapBTree(data=Treemap(w=width, h=height, x=0, y=0, 
284                                                color='#fde5be', title = 'test'))
285            self.treemap.writeText(treemap, image)
286            self.assertEqual(result, self.treemap.writeText(treemap, image)) 
287 
288        image = ImageDraw.Draw(self.treemap.image)
289
290        istitle(self, None, 10, 10)
291        istitle(self, True, 40, 40)
292
293    def test_drawTreemap(self):
294        image = ImageDraw.Draw(self.treemap.image)
295        self.assertEqual(None, self.treemap.drawTreemap(self.btree, image))
296   
297
298def test_suite():
299    test_suite = unittest.TestSuite([])
300    test_suite.addTest(makeSuite(TestTreemapControl))
301    test_suite.addTest(makeSuite(TestTreemapBTree))
302    test_suite.addTest(makeSuite(TestTreemap))
303    test_suite.addTest(makeSuite(TestTreemapHtml))
304    test_suite.addTest(makeSuite(TestTreemapImage))
305    return test_suite
306 
307if __name__ == '__main__':
308    unittest.main(defaultTest='test_suite')
309
310#    suite = unittest.TestLoader().loadTestsFromTestCase(TestTreemapControl)
311#    unittest.TextTestRunner(verbosity=2).run(suite)
Note: See TracBrowser for help on using the repository browser.