/[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 1125 - (hide 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 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     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 bh 334 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 bh 1068 for channel in (CHANGED,
207     MAPS_CHANGED,
208 jonathan 584 FILENAME_CHANGED,
209 bh 1068 MAP_PROJECTION_CHANGED,
210 jonathan 584 MAP_LAYERS_CHANGED,
211 bh 1068 LAYER_VISIBILITY_CHANGED,
212     LAYER_CHANGED,
213     TABLE_REMOVED):
214 bh 334 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 bh 723 self.session = None
221 bh 334 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 bh 1068 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 bh 334
266 bh 1068
267 bh 334 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 bh 723 open_shp = self.session.OpenShapefile
276 bh 334 self.arc_layer = Layer("Roads",
277 bh 723 open_shp(os.path.join("..", "Data", "iceland",
278     "roads-line.shp")))
279 bh 334 self.poly_layer = Layer("Political",
280 bh 723 open_shp(os.path.join("..", "Data", "iceland",
281     "political.shp")))
282 bh 334 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 bh 723 def tearDown(self):
290     TestSessionBase.tearDown(self)
291     self.arc_layer = self.poly_layer = None
292    
293 bh 334 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 jonathan 409 self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
328 bh 334 self.assert_(self.session.WasModified())
329 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
330 bh 334 (self.session, CHANGED)])
331    
332     def test_forwarding_stroke(self):
333     """Test Session's forwarding of Layer.SetStroke messages"""
334 jonathan 409 self.poly_layer.GetClassification().\
335 jonathan 482 SetDefaultLineColor(Color(0.0, 0.5, 1.0))
336 bh 334 self.assert_(self.session.WasModified())
337 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
338 bh 334 (self.session, CHANGED)])
339    
340     def test_forwarding_stroke_width(self):
341     """Test Session's forwarding of Layer.SetStrokeWidth messages"""
342 jonathan 482 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
343 bh 334 self.assert_(self.session.WasModified())
344 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
345 bh 334 (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 jonathan 482 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
369 bh 334 self.assert_(self.session.WasModified())
370     self.session.UnsetModified()
371     self.failIf(self.session.WasModified())
372 jonathan 584 self.check_messages([(self.poly_layer, LAYER_CHANGED),
373 bh 334 (self.session, CHANGED),
374     (CHANGED,)])
375    
376 bh 851 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 bh 334
392 bh 851 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 bh 334 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