[3372] | 1 | import unittest |
---|
| 2 | from unittest import TestSuite, makeSuite, TestCase |
---|
| 3 | from itertools import izip |
---|
[3404] | 4 | from PIL import ImageDraw |
---|
[3372] | 5 | |
---|
| 6 | from 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 | |
---|
[3404] | 50 | def createTreemap(cls=Treemap): |
---|
[3372] | 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 | |
---|
| 59 | def getCoordinates(treemap, nominal): |
---|
| 60 | for i,x in enumerate(treemap): |
---|
| 61 | for coord in zip(x.coordinates, nominal[i]): |
---|
| 62 | yield coord |
---|
| 63 | |
---|
| 64 | |
---|
| 65 | class 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 | |
---|
| 74 | class 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 | |
---|
| 114 | class 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 | |
---|
| 145 | class 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 | |
---|
| 183 | class 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 | |
---|
[3404] | 233 | class TestTreemapImage(unittest.TestCase): |
---|
[3372] | 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 | |
---|
[3404] | 277 | # def checkImage(self): |
---|
| 278 | # return len([x for x in self.treemap.image.tostring().split('\xff') |
---|
| 279 | # if x != '']) |
---|
[3372] | 280 | |
---|
| 281 | def test_writeText(self): |
---|
[3404] | 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 | |
---|
[3372] | 288 | image = ImageDraw.Draw(self.treemap.image) |
---|
[3404] | 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)) |
---|
[3372] | 296 | |
---|
[3404] | 297 | |
---|
[3372] | 298 | def 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)) |
---|
[3404] | 304 | test_suite.addTest(makeSuite(TestTreemapImage)) |
---|
[3372] | 305 | return test_suite |
---|
| 306 | |
---|
| 307 | if __name__ == '__main__': |
---|
| 308 | unittest.main(defaultTest='test_suite') |
---|
| 309 | |
---|
| 310 | # suite = unittest.TestLoader().loadTestsFromTestCase(TestTreemapControl) |
---|
| 311 | # unittest.TextTestRunner(verbosity=2).run(suite) |
---|