/[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 1125 - (show annotations)
Mon Jun 2 14:14:32 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/test/test_session.py
File MIME type: text/x-python
File size: 17366 byte(s)
(TestSessionSimple.test_add_table): Test
whether the modified flag is set 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.session = self.memtable = self.roads_line = self.landmarks = None
163
164 def test_unreferenced_tables(self):
165 """Test Session.UnreferencedTables()"""
166 self.assertEquals(self.session.UnreferencedTables(),
167 [self.memtable, self.roads_line, self.landmarks])
168
169 def test_unreferenced_tables_with_joins(self):
170 """Test Session.UnreferencedTables() with joins"""
171 joined = TransientJoinedTable(self.session.TransientDB(),
172 self.landmarks, "CLPTLABEL",
173 self.memtable, "type", outer_join = True)
174 try:
175 joined = self.session.AddTable(joined)
176 # After the join, landmarks and memtable are referenced by
177 # joined which in turn is referenced by nothing
178 self.assertEquals(self.session.UnreferencedTables(),
179 [self.roads_line, joined])
180 # Creating a DerivedShapeStore that references the joined table
181 # will remove it from the list of unreferenced tables,
182 store = self.session.OpenShapefile(os.path.join("..", "Data",
183 "iceland",
184 "political.dbf"))
185 derived = DerivedShapeStore(store, joined)
186 self.session.AddShapeStore(derived)
187 self.assertEquals(self.session.UnreferencedTables(),
188 [self.roads_line])
189 finally:
190 joined = derived = store = None
191
192 class TestSessionBase(unittest.TestCase, support.SubscriberMixin):
193
194 """Base class for Session test cases that test the messages"""
195
196 def setUp(self):
197 """
198 Clear the message list, create a session and subscribe to its messages
199
200 Bind the session to self.session.
201 """
202 self.clear_messages()
203
204 # Create a Session and subscribe to all interesting channels.
205 self.session = Session("Test Session")
206 for channel in (CHANGED,
207 MAPS_CHANGED,
208 FILENAME_CHANGED,
209 MAP_PROJECTION_CHANGED,
210 MAP_LAYERS_CHANGED,
211 LAYER_VISIBILITY_CHANGED,
212 LAYER_CHANGED,
213 TABLE_REMOVED):
214 self.session.Subscribe(channel,
215 self.subscribe_with_params, channel)
216
217 def tearDown(self):
218 """Destroy self.session and clear the message list"""
219 self.session.Destroy()
220 self.session = None
221 self.clear_messages()
222
223
224 class TestSessionMessages(TestSessionBase):
225
226 """Simple Session test cases that test messges"""
227
228 def test_add_map(self):
229 """Test Session.AddMap"""
230 self.failIf(self.session.WasModified())
231 map = Map("Some Map")
232 self.session.AddMap(map)
233 self.assert_(self.session.HasMaps())
234 self.assert_(self.session.WasModified())
235 self.assertEquals(self.session.Maps(), [map])
236 self.check_messages([(MAPS_CHANGED,),
237 (self.session, CHANGED)])
238
239 def test_set_filename(self):
240 """Test Session.SetFilename"""
241 self.session.SetFilename("session_set_filename_test")
242 self.session.filename = "session_set_filename_test"
243 self.check_messages([(FILENAME_CHANGED,),
244 (self.session, CHANGED)])
245
246 def test_remove_table(self):
247 """Test Session.RemoveTable()"""
248 memtable = MemoryTable([("type", FIELDTYPE_STRING),
249 ("value", FIELDTYPE_DOUBLE),
250 ("code", FIELDTYPE_INT)],
251 [("OTHER/UNKNOWN", -1.5, 11),
252 ("RUINS", 0.0, 1),
253 ("FARM", 3.141, 2),
254 ("BUILDING", 2.5, 3),
255 ("HUT", 1e6, 4),
256 ("LIGHTHOUSE", -0.01, 5)])
257 table = self.session.AddTable(memtable)
258 self.assertEquals(self.session.Tables(), [table])
259 self.clear_messages()
260 self.session.RemoveTable(table)
261 self.check_messages([(table, TABLE_REMOVED),
262 (self.session, CHANGED)])
263 self.assertEquals(self.session.Tables(), [])
264 self.assertRaises(ValueError, self.session.RemoveTable, table)
265
266
267 class TestSessionWithContent(TestSessionBase):
268
269 """Session test cases that start with a filled session."""
270
271 def setUp(self):
272 """Extend the inherited method to add a non-empty map to self.session
273 """
274 TestSessionBase.setUp(self)
275 open_shp = self.session.OpenShapefile
276 self.arc_layer = Layer("Roads",
277 open_shp(os.path.join("..", "Data", "iceland",
278 "roads-line.shp")))
279 self.poly_layer = Layer("Political",
280 open_shp(os.path.join("..", "Data", "iceland",
281 "political.shp")))
282 self.map = Map("A Map")
283 self.map.AddLayer(self.arc_layer)
284 self.map.AddLayer(self.poly_layer)
285 self.session.AddMap(self.map)
286 self.session.UnsetModified()
287 self.clear_messages()
288
289 def tearDown(self):
290 TestSessionBase.tearDown(self)
291 self.arc_layer = self.poly_layer = None
292
293 def test_remove_map(self):
294 """Test Session.RemoveMap"""
295 self.session.RemoveMap(self.map)
296 self.assert_(self.session.WasModified())
297 self.failIf(self.session.HasMaps())
298 self.check_messages([(MAPS_CHANGED,),
299 (self.session, CHANGED)])
300
301 def test_tree_info(self):
302 """Test Session.TreeInfo"""
303 self.assertEquals(self.session.TreeInfo(),
304 ('Session: Test Session',
305 ['Filename:',
306 'Unmodified',
307 self.map]))
308
309 def test_forward_map_projection(self):
310 """Test Session forwarding of Map.SetProjection messages"""
311 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
312 self.map.SetProjection(proj)
313 self.check_messages([(self.map, MAP_PROJECTION_CHANGED),
314 (self.session, CHANGED)])
315 self.assert_(self.session.WasModified())
316
317 def test_forward_map_projection(self):
318 """Test Session forwarding of Map.SetProjection messages"""
319 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
320 self.map.SetProjection(proj)
321 self.assert_(self.session.WasModified())
322 self.check_messages([(self.map, MAP_PROJECTION_CHANGED),
323 (self.session, CHANGED)])
324
325 def test_forwarding_fill(self):
326 """Test Session's forwarding of Layer.SetFill messages"""
327 self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
328 self.assert_(self.session.WasModified())
329 self.check_messages([(self.poly_layer, LAYER_CHANGED),
330 (self.session, CHANGED)])
331
332 def test_forwarding_stroke(self):
333 """Test Session's forwarding of Layer.SetStroke messages"""
334 self.poly_layer.GetClassification().\
335 SetDefaultLineColor(Color(0.0, 0.5, 1.0))
336 self.assert_(self.session.WasModified())
337 self.check_messages([(self.poly_layer, LAYER_CHANGED),
338 (self.session, CHANGED)])
339
340 def test_forwarding_stroke_width(self):
341 """Test Session's forwarding of Layer.SetStrokeWidth messages"""
342 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
343 self.assert_(self.session.WasModified())
344 self.check_messages([(self.poly_layer, LAYER_CHANGED),
345 (self.session, CHANGED)])
346
347 def test_forwarding_visibility(self):
348 """Test Session's forwarding of Layer.SetVisible messages"""
349 self.poly_layer.SetVisible(0)
350 # Currently changing the visibility of a layer doesn't change
351 # the modification flag.
352 self.failIf(self.session.WasModified())
353 self.check_messages([(self.poly_layer, LAYER_VISIBILITY_CHANGED),
354 (self.session, CHANGED)])
355
356 def test_unset_modified_map(self):
357 """Test Session.UnsetModified with map level changes"""
358 self.failIf(self.session.WasModified())
359 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
360 self.map.SetProjection(proj)
361 self.assert_(self.session.WasModified())
362 self.session.UnsetModified()
363 self.failIf(self.session.WasModified())
364
365 def test_unset_modified_layer(self):
366 """Test Session.UnsetModified with layer level changes"""
367 self.failIf(self.session.WasModified())
368 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
369 self.assert_(self.session.WasModified())
370 self.session.UnsetModified()
371 self.failIf(self.session.WasModified())
372 self.check_messages([(self.poly_layer, LAYER_CHANGED),
373 (self.session, CHANGED),
374 (CHANGED,)])
375
376 def test_shape_stores(self):
377 """Test Session.ShapeStores()"""
378 # Strictly speaking the session doesn't make guarantees about
379 # the order of the ShapeStores in the list, but currently it's
380 # deterministic and they're listed in the order in which they
381 # were created
382 self.assertEquals(self.session.ShapeStores(),
383 [self.arc_layer.ShapeStore(),
384 self.poly_layer.ShapeStore()])
385 # If we remove the map from the session and clear our instance
386 # variables that hold the layers and the map the list should
387 # become empty again.
388 self.session.RemoveMap(self.map)
389 self.arc_layer = self.poly_layer = self.map = None
390 self.assertEquals(self.session.ShapeStores(), [])
391
392 def test_tables(self):
393 """Test Session.Tables()"""
394 # Strictly speaking the session doesn't make guarantees about
395 # the order of the tables in the list, but currently it's
396 # deterministic and they're listed in the order in which they
397 # were opened
398 self.assertEquals(self.session.Tables(),
399 [self.arc_layer.ShapeStore().Table(),
400 self.poly_layer.ShapeStore().Table()])
401 # If we remove the map from the session and clear our instance
402 # variables that hold the layers and the map the list should
403 # become empty again.
404 self.session.RemoveMap(self.map)
405 self.arc_layer = self.poly_layer = self.map = None
406 self.assertEquals(self.session.Tables(), [])
407
408
409 if __name__ == "__main__":
410 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