/[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 395 by jonathan, Mon Feb 10 15:28:02 2003 UTC revision 1068 by bh, Tue May 27 15:02:37 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            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):  class TestSessionBase(unittest.TestCase, support.SubscriberMixin):
187    
# Line 58  class TestSessionBase(unittest.TestCase, Line 197  class TestSessionBase(unittest.TestCase,
197    
198          # Create a Session and subscribe to all interesting channels.          # Create a Session and subscribe to all interesting channels.
199          self.session = Session("Test Session")          self.session = Session("Test Session")
200          for channel in (CHANGED, MAPS_CHANGED, FILENAME_CHANGED,          for channel in (CHANGED,
201                          MAP_PROJECTION_CHANGED, LAYERS_CHANGED,                          MAPS_CHANGED,
202                          LAYER_VISIBILITY_CHANGED, LAYER_LEGEND_CHANGED):                          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,              self.session.Subscribe(channel,
209                                     self.subscribe_with_params, channel)                                     self.subscribe_with_params, channel)
210    
211      def tearDown(self):      def tearDown(self):
212          """Destroy self.session and clear the message list"""          """Destroy self.session and clear the message list"""
213          self.session.Destroy()          self.session.Destroy()
214            self.session = None
215          self.clear_messages()          self.clear_messages()
216    
217    
# Line 92  class TestSessionMessages(TestSessionBas Line 237  class TestSessionMessages(TestSessionBas
237          self.check_messages([(FILENAME_CHANGED,),          self.check_messages([(FILENAME_CHANGED,),
238                               (self.session, CHANGED)])                               (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):  class TestSessionWithContent(TestSessionBase):
262    
# Line 101  class TestSessionWithContent(TestSession Line 266  class TestSessionWithContent(TestSession
266          """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
267          """          """
268          TestSessionBase.setUp(self)          TestSessionBase.setUp(self)
269            open_shp = self.session.OpenShapefile
270          self.arc_layer = Layer("Roads",          self.arc_layer = Layer("Roads",
271                                 os.path.join("..", "Data", "iceland",                                 open_shp(os.path.join("..", "Data", "iceland",
272                                              "roads-line.shp"))                                                       "roads-line.shp")))
273          self.poly_layer = Layer("Political",          self.poly_layer = Layer("Political",
274                                  os.path.join("..", "Data", "iceland",                                  open_shp(os.path.join("..", "Data", "iceland",
275                                               "political.shp"))                                                        "political.shp")))
276          self.map = Map("A Map")          self.map = Map("A Map")
277          self.map.AddLayer(self.arc_layer)          self.map.AddLayer(self.arc_layer)
278          self.map.AddLayer(self.poly_layer)          self.map.AddLayer(self.poly_layer)
# Line 114  class TestSessionWithContent(TestSession Line 280  class TestSessionWithContent(TestSession
280          self.session.UnsetModified()          self.session.UnsetModified()
281          self.clear_messages()          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):      def test_remove_map(self):
288          """Test Session.RemoveMap"""          """Test Session.RemoveMap"""
289          self.session.RemoveMap(self.map)          self.session.RemoveMap(self.map)
# Line 148  class TestSessionWithContent(TestSession Line 318  class TestSessionWithContent(TestSession
318    
319      def test_forwarding_fill(self):      def test_forwarding_fill(self):
320          """Test Session's forwarding of Layer.SetFill messages"""          """Test Session's forwarding of Layer.SetFill messages"""
321          self.poly_layer.classification.SetDefaultFill(Color(0.0, 0.5, 1.0))          self.poly_layer.GetClassification().SetDefaultFill(Color(0.0, 0.5, 1.0))
322          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
323          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
324                               (self.session, CHANGED)])                               (self.session, CHANGED)])
325    
326      def test_forwarding_stroke(self):      def test_forwarding_stroke(self):
327          """Test Session's forwarding of Layer.SetStroke messages"""          """Test Session's forwarding of Layer.SetStroke messages"""
328          self.poly_layer.classification.SetDefaultStroke(Color(0.0, 0.5, 1.0))          self.poly_layer.GetClassification().\
329                SetDefaultLineColor(Color(0.0, 0.5, 1.0))
330          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
331          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
332                               (self.session, CHANGED)])                               (self.session, CHANGED)])
333    
334      def test_forwarding_stroke_width(self):      def test_forwarding_stroke_width(self):
335          """Test Session's forwarding of Layer.SetStrokeWidth messages"""          """Test Session's forwarding of Layer.SetStrokeWidth messages"""
336          self.poly_layer.classification.SetDefaultStrokeWidth(3)          self.poly_layer.GetClassification().SetDefaultLineWidth(3)
337          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
338          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
339                               (self.session, CHANGED)])                               (self.session, CHANGED)])
340    
341      def test_forwarding_visibility(self):      def test_forwarding_visibility(self):
# Line 188  class TestSessionWithContent(TestSession Line 359  class TestSessionWithContent(TestSession
359      def test_unset_modified_layer(self):      def test_unset_modified_layer(self):
360          """Test Session.UnsetModified with layer level changes"""          """Test Session.UnsetModified with layer level changes"""
361          self.failIf(self.session.WasModified())          self.failIf(self.session.WasModified())
362          self.poly_layer.classification.SetDefaultStrokeWidth(3)          self.poly_layer.GetClassification().SetDefaultLineWidth(3)
363          self.assert_(self.session.WasModified())          self.assert_(self.session.WasModified())
364          self.session.UnsetModified()          self.session.UnsetModified()
365          self.failIf(self.session.WasModified())          self.failIf(self.session.WasModified())
366          self.check_messages([(self.poly_layer, LAYER_LEGEND_CHANGED),          self.check_messages([(self.poly_layer, LAYER_CHANGED),
367                               (self.session, CHANGED),                               (self.session, CHANGED),
368                               (CHANGED,)])                               (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__":  if __name__ == "__main__":
404      unittest.main()      unittest.main()

Legend:
Removed from v.395  
changed lines
  Added in v.1068

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26