| 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 | |
|---|