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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 409 by jonathan, Wed Feb 19 16:50:39 2003 UTC revision 1125 by bh, Mon Jun 2 14:14:32 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2002 by Intevation GmbH  # Copyright (c) 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 20  import support Line 20  import support
20  support.initthuban()  support.initthuban()
21    
22  from Thuban.Model.messages import CHANGED, MAPS_CHANGED, FILENAME_CHANGED, \  from Thuban.Model.messages import CHANGED, MAPS_CHANGED, FILENAME_CHANGED, \
23       MAP_PROJECTION_CHANGED, LAYERS_CHANGED, \       MAP_PROJECTION_CHANGED, MAP_LAYERS_CHANGED, \
24       LAYER_VISIBILITY_CHANGED, LAYER_LEGEND_CHANGED       LAYER_VISIBILITY_CHANGED, LAYER_CHANGED, TABLE_REMOVED
25  from Thuban.Model.session import Session  from Thuban.Model.session import Session
26  from Thuban.Model.map import Map  from Thuban.Model.map import Map
27  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer
28  from Thuban.Model.proj import Projection  from Thuban.Model.proj import Projection
29  from Thuban.Model.color import Color  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):  class TestSessionSimple(unittest.TestCase):
36    
37      """Very simple test cases for Session"""      """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):      def test_initial_state(self):
49          """Test Session's initial state"""          """Test Session's initial state"""
50          session = Session("Test Session")          session = self.session = Session("Test Session")
51          self.assertEquals(session.Title(), "Test Session")          self.assertEquals(session.Title(), "Test Session")
52          self.assertEquals(session.Maps(), [])          self.assertEquals(session.Maps(), [])
53            self.assertEquals(session.Tables(), [])
54            self.assertEquals(session.ShapeStores(), [])
55          self.assertEquals(session.filename, None)          self.assertEquals(session.filename, None)
56          self.failIf(session.HasMaps())          self.failIf(session.HasMaps())
57          self.failIf(session.WasModified())          self.failIf(session.WasModified())
         session.Destroy()  
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):  class TestSessionBase(unittest.TestCase, support.SubscriberMixin):
193    
# Line 58  class TestSessionBase(unittest.TestCase, Line 203  class TestSessionBase(unittest.TestCase,
203    
204          # Create a Session and subscribe to all interesting channels.          # Create a Session and subscribe to all interesting channels.
205          self.session = Session("Test Session")          self.session = Session("Test Session")
206          for channel in (CHANGED, MAPS_CHANGED, FILENAME_CHANGED,          for channel in (CHANGED,
207                          MAP_PROJECTION_CHANGED, LAYERS_CHANGED,                          MAPS_CHANGED,
208                          LAYER_VISIBILITY_CHANGED, LAYER_LEGEND_CHANGED):                          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,              self.session.Subscribe(channel,
215                                     self.subscribe_with_params, channel)                                     self.subscribe_with_params, channel)
216    
217      def tearDown(self):      def tearDown(self):
218          """Destroy self.session and clear the message list"""          """Destroy self.session and clear the message list"""
219          self.session.Destroy()          self.session.Destroy()
220            self.session = None
221          self.clear_messages()          self.clear_messages()
222    
223    
# Line 92  class TestSessionMessages(TestSessionBas Line 243  class TestSessionMessages(TestSessionBas
243          self.check_messages([(FILENAME_CHANGED,),          self.check_messages([(FILENAME_CHANGED,),
244                               (self.session, CHANGED)])                               (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):  class TestSessionWithContent(TestSessionBase):
268    
# Line 101  class TestSessionWithContent(TestSession Line 272  class TestSessionWithContent(TestSession
272          """Extend the inherited method to add a non-empty map to self.session          """Extend the inherited method to add a non-empty map to self.session
273          """          """
274          TestSessionBase.setUp(self)          TestSessionBase.setUp(self)
275            open_shp = self.session.OpenShapefile
276          self.arc_layer = Layer("Roads",          self.arc_layer = Layer("Roads",
277                                 os.path.join("..", "Data", "iceland",                                 open_shp(os.path.join("..", "Data", "iceland",
278                                              "roads-line.shp"))                                                       "roads-line.shp")))
279          self.poly_layer = Layer("Political",          self.poly_layer = Layer("Political",
280                                  os.path.join("..", "Data", "iceland",                                  open_shp(os.path.join("..", "Data", "iceland",
281                                               "political.shp"))                                                        "political.shp")))
282          self.map = Map("A Map")          self.map = Map("A Map")
283          self.map.AddLayer(self.arc_layer)          self.map.AddLayer(self.arc_layer)
284          self.map.AddLayer(self.poly_layer)          self.map.AddLayer(self.poly_layer)
# Line 114  class TestSessionWithContent(TestSession Line 286  class TestSessionWithContent(TestSession
286          self.session.UnsetModified()          self.session.UnsetModified()
287          self.clear_messages()          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):      def test_remove_map(self):
294          """Test Session.RemoveMap"""          """Test Session.RemoveMap"""
295          self.session.RemoveMap(self.map)          self.session.RemoveMap(self.map)
# Line 150  class TestSessionWithContent(TestSession Line 326  class TestSessionWithContent(TestSession
326          """Test Session's forwarding of Layer.SetFill messages"""          """Test Session's forwarding of Layer.SetFill messages"""
327          self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))          self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
328          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
329          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
330                               (self.session, CHANGED)])                               (self.session, CHANGED)])
331    
332      def test_forwarding_stroke(self):      def test_forwarding_stroke(self):
333          """Test Session's forwarding of Layer.SetStroke messages"""          """Test Session's forwarding of Layer.SetStroke messages"""
334          self.poly_layer.GetClassification().\          self.poly_layer.GetClassification().\
335              SetDefaultStroke(Color(0.0, 0.5, 1.0))              SetDefaultLineColor(Color(0.0, 0.5, 1.0))
336          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
337          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
338                               (self.session, CHANGED)])                               (self.session, CHANGED)])
339    
340      def test_forwarding_stroke_width(self):      def test_forwarding_stroke_width(self):
341          """Test Session's forwarding of Layer.SetStrokeWidth messages"""          """Test Session's forwarding of Layer.SetStrokeWidth messages"""
342          self.poly_layer.GetClassification().SetDefaultStrokeWidth(3)          self.poly_layer.GetClassification().SetDefaultLineWidth(3)
343          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
344          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
345                               (self.session, CHANGED)])                               (self.session, CHANGED)])
346    
347      def test_forwarding_visibility(self):      def test_forwarding_visibility(self):
# Line 189  class TestSessionWithContent(TestSession Line 365  class TestSessionWithContent(TestSession
365      def test_unset_modified_layer(self):      def test_unset_modified_layer(self):
366          """Test Session.UnsetModified with layer level changes"""          """Test Session.UnsetModified with layer level changes"""
367          self.failIf(self.session.WasModified())          self.failIf(self.session.WasModified())
368          self.poly_layer.GetClassification().SetDefaultStrokeWidth(3)          self.poly_layer.GetClassification().SetDefaultLineWidth(3)
369          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
370          self.session.UnsetModified()          self.session.UnsetModified()
371          self.failIf(self.session.WasModified())          self.failIf(self.session.WasModified())
372          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
373                               (self.session, CHANGED),                               (self.session, CHANGED),
374                               (CHANGED,)])                               (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__":  if __name__ == "__main__":
410      unittest.main()      unittest.main()

Legend:
Removed from v.409  
changed lines
  Added in v.1125

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26