/[thuban]/branches/WIP-pyshapelib-bramz/test/test_transientdb.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/test/test_transientdb.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 998 - (hide annotations)
Thu May 22 19:29:39 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/test/test_transientdb.py
File MIME type: text/x-python
File size: 11934 byte(s)
Give the tables titles so that the GUI can display more meaningful
names. For now the titles are fixed but depend on e.g. filenames
or the titles of the joined tables.

* Thuban/Model/transientdb.py (TransientTable.Title)
(TransientJoinedTable.Title, AutoTransientTable.Title): New.

* Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.

* test/test_transientdb.py
(TestTransientTable.test_auto_transient_table_title): New. Test
for the Title method
(TestTransientTable.test_transient_joined_table)
(TestTransientTable.test_transient_table): Add test for the Title
methods

* test/test_memory_table.py (TestMemoryTable.test_title): New.
Test for the Title method

* test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
the Title method

1 bh 765 # Copyright (c) 2002, 2003 by Intevation GmbH
2     # Authors:
3     # Bernhard Herzog <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8     """
9     Test the Transient DB classes
10     """
11    
12     __version__ = "$Revision$"
13     # $Source$
14     # $Id$
15    
16     import os
17     import unittest
18    
19     import support
20     support.initthuban()
21    
22 jan 805 from Thuban.Model.table import DBFTable, MemoryTable, FIELDTYPE_STRING, \
23 bh 839 FIELDTYPE_INT, FIELDTYPE_DOUBLE
24 bh 765 from Thuban.Model.transientdb import TransientDatabase, TransientTable, \
25     TransientJoinedTable, AutoTransientTable
26    
27    
28     class TestTransientTable(unittest.TestCase, support.FileTestMixin):
29    
30     def setUp(self):
31     """Create a transient database as self.transientdb"""
32     filename = self.temp_file_name("transient_table.sqlite")
33     if os.path.exists(filename):
34     os.remove(filename)
35     journal = filename + "-journal"
36     if os.path.exists(journal):
37     print "removing journal", journal
38     os.remove(journal)
39     self.transientdb = TransientDatabase(filename)
40    
41     def tearDown(self):
42     self.transientdb.close()
43    
44     def run_iceland_political_tests(self, table):
45     """Run some tests on tablte
46    
47     Assume that table holds the data of the file
48     ../Data/iceland/political.dbf sample file.
49     """
50 bh 818 self.assertEquals(table.NumRows(), 156)
51     self.assertEquals(table.NumColumns(), 8)
52 bh 765
53     # Check one each of the possible field types. The width and
54     # decimal precision is always 0.
55 bh 818 columns = table.Columns()
56     self.assertEquals(columns[0].name, 'AREA')
57 bh 839 self.assertEquals(columns[0].type, FIELDTYPE_DOUBLE)
58 bh 818 self.assertEquals(columns[3].name, 'PONET_ID')
59 bh 839 self.assertEquals(columns[3].type, FIELDTYPE_INT)
60 bh 818 self.assertEquals(columns[6].name, 'POPYCOUN')
61 bh 839 self.assertEquals(columns[6].type, FIELDTYPE_STRING)
62 bh 765
63 bh 839 # HasColumn
64     self.failUnless(table.HasColumn("AREA"))
65     self.failUnless(table.HasColumn(1))
66     # HasColumn for non-exisiting columns
67     self.failIf(table.HasColumn("non_existing_name"))
68     self.failIf(table.HasColumn(100))
69    
70 bh 849 # Reading rows and values.
71 bh 818 self.assertEquals(table.ReadRowAsDict(144),
72 bh 765 {'POPYCOUN': 'IC', 'POPYADMIN': '', 'PONET_': 146,
73     'AREA': 19.462,
74     'POPYTYPE': 1, 'PERIMETER': 88.518000000000001,
75     'POPYREG': '1',
76     'PONET_ID': 145})
77 bh 849 self.assertEquals(table.ReadValue(144, "AREA"), 19.462)
78     self.assertEquals(table.ReadValue(144, 3), 145)
79 bh 765
80 bh 839 # ValueRange may induce a copy to the transient database.
81 bh 765 # Therefore we put it last so that we can execute this method
82     # twice to check whether the other methods still work after the
83     # copy
84 bh 818 self.assertEquals(table.ValueRange("AREA"), (0.0, 19.462))
85 bh 765
86 bh 818 unique = table.UniqueValues("PONET_ID")
87 bh 765 unique.sort()
88     self.assertEquals(unique, range(1, 157))
89    
90     def test_transient_table(self):
91     """Test TransientTable(dbftable)
92    
93     The TransientTable should copy the data to the
94     TransientDatabase.
95     """
96     orig_table = DBFTable(os.path.join("..", "Data", "iceland",
97     "political.dbf"))
98     table = TransientTable(self.transientdb, orig_table)
99     self.run_iceland_political_tests(table)
100    
101     # The transient_table method should return the table itself
102     self.assert_(table is table.transient_table())
103    
104 bh 998 # The title is simply copied over from the original table
105     self.assertEquals(table.Title(), orig_table.Title())
106    
107 bh 984 # The TransientTable class itself doesn't implement the
108     # Dependencies method, so we don't test it.
109 bh 765
110 bh 984
111 bh 765 def test_auto_transient_table(self):
112     """Test AutoTransientTable(dbftable)
113    
114     The AutoTransientTable should copy the data to the
115     TransientDatabase on demand.
116     """
117     orig_table = DBFTable(os.path.join("..", "Data", "iceland",
118     "political.dbf"))
119     table = AutoTransientTable(self.transientdb, orig_table)
120    
121     # Run the tests twice so that we execute them once when the data
122     # has not been copied to the transient db yet and once when it
123     # has. This assumes that run_iceland_political_tests does at
124     # least one call to a method that copies to the transient db at
125     # its end.
126     self.run_iceland_political_tests(table)
127     self.run_iceland_political_tests(table)
128    
129 bh 845 def test_auto_transient_table_query(self):
130     """Test AutoTransientTable.SimpleQuery()"""
131     orig_table = DBFTable(os.path.join("..", "Data", "iceland",
132     "political.dbf"))
133     table = AutoTransientTable(self.transientdb, orig_table)
134 jonathan 948 # Only a simple test here. The AutoTransientTable simply
135 bh 845 # delegates to its transient table so it should be OK that the
136     # real test for it is in test_transient_table_query. However,
137     # it's important to check that the column handling works
138     # correctly because the AutoTransientTable and it's underlying
139     # transient table use different column object types.
140     self.assertEquals(table.SimpleQuery(table.Column("AREA"), ">", 10.0),
141     [144])
142 bh 765
143 jonathan 948 # test using a Column object as the right parameter
144 bh 984 self.assertEquals(table.SimpleQuery(table.Column("POPYTYPE"),
145 jonathan 948 "==",
146     table.Column("POPYREG")),
147     range(156))
148    
149 bh 984 def test_auto_transient_table_dependencies(self):
150     """Test AutoTransientTable.Dependencies()"""
151     orig_table = DBFTable(os.path.join("..", "Data", "iceland",
152     "political.dbf"))
153     table = AutoTransientTable(self.transientdb, orig_table)
154     self.assertEquals(table.Dependencies(), (orig_table,))
155    
156 bh 998 def test_auto_transient_table_title(self):
157     """Test AutoTransientTable.Title()"""
158     orig_table = DBFTable(os.path.join("..", "Data", "iceland",
159     "political.dbf"))
160     table = AutoTransientTable(self.transientdb, orig_table)
161     # The title is of course the same as that of the original table
162     self.assertEquals(table.Title(), orig_table.Title())
163    
164 bh 765 def test_transient_joined_table(self):
165     """Test TransientJoinedTable"""
166 jan 805 simple = MemoryTable([("type", FIELDTYPE_STRING),
167 bh 765 ("code", FIELDTYPE_INT)],
168     [("OTHER/UNKNOWN", 0),
169     ("RUINS", 1),
170     ("FARM", 2),
171     ("BUILDING", 3),
172     ("HUT", 4),
173     ("LIGHTHOUSE", 5)])
174     auto = AutoTransientTable(self.transientdb, simple)
175     filename = os.path.join("..", "Data", "iceland",
176     "cultural_landmark-point.dbf")
177     landmarks = AutoTransientTable(self.transientdb, DBFTable(filename))
178    
179     table = TransientJoinedTable(self.transientdb, landmarks, "CLPTLABEL",
180     auto, "type")
181    
182 bh 818 self.assertEquals(table.NumRows(), 34)
183     self.assertEquals(table.NumColumns(), 8)
184 bh 839 self.assertEquals(table.Column(0).type, FIELDTYPE_DOUBLE)
185     self.assertEquals(table.Column(0).name, 'AREA')
186     self.assertEquals(table.Column(7).type, FIELDTYPE_INT)
187     self.assertEquals(table.Column(7).name, 'code')
188     self.assertEquals(table.Column(4).type, FIELDTYPE_STRING)
189     self.assertEquals(table.Column(4).name, 'CLPTLABEL')
190     # HasColumn
191     self.failUnless(table.HasColumn("AREA"))
192     self.failUnless(table.HasColumn(1))
193     # HasColumn for non-exisiting columns
194     self.failIf(table.HasColumn("non_existing_name"))
195     self.failIf(table.HasColumn(100))
196 bh 765
197 bh 849 # Reading rows and values
198 bh 839 self.assertEquals(table.ReadRowAsDict(22),
199 bh 765 {'PERIMETER': 0.0, 'CLPOINT_': 23,
200     'AREA': 0.0, 'CLPTLABEL': 'RUINS',
201     'CLPOINT_ID': 38, 'CLPTFLAG': 0,
202     'code': 1, 'type': 'RUINS'})
203 bh 849 self.assertEquals(table.ReadValue(22, "type"), 'RUINS')
204     self.assertEquals(table.ReadValue(22, 7), 1)
205 bh 765
206     # The transient_table method should return the table itself
207     self.assert_(table is table.transient_table())
208    
209 bh 984 # The TransientJoinedTable depends on both input tables
210     self.assertEquals(table.Dependencies(), (landmarks, auto))
211 bh 765
212 bh 998 # The title is constructed from the titles of the input tables.
213     self.assertEquals(table.Title(),
214     "Join of %s and %s" % (landmarks.Title(),
215     auto.Title()))
216 bh 984
217 bh 998
218 bh 785 def test_transient_table_read_twice(self):
219 bh 842 """Test TransientTable.ReadRowAsDict() reading the same record twice"""
220 jan 805 simple = MemoryTable([("type", FIELDTYPE_STRING),
221 bh 785 ("code", FIELDTYPE_INT)],
222     [("OTHER/UNKNOWN", 0),
223     ("RUINS", 1),
224     ("FARM", 2),
225     ("BUILDING", 3),
226     ("HUT", 4),
227     ("LIGHTHOUSE", 5)])
228     table = TransientTable(self.transientdb, simple)
229 bh 765
230 bh 785 # There was a bug where reading the same record twice would
231     # raise an exception in the second call because of an
232     # unitialized local variable, so for passing the test it's
233     # enough if reading simply succeeds. OTOH, while we're at it we
234     # might as well check whether the results are equal anyway :)
235 bh 839 result1 = table.ReadRowAsDict(3)
236     result2 = table.ReadRowAsDict(3)
237 bh 785 self.assertEquals(result1, result2)
238    
239 bh 818
240 bh 842 def test_transient_table_query(self):
241     """Test TransientTable.SimpleQuery()"""
242     simple = MemoryTable([("type", FIELDTYPE_STRING),
243     ("value", FIELDTYPE_DOUBLE),
244     ("code", FIELDTYPE_INT)],
245     [("OTHER/UNKNOWN", -1.5, 11),
246     ("RUINS", 0.0, 1),
247     ("FARM", 3.141, 2),
248     ("BUILDING", 2.5, 3),
249     ("HUT", 1e6, 4),
250     ("LIGHTHOUSE", -0.01, 5)])
251     table = TransientTable(self.transientdb, simple)
252    
253     # A column and a value
254     self.assertEquals(table.SimpleQuery(table.Column(0), "==", "RUINS"),
255     [1])
256     self.assertEquals(table.SimpleQuery(table.Column(2), "!=", 2),
257     [0, 1, 3, 4, 5])
258     self.assertEquals(table.SimpleQuery(table.Column(1), "<", 1.0),
259     [0, 1, 5])
260     self.assertEquals(table.SimpleQuery(table.Column(1), "<=", -1.5),
261     [0])
262     self.assertEquals(table.SimpleQuery(table.Column(2), ">", 3),
263     [0, 4, 5])
264     self.assertEquals(table.SimpleQuery(table.Column(2), ">=", 3),
265     [0, 3, 4, 5])
266    
267     # Two columns as operands
268     self.assertEquals(table.SimpleQuery(table.Column(1),
269     "<=", table.Column(2)),
270     [0, 1, 3, 5])
271    
272     # Test whether invalid operators raise a ValueError
273     self.assertRaises(ValueError,
274     table.SimpleQuery,
275     table.Column(1), "<<", table.Column(2))
276    
277    
278 bh 765 if __name__ == "__main__":
279     support.run_tests()

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26