/[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 1068 - (hide annotations)
Tue May 27 15:02:37 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: 17114 byte(s)
* Thuban/Model/messages.py (TABLE_REMOVED): New message.

* Thuban/Model/session.py (Session.UnreferencedTables): New method
to return tables that are not referenced by other tables or shape
stores and can be removed.
(Session.RemoveTable): Issue a TABLE_REMOVED message after
removing the table

* Thuban/UI/mainwindow.py: Remove unused imports
(MainWindow.TableClose): Implement.

* Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
messages so that the frame will be automatically closed when a new
session is opened or the table is removed.
(TableFrame.OnClose): Unsubscribe the Subscriptions made in
__init__
(TableFrame.close_on_session_replaced)
(TableFrame.close_on_table_removed): New. Subscribers that close
the window

* test/test_session.py (TestSessionMessages.test_remove_table)
(TestSessionSimple.test_remove_table): Move the test to
TestSessionSimple and add test for the TABLE_REMOVED message
(TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
(TestSessionSimple.test_unreferenced_tables) New. Test for the
UnreferencedTables method.
(UnreferencedTablesTests): New. Class with some more sophisticated
tests for UnreferencedTables.

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