Package logilab :: Package common :: Package test :: Module unittest_table
[frames] | no frames]

Source Code for Module logilab.common.test.unittest_table

  1  """ 
  2  Unittests for table management 
  3  """ 
  4   
  5  __revision__ = '$Id: unittest_table.py,v 1.13 2006-04-09 22:30:53 nico Exp $' 
  6   
  7  import sys 
  8  import os 
  9  from cStringIO import StringIO 
 10   
 11  from logilab.common.testlib import TestCase, unittest_main 
 12  from logilab.common.table import Table, TableStyleSheet, DocbookTableWriter, \ 
 13       DocbookRenderer, TableStyle, TableWriter, TableCellRenderer 
 14  from logilab.common.compat import set 
 15   
16 -class TableTC(TestCase):
17 """Table TestCase class""" 18
19 - def setUp(self):
20 """Creates a default table""" 21 # from logilab.common import table 22 # reload(table) 23 self.table = Table() 24 self.table.create_rows(['row1', 'row2', 'row3']) 25 self.table.create_columns(['col1', 'col2'])
26
27 - def test_valeur_scalaire(self):
28 tab = Table() 29 tab.create_columns(['col1']) 30 tab.append_row([1]) 31 self.assertEquals(tab, [[1]]) 32 tab.append_row([2]) 33 self.assertEquals(tab[0,0], 1) 34 self.assertEquals(tab[1,0], 2)
35
36 - def test_valeur_ligne(self):
37 tab = Table() 38 tab.create_columns(['col1','col2']) 39 tab.append_row([1,2]) 40 self.assertEquals(tab, [[1,2]])
41
42 - def test_valeur_colonne(self):
43 tab = Table() 44 tab.create_columns(['col1']) 45 tab.append_row([1]) 46 tab.append_row([2]) 47 self.assertEquals(tab, [[1],[2]]) 48 self.assertEquals(tab[:,0], [1,2])
49
50 - def test_indexation(self):
51 """we should be able to use [] to access rows""" 52 self.assert_(self.table[0] == self.table.data[0]) 53 self.assert_(self.table[1] == self.table.data[1])
54
55 - def test_iterable(self):
56 """test iter(table)""" 57 it = iter(self.table) 58 self.assert_(it.next() == self.table.data[0]) 59 self.assert_(it.next() == self.table.data[1])
60
61 - def test_get_rows(self):
62 """tests Table.get_rows()""" 63 self.assertEquals(self.table, [[0, 0], [0, 0], [0, 0]]) 64 self.assertEquals(self.table[:], [[0, 0], [0, 0], [0, 0]]) 65 self.table.insert_column(1, range(3), 'supp') 66 self.assertEquals(self.table, [[0, 0, 0], [0, 1, 0], [0, 2, 0]]) 67 self.assertEquals(self.table[:], [[0, 0, 0], [0, 1, 0], [0, 2, 0]])
68
69 - def test_get_cells(self):
70 self.table.insert_column(1, range(3), 'supp') 71 self.assertEquals(self.table[0,1], 0) 72 self.assertEquals(self.table[1,1], 1) 73 self.assertEquals(self.table[2,1], 2) 74 self.assertEquals(self.table['row1', 'supp'], 0) 75 self.assertEquals(self.table['row2', 'supp'], 1) 76 self.assertEquals(self.table['row3', 'supp'], 2) 77 self.assertRaises(KeyError, self.table.__getitem__, ('row1', 'foo')) 78 self.assertRaises(KeyError, self.table.__getitem__, ('foo', 'bar'))
79
80 - def test_shape(self):
81 """tests table shape""" 82 self.assertEquals(self.table.shape, (3, 2)) 83 self.table.insert_column(1, range(3), 'supp') 84 self.assertEquals(self.table.shape, (3, 3))
85
86 - def test_set_column(self):
87 """Tests that table.set_column() works fine. 88 """ 89 self.table.set_column(0, range(3)) 90 self.assertEquals(self.table[0,0], 0) 91 self.assertEquals(self.table[1,0], 1) 92 self.assertEquals(self.table[2,0], 2)
93
94 - def test_set_column_by_id(self):
95 """Tests that table.set_column_by_id() works fine. 96 """ 97 self.table.set_column_by_id('col1', range(3)) 98 self.assertEquals(self.table[0,0], 0) 99 self.assertEquals(self.table[1,0], 1) 100 self.assertEquals(self.table[2,0], 2) 101 self.assertRaises(KeyError, self.table.set_column_by_id, 'col123', range(3))
102
103 - def test_cells_ids(self):
104 """tests that we can access cells by giving row/col ids""" 105 self.assertRaises(KeyError, self.table.set_cell_by_ids, 'row12', 'col1', 12) 106 self.assertRaises(KeyError, self.table.set_cell_by_ids, 'row1', 'col12', 12) 107 self.assertEquals(self.table[0,0], 0) 108 self.table.set_cell_by_ids('row1', 'col1', 'DATA') 109 self.assertEquals(self.table[0,0], 'DATA') 110 self.assertRaises(KeyError, self.table.set_row_by_id, 'row12', []) 111 self.table.set_row_by_id('row1', ['1.0', '1.1']) 112 self.assertEquals(self.table[0,0], '1.0')
113
114 - def test_insert_row(self):
115 """tests a row insertion""" 116 tmp_data = ['tmp1', 'tmp2'] 117 self.table.insert_row(1, tmp_data, 'tmprow') 118 self.assertEquals(self.table[1], tmp_data) 119 self.assertEquals(self.table['tmprow'], tmp_data) 120 self.table.delete_row_by_id('tmprow') 121 self.assertRaises(KeyError, self.table.delete_row_by_id, 'tmprow') 122 self.assertEquals(self.table[1], [0, 0]) 123 self.assertRaises(KeyError, self.table.__getitem__, 'tmprow')
124
125 - def test_get_column(self):
126 """Tests that table.get_column() works fine. 127 """ 128 self.table.set_cell(0, 1, 12) 129 self.table.set_cell(2, 1, 13) 130 self.assertEquals(self.table[:,1], [12,0,13]) 131 self.assertEquals(self.table[:,'col2'], [12,0,13])
132
133 - def test_get_columns(self):
134 """Tests if table.get_columns() works fine. 135 """ 136 self.table.set_cell(0, 1, 12) 137 self.table.set_cell(2, 1, 13) 138 self.assertEquals(self.table.get_columns(), [[0,0,0], [12,0,13]])
139
140 - def test_insert_column(self):
141 """Tests that table.insert_column() works fine. 142 """ 143 self.table.insert_column(1, range(3), "inserted_column") 144 self.assertEquals(self.table[:,1], [0,1,2]) 145 self.assertEquals(self.table.col_names, 146 ['col1', 'inserted_column', 'col2'])
147
148 - def test_delete_column(self):
149 """Tests that table.delete_column() works fine. 150 """ 151 self.table.delete_column(1) 152 self.assertEquals(self.table.col_names, ['col1']) 153 self.assertEquals(self.table[:,0], [0,0,0]) 154 self.assertRaises(KeyError, self.table.delete_column_by_id, 'col2') 155 self.table.delete_column_by_id('col1') 156 self.assertEquals(self.table.col_names, [])
157
158 - def test_transpose(self):
159 """Tests that table.transpose() works fine. 160 """ 161 self.table.append_column(range(5,8), 'col3') 162 ttable = self.table.transpose() 163 self.assertEquals(ttable.row_names, ['col1', 'col2', 'col3']) 164 self.assertEquals(ttable.col_names, ['row1', 'row2', 'row3']) 165 self.assertEquals(ttable.data, [[0,0,0], [0,0,0], [5,6,7]])
166
167 - def test_sort_table(self):
168 """Tests the table sort by column 169 """ 170 self.table.set_column(0, [3, 1, 2]) 171 self.table.set_column(1, [1, 2, 3]) 172 self.table.sort_by_column_index(0) 173 self.assertEquals(self.table.row_names, ['row2', 'row3', 'row1']) 174 self.assertEquals(self.table.data, [[1, 2], [2, 3], [3, 1]]) 175 self.table.sort_by_column_index(1, 'desc') 176 self.assertEquals(self.table.row_names, ['row3', 'row2', 'row1']) 177 self.assertEquals(self.table.data, [[2, 3], [1, 2], [3, 1]])
178
179 - def test_sort_by_id(self):
180 """tests sort_by_column_id()""" 181 self.table.set_column_by_id('col1', [3, 1, 2]) 182 self.table.set_column_by_id('col2', [1, 2, 3]) 183 self.table.sort_by_column_id('col1') 184 self.assertRaises(KeyError, self.table.sort_by_column_id, 'col123') 185 self.assertEquals(self.table.row_names, ['row2', 'row3', 'row1']) 186 self.assertEquals(self.table.data, [[1, 2], [2, 3], [3, 1]]) 187 self.table.sort_by_column_id('col2', 'desc') 188 self.assertEquals(self.table.row_names, ['row3', 'row2', 'row1']) 189 self.assertEquals(self.table.data, [[2, 3], [1, 2], [3, 1]])
190
191 - def test_pprint(self):
192 """only tests pprint doesn't raise an exception""" 193 self.table.pprint() 194 str(self.table)
195 196
197 -class GroupByTC(TestCase):
198 """specific test suite for groupby()"""
199 - def setUp(self):
200 t = Table() 201 t.create_columns(['date', 'res', 'task', 'usage']) 202 t.append_row(['date1', 'ing1', 'task1', 0.3]) 203 t.append_row(['date1', 'ing2', 'task2', 0.3]) 204 t.append_row(['date2', 'ing3', 'task3', 0.3]) 205 t.append_row(['date3', 'ing4', 'task2', 0.3]) 206 t.append_row(['date1', 'ing1', 'task3', 0.3]) 207 t.append_row(['date3', 'ing1', 'task3', 0.3]) 208 self.table = t
209
210 - def test_single_groupby(self):
211 """tests groupby() on several columns""" 212 grouped = self.table.groupby('date') 213 self.assertEquals(len(grouped), 3) 214 self.assertEquals(len(grouped['date1']), 3) 215 self.assertEquals(len(grouped['date2']), 1) 216 self.assertEquals(len(grouped['date3']), 2) 217 self.assertEquals(grouped['date1'], [ 218 ('date1', 'ing1', 'task1', 0.3), 219 ('date1', 'ing2', 'task2', 0.3), 220 ('date1', 'ing1', 'task3', 0.3), 221 ]) 222 self.assertEquals(grouped['date2'], [('date2', 'ing3', 'task3', 0.3)]) 223 self.assertEquals(grouped['date3'], [ 224 ('date3', 'ing4', 'task2', 0.3), 225 ('date3', 'ing1', 'task3', 0.3), 226 ])
227
228 - def test_multiple_groupby(self):
229 """tests groupby() on several columns""" 230 grouped = self.table.groupby('date', 'task') 231 self.assertEquals(len(grouped), 3) 232 self.assertEquals(len(grouped['date1']), 3) 233 self.assertEquals(len(grouped['date2']), 1) 234 self.assertEquals(len(grouped['date3']), 2) 235 self.assertEquals(grouped['date1']['task1'], [('date1', 'ing1', 'task1', 0.3)]) 236 self.assertEquals(grouped['date2']['task3'], [('date2', 'ing3', 'task3', 0.3)]) 237 self.assertEquals(grouped['date3']['task2'], [('date3', 'ing4', 'task2', 0.3)]) 238 date3 = grouped['date3'] 239 self.assertRaises(KeyError, date3.__getitem__, 'task1')
240 241
242 - def test_select(self):
243 """tests Table.select() method""" 244 rows = self.table.select('date', 'date1') 245 self.assertEquals(rows, [ 246 ('date1', 'ing1', 'task1', 0.3), 247 ('date1', 'ing2', 'task2', 0.3), 248 ('date1', 'ing1', 'task3', 0.3), 249 ])
250
251 -class TableStyleSheetTC(TestCase):
252 """The Stylesheet test case 253 """
254 - def setUp(self):
255 """Builds a simple table to test the stylesheet 256 """ 257 self.table = Table() 258 self.table.create_row('row1') 259 self.table.create_columns(['a','b','c']) 260 self.stylesheet = TableStyleSheet() 261 # We don't want anything to be printed 262 self.stdout_backup = sys.stdout 263 sys.stdout = StringIO()
264
265 - def tearDown(self):
266 sys.stdout = self.stdout_backup
267
268 - def test_add_rule(self):
269 """Tests that the regex pattern works as expected. 270 """ 271 rule = '0_2 = sqrt(0_0**2 + 0_1**2)' 272 self.stylesheet.add_rule(rule) 273 self.table.set_row(0, [3,4,0]) 274 self.table.apply_stylesheet(self.stylesheet) 275 self.assertEquals(self.table[0], [3,4,5]) 276 self.assertEquals(len(self.stylesheet.rules), 1) 277 self.stylesheet.add_rule('some bad rule with bad syntax') 278 self.assertEquals(len(self.stylesheet.rules), 1, "Ill-formed rule mustn't be added") 279 self.assertEquals(len(self.stylesheet.instructions), 1, "Ill-formed rule mustn't be added")
280
281 - def test_stylesheet_init(self):
282 """tests Stylesheet.__init__""" 283 rule = '0_2 = 1' 284 sheet = TableStyleSheet([rule, 'bad rule']) 285 self.assertEquals(len(sheet.rules), 1, "Ill-formed rule mustn't be added") 286 self.assertEquals(len(sheet.instructions), 1, "Ill-formed rule mustn't be added")
287
288 - def test_rowavg_rule(self):
289 """Tests that add_rowavg_rule works as expected 290 """ 291 self.table.set_row(0, [10,20,0]) 292 self.stylesheet.add_rowavg_rule((0,2), 0, 0, 1) 293 self.table.apply_stylesheet(self.stylesheet) 294 val = self.table[0,2] 295 self.assert_(int(val) == 15)
296 297
298 - def test_rowsum_rule(self):
299 """Tests that add_rowsum_rule works as expected 300 """ 301 self.table.set_row(0, [10,20,0]) 302 self.stylesheet.add_rowsum_rule((0,2), 0, 0, 1) 303 self.table.apply_stylesheet(self.stylesheet) 304 val = self.table[0,2] 305 self.assert_(val == 30)
306 307
308 - def test_colavg_rule(self):
309 """Tests that add_colavg_rule works as expected 310 """ 311 self.table.set_row(0, [10,20,0]) 312 self.table.append_row([12,8,3], 'row2') 313 self.table.create_row('row3') 314 self.stylesheet.add_colavg_rule((2,0), 0, 0, 1) 315 self.table.apply_stylesheet(self.stylesheet) 316 val = self.table[2,0] 317 self.assert_(int(val) == 11)
318 319
320 - def test_colsum_rule(self):
321 """Tests that add_colsum_rule works as expected 322 """ 323 self.table.set_row(0, [10,20,0]) 324 self.table.append_row([12,8,3], 'row2') 325 self.table.create_row('row3') 326 self.stylesheet.add_colsum_rule((2,0), 0, 0, 1) 327 self.table.apply_stylesheet(self.stylesheet) 328 val = self.table[2,0] 329 self.assert_(val == 22)
330 331 332
333 -class TableStyleTC(TestCase):
334 """Test suite for TableSuite"""
335 - def setUp(self):
336 self.table = Table() 337 self.table.create_rows(['row1', 'row2', 'row3']) 338 self.table.create_columns(['col1', 'col2']) 339 self.style = TableStyle(self.table) 340 self._tested_attrs = (('size', '1*'), 341 ('alignment', 'right'), 342 ('unit', ''))
343
344 - def test_getset(self):
345 """tests style's get and set methods""" 346 for attrname, default_value in self._tested_attrs: 347 getter = getattr(self.style, 'get_%s' % attrname) 348 setter = getattr(self.style, 'set_%s' % attrname) 349 self.assertRaises(KeyError, getter, 'badcol') 350 self.assertEquals(getter('col1'), default_value) 351 setter('FOO', 'col1') 352 self.assertEquals(getter('col1'), 'FOO')
353
354 - def test_getset_index(self):
355 """tests style's get and set by index methods""" 356 for attrname, default_value in self._tested_attrs: 357 getter = getattr(self.style, 'get_%s' % attrname) 358 setter = getattr(self.style, 'set_%s' % attrname) 359 igetter = getattr(self.style, 'get_%s_by_index' % attrname) 360 isetter = getattr(self.style, 'set_%s_by_index' % attrname) 361 self.assertEquals(getter('__row_column__'), default_value) 362 isetter('FOO', 0) 363 self.assertEquals(getter('__row_column__'), 'FOO') 364 self.assertEquals(igetter(0), 'FOO') 365 self.assertEquals(getter('col1'), default_value) 366 isetter('FOO', 1) 367 self.assertEquals(getter('col1'), 'FOO') 368 self.assertEquals(igetter(1), 'FOO')
369 370
371 -class RendererTC(TestCase):
372 """Test suite for DocbookRenderer"""
373 - def setUp(self):
374 self.renderer = DocbookRenderer(alignment = True) 375 self.table = Table() 376 self.table.create_rows(['row1', 'row2', 'row3']) 377 self.table.create_columns(['col1', 'col2']) 378 self.style = TableStyle(self.table) 379 self.base_renderer = TableCellRenderer()
380
381 - def test_cell_content(self):
382 """test how alignment is rendered""" 383 entry_xml = self.renderer._render_cell_content('data', self.style, 1) 384 self.assertEquals(entry_xml, "<entry align='right'>data</entry>\n") 385 self.style.set_alignment_by_index('left', 1) 386 entry_xml = self.renderer._render_cell_content('data', self.style, 1) 387 self.assertEquals(entry_xml, "<entry align='left'>data</entry>\n")
388
390 """tests that default rendering just prints the cell's content""" 391 rendered_cell = self.base_renderer._render_cell_content('data', self.style, 1) 392 self.assertEquals(rendered_cell, "data")
393
394 - def test_replacement_char(self):
395 """tests that 0 is replaced when asked for""" 396 cell_content = self.base_renderer._make_cell_content(0, self.style, 1) 397 self.assertEquals(cell_content, 0) 398 self.base_renderer.properties['skip_zero'] = '---' 399 cell_content = self.base_renderer._make_cell_content(0, self.style, 1) 400 self.assertEquals(cell_content, '---')
401
402 - def test_unit(self):
403 """tests if units are added""" 404 self.base_renderer.properties['units'] = True 405 self.style.set_unit_by_index('EUR', 1) 406 cell_content = self.base_renderer._make_cell_content(12, self.style, 1) 407 self.assertEquals(cell_content, '12 EUR')
408 409
410 -class DocbookTableWriterTC(TestCase):
411 """TestCase for table's writer"""
412 - def setUp(self):
413 self.stream = StringIO() 414 self.table = Table() 415 self.table.create_rows(['row1', 'row2', 'row3']) 416 self.table.create_columns(['col1', 'col2']) 417 self.writer = DocbookTableWriter(self.stream, self.table, None) 418 self.writer.set_renderer(DocbookRenderer())
419
420 - def test_write_table(self):
421 """make sure write_table() doesn't raise any exception""" 422 self.writer.write_table()
423
424 - def test_abstract_writer(self):
425 """tests that Abstract Writers can't be used !""" 426 writer = TableWriter(self.stream, self.table, None) 427 self.assertRaises(NotImplementedError, writer.write_table)
428 429 430 if __name__ == '__main__': 431 unittest_main() 432