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

Contents of /branches/WIP-pyshapelib-bramz/test/test_session.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1676 - (show annotations)
Thu Aug 28 13:14:44 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/test/test_session.py
File MIME type: text/x-python
File size: 17356 byte(s)
(UnreferencedTablesTests.tearDown): Make
sure that the session is destroyed properly

1 # 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 Session class
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 from Thuban.Model.messages import CHANGED, MAPS_CHANGED, FILENAME_CHANGED, \
23 MAP_PROJECTION_CHANGED, MAP_LAYERS_CHANGED, \
24 LAYER_VISIBILITY_CHANGED, LAYER_CHANGED, TABLE_REMOVED
25 from Thuban.Model.session import Session
26 from Thuban.Model.map import Map
27 from Thuban.Model.layer import Layer
28 from Thuban.Model.proj import Projection
29 from Thuban.Model.color import Color
30 from Thuban.Model.table import MemoryTable, FIELDTYPE_STRING, \
31 FIELDTYPE_INT, FIELDTYPE_DOUBLE
32 from Thuban.Model.data import DerivedShapeStore
33 from Thuban.Model.transientdb import TransientJoinedTable
34
35 class TestSessionSimple(unittest.TestCase):
36
37 """Very simple test cases for Session"""
38
39 def setUp(self):
40 """Initialize self.session to None"""
41 self.session = None
42
43 def tearDown(self):
44 """Call self.session.Destroy() and reset self.session to None"""
45 self.session.Destroy()
46 self.session = None
47
48 def test_initial_state(self):
49 """Test Session's initial state"""
50 session = self.session = Session("Test Session")
51 self.assertEquals(session.Title(), "Test Session")
52 self.assertEquals(session.Maps(), [])
53 self.assertEquals(session.Tables(), [])
54 self.assertEquals(session.ShapeStores(), [])
55 self.assertEquals(session.filename, None)
56 self.failIf(session.HasMaps())
57 self.failIf(session.WasModified())
58
59 def test_add_table(self):
60 """Test Session.AddTable()"""
61 session = self.session = Session("Test Session")
62 memtable = MemoryTable([("type", FIELDTYPE_STRING),
63 ("value", FIELDTYPE_DOUBLE),
64 ("code", FIELDTYPE_INT)],
65 [("OTHER/UNKNOWN", -1.5, 11),
66 ("RUINS", 0.0, 1),
67 ("FARM", 3.141, 2),
68 ("BUILDING", 2.5, 3),
69 ("HUT", 1e6, 4),
70 ("LIGHTHOUSE", -0.01, 5)])
71
72 # The session should be unmodified before the AddTable call and
73 # modified afterwards and of course the table should show up in
74 # Tables
75 self.failIf(session.WasModified())
76 table = session.AddTable(memtable)
77 self.assertEquals(session.Tables(), [table])
78 self.failUnless(session.WasModified())
79
80 def test_open_table_file(self):
81 """Test Session.OpenTableFile()"""
82 session = self.session = Session("Test Session")
83 filename = os.path.join("..", "Data", "iceland",
84 "roads-line.dbf")
85 table = session.OpenTableFile(filename)
86 self.assertEquals(session.Tables(), [table])
87
88 def test_open_shapefile(self):
89 """Test Session.OpenShapefile()"""
90 session = self.session = Session("Test Session")
91 filename = os.path.join("..", "Data", "iceland",
92 "roads-line.shp")
93 store = session.OpenShapefile(filename)
94 self.assertEquals(store.FileName(), os.path.abspath(filename))
95 # The filetype of a shapefile is "shapefile"
96 self.assertEquals(store.FileType(), "shapefile")
97 # The shapestore itself depends on nothing else
98 self.assertEquals(store.Dependencies(), ())
99 # The shapestore's table depends on the shapestore
100 self.assertEquals(store.Table().Dependencies(), (store,))
101
102 self.assertEquals(session.Tables(), [store.Table()])
103
104 def test_add_shapestore(self):
105 """Test Session.AddShapeStore()"""
106 session = self.session = Session("Test Session")
107 filename = os.path.join("..", "Data", "iceland",
108 "roads-line.shp")
109 try:
110 store = session.OpenShapefile(filename)
111 derived = DerivedShapeStore(store, store.Table())
112 session.AddShapeStore(derived)
113 self.assertEquals(session.ShapeStores(), [store, derived])
114 finally:
115 store = derived = None
116
117
118 def test_unreferenced_tables(self):
119 """Test Session.UnreferencedTables()"""
120 session = self.session = Session("Test Session")
121 filename = os.path.join("..", "Data", "iceland",
122 "roads-line.shp")
123 try:
124 store = session.OpenShapefile(filename)
125 filename = os.path.join("..", "Data", "iceland",
126 "roads-line.dbf")
127 table = session.OpenTableFile(filename)
128 self.assertEquals(session.Tables(), [table, store.Table()])
129 # The store's table is reference by the store, so the only
130 # unreferenced table is the roads-line table
131 self.assertEquals(session.UnreferencedTables(), [table])
132 finally:
133 store = table = None
134
135
136 class UnreferencedTablesTests(unittest.TestCase):
137
138 """Test cases for the session.UnreferencedTables() method"""
139
140 def setUp(self):
141 """Create a session with a few test tables"""
142 self.session = Session("Test Session")
143 memtable = MemoryTable([("type", FIELDTYPE_STRING),
144 ("value", FIELDTYPE_DOUBLE),
145 ("code", FIELDTYPE_INT)],
146 [("OTHER/UNKNOWN", -1.5, 11),
147 ("RUINS", 0.0, 1),
148 ("FARM", 3.141, 2),
149 ("BUILDING", 2.5, 3),
150 ("HUT", 1e6, 4),
151 ("LIGHTHOUSE", -0.01, 5)])
152 self.memtable = self.session.AddTable(memtable)
153 filename = os.path.join("..", "Data", "iceland",
154 "roads-line.dbf")
155 self.roads_line = self.session.OpenTableFile(filename)
156 filename = os.path.join("..", "Data", "iceland",
157 "cultural_landmark-point.dbf")
158 self.landmarks = self.session.OpenTableFile(filename)
159
160 def tearDown(self):
161 """Clear the session and layers"""
162 self.memtable = self.roads_line = self.landmarks = None
163 self.session.Destroy()
164 self.session = None
165
166 def test_unreferenced_tables(self):
167 """Test Session.UnreferencedTables()"""
168 self.assertEquals(self.session.UnreferencedTables(),
169 [self.memtable, self.roads_line, self.landmarks])
170
171 def test_unreferenced_tables_with_joins(self):
172 """Test Session.UnreferencedTables() with joins"""
173 joined = TransientJoinedTable(self.session.TransientDB(),
174 self.landmarks, "CLPTLABEL",
175 self.memtable, "type", outer_join = True)
176 try:
177 joined = self.session.AddTable(joined)
178 # After the join, landmarks and memtable are referenced by
179 # joined which in turn is referenced by nothing
180 self.assertEquals(self.session.UnreferencedTables(),
181 [self.roads_line, joined])
182 # Creating a DerivedShapeStore that references the joined table
183 # will remove it from the list of unreferenced tables,
184 store = self.session.OpenShapefile(
185 os.path.join("..", "Data", "iceland",
186 "cultural_landmark-point.dbf"))
187 derived = DerivedShapeStore(store, joined)
188 self.session.AddShapeStore(derived)
189 self.assertEquals(self.session.UnreferencedTables(),
190 [self.roads_line])
191 finally:
192 joined = derived = store = None
193
194 class TestSessionBase(unittest.TestCase, support.SubscriberMixin):
195
196 """Base class for Session test cases that test the messages"""
197
198 def setUp(self):
199 """
200 Clear the message list, create a session and subscribe to its messages
201
202 Bind the session to self.session.
203 """
204 self.clear_messages()
205
206 # Create a Session and subscribe to all interesting channels.
207 self.session = Session("Test Session")
208 for channel in (CHANGED,
209 MAPS_CHANGED,
210 FILENAME_CHANGED,
211 MAP_PROJECTION_CHANGED,
212 MAP_LAYERS_CHANGED,
213 LAYER_VISIBILITY_CHANGED,
214 LAYER_CHANGED,
215 TABLE_REMOVED):
216 self.session.Subscribe(channel,
217 self.subscribe_with_params, channel)
218
219 def tearDown(self):
220 """Destroy self.session and clear the message list"""
221 self.session.Destroy()
222 self.session = None
223 self.clear_messages()
224
225
226 class TestSessionMessages(TestSessionBase):
227
228 """Simple Session test cases that test messges"""
229
230 def test_add_map(self):
231 """Test Session.AddMap"""
232 self.failIf(self.session.WasModified())
233 map = Map("Some Map")
234 self.session.AddMap(map)
235 self.assert_(self.session.HasMaps())
236 self.assert_(self.session.WasModified())
237 self.assertEquals(self.session.Maps(), [map])
238 self.check_messages([(MAPS_CHANGED,),
239 (self.session, CHANGED)])
240
241 def test_set_filename(self):
242 """Test Session.SetFilename"""
243 self.session.SetFilename("session_set_filename_test")
244 self.session.filename = "session_set_filename_test"
245 self.check_messages([(FILENAME_CHANGED,),
246 (self.session, CHANGED)])
247
248 def test_remove_table(self):
249 """Test Session.RemoveTable()"""
250 memtable = MemoryTable([("type", FIELDTYPE_STRING),
251 ("value", FIELDTYPE_DOUBLE),
252 ("code", FIELDTYPE_INT)],
253 [("OTHER/UNKNOWN", -1.5, 11),
254 ("RUINS", 0.0, 1),
255 ("FARM", 3.141, 2),
256 ("BUILDING", 2.5, 3),
257 ("HUT", 1e6, 4),
258 ("LIGHTHOUSE", -0.01, 5)])
259 table = self.session.AddTable(memtable)
260 self.assertEquals(self.session.Tables(), [table])
261 self.clear_messages()
262 self.session.RemoveTable(table)
263 self.check_messages([(table, TABLE_REMOVED),
264 (self.session, CHANGED)])
265 self.assertEquals(self.session.Tables(), [])
266 self.assertRaises(ValueError, self.session.RemoveTable, table)
267
268
269 class TestSessionWithContent(TestSessionBase):
270
271 """Session test cases that start with a filled session."""
272
273 def setUp(self):
274 """Extend the inherited method to add a non-empty map to self.session
275 """
276 TestSessionBase.setUp(self)
277 open_shp = self.session.OpenShapefile
278 self.arc_layer = Layer("Roads",
279 open_shp(os.path.join("..", "Data", "iceland",
280 "roads-line.shp")))
281 self.poly_layer = Layer("Political",
282 open_shp(os.path.join("..", "Data", "iceland",
283 "political.shp")))
284 self.map = Map("A Map")
285 self.map.AddLayer(self.arc_layer)
286 self.map.AddLayer(self.poly_layer)
287 self.session.AddMap(self.map)
288 self.session.UnsetModified()
289 self.clear_messages()
290
291 def tearDown(self):
292 TestSessionBase.tearDown(self)
293 self.arc_layer = self.poly_layer = None
294
295 def test_remove_map(self):
296 """Test Session.RemoveMap"""
297 self.session.RemoveMap(self.map)
298 self.assert_(self.session.WasModified())
299 self.failIf(self.session.HasMaps())
300 self.check_messages([(MAPS_CHANGED,),
301 (self.session, CHANGED)])
302
303 def test_tree_info(self):
304 """Test Session.TreeInfo"""
305 self.assertEquals(self.session.TreeInfo(),
306 ('Session: Test Session',
307 ['Filename:',
308 'Unmodified',
309 self.map]))
310
311 def test_forward_map_projection(self):
312 """Test Session forwarding of Map.SetProjection messages"""
313 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
314 self.map.SetProjection(proj)
315 self.check_messages([(self.map, MAP_PROJECTION_CHANGED),
316 (self.session, CHANGED)])
317 self.assert_(self.session.WasModified())
318
319 def test_forward_map_projection(self):
320 """Test Session forwarding of Map.SetProjection messages"""
321 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
322 self.map.SetProjection(proj)
323 self.assert_(self.session.WasModified())
324 self.check_messages([(self.map, None, MAP_PROJECTION_CHANGED),
325 (self.session, CHANGED)])
326
327 def test_forwarding_fill(self):
328 """Test Session's forwarding of Layer.SetFill messages"""
329 self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
330 self.assert_(self.session.WasModified())
331 self.check_messages([(self.poly_layer, LAYER_CHANGED),
332 (self.session, CHANGED)])
333
334 def test_forwarding_stroke(self):
335 """Test Session's forwarding of Layer.SetStroke messages"""
336 self.poly_layer.GetClassification().\
337 SetDefaultLineColor(Color(0.0, 0.5, 1.0))
338 self.assert_(self.session.WasModified())
339 self.check_messages([(self.poly_layer, LAYER_CHANGED),
340 (self.session, CHANGED)])
341
342 def test_forwarding_stroke_width(self):
343 """Test Session's forwarding of Layer.SetStrokeWidth messages"""
344 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
345 self.assert_(self.session.WasModified())
346 self.check_messages([(self.poly_layer, LAYER_CHANGED),
347 (self.session, CHANGED)])
348
349 def test_forwarding_visibility(self):
350 """Test Session's forwarding of Layer.SetVisible messages"""
351 self.poly_layer.SetVisible(0)
352 # Currently changing the visibility of a layer doesn't change
353 # the modification flag.
354 self.failIf(self.session.WasModified())
355 self.check_messages([(self.poly_layer, LAYER_VISIBILITY_CHANGED),
356 (self.session, CHANGED)])
357
358 def test_unset_modified_map(self):
359 """Test Session.UnsetModified with map level changes"""
360 self.failIf(self.session.WasModified())
361 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
362 self.map.SetProjection(proj)
363 self.assert_(self.session.WasModified())
364 self.session.UnsetModified()
365 self.failIf(self.session.WasModified())
366
367 def test_unset_modified_layer(self):
368 """Test Session.UnsetModified with layer level changes"""
369 self.failIf(self.session.WasModified())
370 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
371 self.assert_(self.session.WasModified())
372 self.session.UnsetModified()
373 self.failIf(self.session.WasModified())
374 self.check_messages([(self.poly_layer, LAYER_CHANGED),
375 (self.session, CHANGED),
376 (CHANGED,)])
377
378 def test_shape_stores(self):
379 """Test Session.ShapeStores()"""
380 # Strictly speaking the session doesn't make guarantees about
381 # the order of the ShapeStores in the list, but currently it's
382 # deterministic and they're listed in the order in which they
383 # were created
384 self.assertEquals(self.session.ShapeStores(),
385 [self.arc_layer.ShapeStore(),
386 self.poly_layer.ShapeStore()])
387 # If we remove the map from the session and clear our instance
388 # variables that hold the layers and the map the list should
389 # become empty again.
390 self.session.RemoveMap(self.map)
391 self.arc_layer = self.poly_layer = self.map = None
392 self.assertEquals(self.session.ShapeStores(), [])
393
394 def test_tables(self):
395 """Test Session.Tables()"""
396 # Strictly speaking the session doesn't make guarantees about
397 # the order of the tables in the list, but currently it's
398 # deterministic and they're listed in the order in which they
399 # were opened
400 self.assertEquals(self.session.Tables(),
401 [self.arc_layer.ShapeStore().Table(),
402 self.poly_layer.ShapeStore().Table()])
403 # If we remove the map from the session and clear our instance
404 # variables that hold the layers and the map the list should
405 # become empty again.
406 self.session.RemoveMap(self.map)
407 self.arc_layer = self.poly_layer = self.map = None
408 self.assertEquals(self.session.Tables(), [])
409
410
411 if __name__ == "__main__":
412 unittest.main()

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26