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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1676 - (hide 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 bh 723 # Copyright (c) 2002, 2003 by Intevation GmbH
2 bh 334 # 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 jonathan 584 MAP_PROJECTION_CHANGED, MAP_LAYERS_CHANGED, \
24 bh 1068 LAYER_VISIBILITY_CHANGED, LAYER_CHANGED, TABLE_REMOVED
25 bh 334 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 bh 982 from Thuban.Model.table import MemoryTable, FIELDTYPE_STRING, \
31     FIELDTYPE_INT, FIELDTYPE_DOUBLE
32 bh 1016 from Thuban.Model.data import DerivedShapeStore
33 bh 1068 from Thuban.Model.transientdb import TransientJoinedTable
34 bh 334
35     class TestSessionSimple(unittest.TestCase):
36    
37     """Very simple test cases for Session"""
38    
39 bh 984 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 bh 334 def test_initial_state(self):
49     """Test Session's initial state"""
50 bh 984 session = self.session = Session("Test Session")
51 bh 334 self.assertEquals(session.Title(), "Test Session")
52     self.assertEquals(session.Maps(), [])
53 bh 851 self.assertEquals(session.Tables(), [])
54     self.assertEquals(session.ShapeStores(), [])
55 bh 334 self.assertEquals(session.filename, None)
56     self.failIf(session.HasMaps())
57     self.failIf(session.WasModified())
58    
59 bh 982 def test_add_table(self):
60     """Test Session.AddTable()"""
61 bh 984 session = self.session = Session("Test Session")
62 bh 982 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 bh 1125
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 bh 982 table = session.AddTable(memtable)
77     self.assertEquals(session.Tables(), [table])
78 bh 1125 self.failUnless(session.WasModified())
79 bh 334
80 bh 1039 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 bh 984 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 bh 982
102 bh 984 self.assertEquals(session.Tables(), [store.Table()])
103    
104 bh 1016 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 bh 984
117 bh 1016
118 bh 1068 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 bh 1676 self.memtable = self.roads_line = self.landmarks = None
163     self.session.Destroy()
164     self.session = None
165 bh 1068
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 jonathan 1266 store = self.session.OpenShapefile(
185     os.path.join("..", "Data", "iceland",
186     "cultural_landmark-point.dbf"))
187 bh 1068 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 bh 334 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 bh 1068 for channel in (CHANGED,
209     MAPS_CHANGED,
210 jonathan 584 FILENAME_CHANGED,
211 bh 1068 MAP_PROJECTION_CHANGED,
212 jonathan 584 MAP_LAYERS_CHANGED,
213 bh 1068 LAYER_VISIBILITY_CHANGED,
214     LAYER_CHANGED,
215     TABLE_REMOVED):
216 bh 334 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 bh 723 self.session = None
223 bh 334 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 bh 1068 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 bh 334
268 bh 1068
269 bh 334 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 bh 723 open_shp = self.session.OpenShapefile
278 bh 334 self.arc_layer = Layer("Roads",
279 bh 723 open_shp(os.path.join("..", "Data", "iceland",
280     "roads-line.shp")))
281 bh 334 self.poly_layer = Layer("Political",
282 bh 723 open_shp(os.path.join("..", "Data", "iceland",
283     "political.shp")))
284 bh 334 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 bh 723 def tearDown(self):
292     TestSessionBase.tearDown(self)
293     self.arc_layer = self.poly_layer = None
294    
295 bh 334 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 jonathan 1401 self.check_messages([(self.map, None, MAP_PROJECTION_CHANGED),
325 bh 334 (self.session, CHANGED)])
326    
327     def test_forwarding_fill(self):
328     """Test Session's forwarding of Layer.SetFill messages"""
329 jonathan 409 self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
330 bh 334 self.assert_(self.session.WasModified())
331 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
332 bh 334 (self.session, CHANGED)])
333    
334     def test_forwarding_stroke(self):
335     """Test Session's forwarding of Layer.SetStroke messages"""
336 jonathan 409 self.poly_layer.GetClassification().\
337 jonathan 482 SetDefaultLineColor(Color(0.0, 0.5, 1.0))
338 bh 334 self.assert_(self.session.WasModified())
339 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
340 bh 334 (self.session, CHANGED)])
341    
342     def test_forwarding_stroke_width(self):
343     """Test Session's forwarding of Layer.SetStrokeWidth messages"""
344 jonathan 482 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
345 bh 334 self.assert_(self.session.WasModified())
346 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
347 bh 334 (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 jonathan 482 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
371 bh 334 self.assert_(self.session.WasModified())
372     self.session.UnsetModified()
373     self.failIf(self.session.WasModified())
374 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
375 bh 334 (self.session, CHANGED),
376     (CHANGED,)])
377    
378 bh 851 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 bh 334
394 bh 851 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 bh 334 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