/[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 1068 - (show 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 # 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 table = session.AddTable(memtable)
72 self.assertEquals(session.Tables(), [table])
73
74 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 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
96 self.assertEquals(session.Tables(), [store.Table()])
97
98 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
111
112 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 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 for channel in (CHANGED,
201 MAPS_CHANGED,
202 FILENAME_CHANGED,
203 MAP_PROJECTION_CHANGED,
204 MAP_LAYERS_CHANGED,
205 LAYER_VISIBILITY_CHANGED,
206 LAYER_CHANGED,
207 TABLE_REMOVED):
208 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 self.session = None
215 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 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
260
261 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 open_shp = self.session.OpenShapefile
270 self.arc_layer = Layer("Roads",
271 open_shp(os.path.join("..", "Data", "iceland",
272 "roads-line.shp")))
273 self.poly_layer = Layer("Political",
274 open_shp(os.path.join("..", "Data", "iceland",
275 "political.shp")))
276 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 def tearDown(self):
284 TestSessionBase.tearDown(self)
285 self.arc_layer = self.poly_layer = None
286
287 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 self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
322 self.assert_(self.session.WasModified())
323 self.check_messages([(self.poly_layer, LAYER_CHANGED),
324 (self.session, CHANGED)])
325
326 def test_forwarding_stroke(self):
327 """Test Session's forwarding of Layer.SetStroke messages"""
328 self.poly_layer.GetClassification().\
329 SetDefaultLineColor(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_width(self):
335 """Test Session's forwarding of Layer.SetStrokeWidth messages"""
336 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
337 self.assert_(self.session.WasModified())
338 self.check_messages([(self.poly_layer, LAYER_CHANGED),
339 (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 self.poly_layer.GetClassification().SetDefaultLineWidth(3)
363 self.assert_(self.session.WasModified())
364 self.session.UnsetModified()
365 self.failIf(self.session.WasModified())
366 self.check_messages([(self.poly_layer, LAYER_CHANGED),
367 (self.session, CHANGED),
368 (CHANGED,)])
369
370 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
386 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 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