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
17 """Table TestCase class"""
18
26
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
41
49
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
60
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
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
85
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
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
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
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
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
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
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
157
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
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
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
192 """only tests pprint doesn't raise an exception"""
193 self.table.pprint()
194 str(self.table)
195
196
198 """specific test suite for groupby()"""
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
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
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
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
252 """The Stylesheet test case
253 """
264
266 sys.stdout = self.stdout_backup
267
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
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
296
297
306
307
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
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
334 """Test suite for TableSuite"""
343
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
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
372 """Test suite for DocbookRenderer"""
380
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
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
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
411 """TestCase for table's writer"""
419
421 """make sure write_table() doesn't raise any exception"""
422 self.writer.write_table()
423
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