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

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

Added new branch

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