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

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

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

revision 839 by bh, Tue May 6 15:54:18 2003 UTC revision 1142 by bh, Tue Jun 10 09:41:57 2003 UTC
# Line 23  import shapelib Line 23  import shapelib
23  import dbflib  import dbflib
24    
25  from Thuban.Model.session import Session  from Thuban.Model.session import Session
26  from Thuban.Model.layer import Layer, SHAPETYPE_POLYGON, SHAPETYPE_ARC, \  from Thuban.Model.layer import BaseLayer, Layer, RasterLayer, \
27       SHAPETYPE_POINT       SHAPETYPE_POLYGON, SHAPETYPE_ARC, SHAPETYPE_POINT
28  from Thuban.Model.messages import LAYER_LEGEND_CHANGED, \  from Thuban.Model.messages import LAYER_LEGEND_CHANGED, \
29       LAYER_VISIBILITY_CHANGED       LAYER_VISIBILITY_CHANGED, LAYER_SHAPESTORE_REPLACED, LAYER_CHANGED
30  from Thuban.Model.color import Color  from Thuban.Model.color import Color
31  from Thuban.Model.table import FIELDTYPE_DOUBLE  from Thuban.Model.table import FIELDTYPE_DOUBLE, FIELDTYPE_STRING, MemoryTable
32    from Thuban.Model.proj import Projection
33    from Thuban.Model.data import DerivedShapeStore
34    from Thuban.Model.classification import Classification, ClassGroupSingleton
35    
36  class TestLayer(unittest.TestCase, support.FileTestMixin,  class TestLayer(unittest.TestCase, support.FileTestMixin,
37                  support.FloatComparisonMixin):                  support.FloatComparisonMixin):
# Line 41  class TestLayer(unittest.TestCase, suppo Line 44  class TestLayer(unittest.TestCase, suppo
44              self.assertFloatSeqEqual(test[i], value[i])              self.assertFloatSeqEqual(test[i], value[i])
45    
46      def setUp(self):      def setUp(self):
47          """Create a session"""          """Create a session self.session and initialize self.layer to None"""
48          self.session = Session("Test session for %s" % self.__class__)          self.session = Session("Test session for %s" % self.__class__)
49            self.layer = None
50    
51      def tearDown(self):      def tearDown(self):
52            """Call the layer's Destroy method and set session and layer to None"""
53          self.session = None          self.session = None
54            if self.layer is not None:
55                self.layer.Destroy()
56                self.layer = None
57    
58        def build_path(self, filename):
59            return os.path.join("..", "Data", "iceland", filename)
60    
61      def open_shapefile(self, filename):      def open_shapefile(self, filename):
62          """Open and return a shapestore for filename in the iceland data set"""          """Open and return a shapestore for filename in the iceland data set"""
63          return self.session.OpenShapefile(os.path.join("..", "Data", "iceland",          return self.session.OpenShapefile(self.build_path(filename))
64                                                         filename))  
65        def test_base_layer(self):
66            layer = self.layer = BaseLayer("Test BaseLayer")
67            self.assertEquals(layer.Title(), "Test BaseLayer")
68            self.failUnless(layer.Visible())
69    
70            # toggle visibility
71            layer.SetVisible(False)
72            self.failIf(layer.Visible())
73    
74            layer.SetVisible(True)
75            self.failUnless(layer.Visible())
76    
77            self.failIf(layer.HasClassification())
78            self.assertEquals(layer.GetProjection(), None)
79    
80            # set/get projection
81            proj = Projection(["proj=utm", "zone=26"])
82    
83            layer.SetProjection(proj)
84            self.failUnless(layer.GetProjection() is proj)
85    
86            # __init__ with other arguments
87            layer = BaseLayer("Test BaseLayer", False, proj)
88            self.failIf(layer.Visible())
89            self.failUnless(layer.GetProjection() is proj)
90    
91      def test_arc_layer(self):      def test_arc_layer(self):
92          """Test Layer with arc shapes"""          """Test Layer with arc shapes"""
93          layer = Layer("Test Layer", self.open_shapefile("roads-line.shp"))          layer = self.layer = Layer("Test Layer",
94          self.assertEquals(layer.Title(), "Test Layer")                                     self.open_shapefile("roads-line.shp"))
95          self.assertEquals(layer.ShapeType(), SHAPETYPE_ARC)          self.assertEquals(layer.ShapeType(), SHAPETYPE_ARC)
96          self.assertEquals(layer.NumShapes(), 839)          self.assertEquals(layer.NumShapes(), 839)
97          shape = layer.Shape(32)          shape = layer.Shape(32)
# Line 86  class TestLayer(unittest.TestCase, suppo Line 122  class TestLayer(unittest.TestCase, suppo
122          self.assertEquals(layer.ShapesBoundingBox([]), None)          self.assertEquals(layer.ShapesBoundingBox([]), None)
123          self.assertEquals(layer.ShapesBoundingBox(None), None)          self.assertEquals(layer.ShapesBoundingBox(None), None)
124    
         layer.Destroy()  
   
125      def test_polygon_layer(self):      def test_polygon_layer(self):
126          """Test Layer with polygon shapes"""          """Test Layer with polygon shapes"""
127          layer = Layer("Test Layer", self.open_shapefile("political.shp"))          layer = self.layer = Layer("Test Layer",
128          self.assertEquals(layer.Title(), "Test Layer")                                     self.open_shapefile("political.shp"))
129          self.assertEquals(layer.ShapeType(), SHAPETYPE_POLYGON)          self.assertEquals(layer.ShapeType(), SHAPETYPE_POLYGON)
130          self.assertEquals(layer.NumShapes(), 156)          self.assertEquals(layer.NumShapes(), 156)
131          shape = layer.Shape(4)          shape = layer.Shape(4)
# Line 105  class TestLayer(unittest.TestCase, suppo Line 139  class TestLayer(unittest.TestCase, suppo
139                                    -13.495815277099609, 66.563774108886719])                                    -13.495815277099609, 66.563774108886719])
140          self.assertEquals(layer.ShapesInRegion((-24.0, 64.0, -23.9, 64.1)),          self.assertEquals(layer.ShapesInRegion((-24.0, 64.0, -23.9, 64.1)),
141                            [91, 92, 144, 146, 148, 150, 152, 153])                            [91, 92, 144, 146, 148, 150, 152, 153])
         layer.Destroy()  
142    
143      def test_point_layer(self):      def test_point_layer(self):
144          """Test Layer with point shapes"""          """Test Layer with point shapes"""
145          layer = Layer("Test Layer",          layer = self.layer = Layer("Test Layer",
146                        self.open_shapefile("cultural_landmark-point.shp"))                             self.open_shapefile("cultural_landmark-point.shp"))
         self.assertEquals(layer.Title(), "Test Layer")  
147          self.assertEquals(layer.ShapeType(), SHAPETYPE_POINT)          self.assertEquals(layer.ShapeType(), SHAPETYPE_POINT)
148          self.assertEquals(layer.NumShapes(), 34)          self.assertEquals(layer.NumShapes(), 34)
149          shape = layer.Shape(0)          shape = layer.Shape(0)
# Line 122  class TestLayer(unittest.TestCase, suppo Line 154  class TestLayer(unittest.TestCase, suppo
154                                    -15.12291431427002, 66.36572265625])                                    -15.12291431427002, 66.36572265625])
155          self.assertEquals(layer.ShapesInRegion((-24.0, 64.0, -23.80, 64.1)),          self.assertEquals(layer.ShapesInRegion((-24.0, 64.0, -23.80, 64.1)),
156                            [0, 1, 2, 3, 4, 5, 27, 28, 29, 30, 31])                            [0, 1, 2, 3, 4, 5, 27, 28, 29, 30, 31])
         layer.Destroy()  
157    
158      def test_empty_layer(self):      def test_empty_layer(self):
159          """Test Layer with empty shape file"""          """Test Layer with empty shape file"""
# Line 137  class TestLayer(unittest.TestCase, suppo Line 168  class TestLayer(unittest.TestCase, suppo
168          dbf.add_field("NAME", dbflib.FTString, 20, 0)          dbf.add_field("NAME", dbflib.FTString, 20, 0)
169    
170          # Now try to open it.          # Now try to open it.
171          layer = Layer("Empty Layer",          layer = self.layer = Layer("Empty Layer",
172                        self.session.OpenShapefile(shapefilename))                                     self.session.OpenShapefile(shapefilename))
173          self.assertEquals(layer.BoundingBox(), None)          self.assertEquals(layer.BoundingBox(), None)
174          self.assertEquals(layer.LatLongBoundingBox(), None)          self.assertEquals(layer.LatLongBoundingBox(), None)
175          self.assertEquals(layer.NumShapes(), 0)          self.assertEquals(layer.NumShapes(), 0)
         layer.Destroy()  
176    
177      def test_get_field_type(self):      def test_get_field_type(self):
178          """Test Layer.GetFieldType()"""          """Test Layer.GetFieldType()"""
179          layer = Layer("Test Layer", self.open_shapefile("roads-line.shp"))          layer = self.layer = Layer("Test Layer",
180                                       self.open_shapefile("roads-line.shp"))
181          self.assertEquals(layer.GetFieldType("LENGTH"), FIELDTYPE_DOUBLE)          self.assertEquals(layer.GetFieldType("LENGTH"), FIELDTYPE_DOUBLE)
182          self.assertEquals(layer.GetFieldType("non existing"), None)          self.assertEquals(layer.GetFieldType("non existing"), None)
183          layer.Destroy()  
184        def test_raster_layer(self):
185            filename = self.build_path("island.tif")
186            layer = RasterLayer("Test RasterLayer", filename)
187            self.assertEquals(layer.GetImageFilename(), filename)
188            self.assertFloatSeqEqual(layer.BoundingBox(),
189                                     [-24.5500000, 63.2833330,
190                                      -13.4916670, 66.5666670])
191            self.assertFloatSeqEqual(layer.LatLongBoundingBox(),
192                                     [-24.5500000, 63.2833330,
193                                      -13.4916670, 66.5666670])
194    
195        def test_derived_store(self):
196            """Test layer with derived store"""
197            layer = self.layer = Layer("Test Layer",
198                                       self.open_shapefile("roads-line.shp"))
199            try:
200                store = layer.ShapeStore()
201                derived = DerivedShapeStore(store, store.Table())
202                layer.SetShapeStore(derived)
203                self.assert_(layer.ShapeStore() is derived)
204            finally:
205                store = derived = None
206    
207    
208    class SetShapeStoreTests(unittest.TestCase, support.SubscriberMixin):
209    
210        def setUp(self):
211            """Create a layer with a classification as self.layer"""
212            self.clear_messages()
213            self.session = Session("Test session for %s" % self.__class__)
214            self.shapefilename = os.path.join("..", "Data", "iceland",
215                                              "cultural_landmark-point.dbf")
216            self.store = self.session.OpenShapefile(self.shapefilename)
217            self.layer = Layer("test layer", self.store)
218            self.classification = Classification(field = "CLPTLABEL")
219            self.classification.AppendGroup(ClassGroupSingleton("FARM"))
220            self.layer.SetClassification(self.classification)
221            self.layer.UnsetModified()
222            self.layer.Subscribe(LAYER_SHAPESTORE_REPLACED,
223                                 self.subscribe_with_params,
224                                 LAYER_SHAPESTORE_REPLACED)
225            self.layer.Subscribe(LAYER_CHANGED,
226                                 self.subscribe_with_params, LAYER_CHANGED)
227    
228        def tearDown(self):
229            self.clear_messages()
230            self.layer.Destroy()
231            self.session.Destroy()
232            self.session = self.layer = self.store = self.classification = None
233    
234        def test_sanity(self):
235            """SetShapeStoreTests sanity check
236    
237            Test the initial state of the test case instances after setUp.
238            """
239            cls = self.layer.GetClassification()
240            self.assert_(cls is self.classification)
241            self.assertEquals(cls.GetField(), "CLPTLABEL")
242            self.assertEquals(cls.GetFieldType(), FIELDTYPE_STRING)
243            self.assertEquals(self.layer.GetClassification().GetNumGroups(), 1)
244            self.failIf(self.layer.WasModified())
245    
246        def test_set_shape_store_modified_flag(self):
247            """Test whether Layer.SetShapeStore() sets the modified flag"""
248            memtable = MemoryTable([("FOO", FIELDTYPE_STRING)],
249                          [("bla",)] * self.layer.ShapeStore().Table().NumRows())
250            self.layer.SetShapeStore(DerivedShapeStore(self.store, memtable))
251    
252            self.assert_(self.layer.WasModified())
253    
254        def test_set_shape_store_different_field_name(self):
255            """Test Layer.SetShapeStore() with different column name"""
256            memtable = MemoryTable([("FOO", FIELDTYPE_STRING)],
257                          [("bla",)] * self.layer.ShapeStore().Table().NumRows())
258            self.layer.SetShapeStore(DerivedShapeStore(self.store, memtable))
259            # The classification should contain only the default group now.
260            self.assertEquals(self.layer.GetClassification().GetNumGroups(), 0)
261            self.check_messages([(self.layer, LAYER_CHANGED),
262                                 (self.layer, LAYER_SHAPESTORE_REPLACED)])
263    
264        def test_set_shape_store_same_field(self):
265            """Test Layer.SetShapeStore() with same column name and type"""
266            memtable = MemoryTable([("CLPTLABEL", FIELDTYPE_STRING)],
267                          [("bla",)] * self.layer.ShapeStore().Table().NumRows())
268            self.layer.SetShapeStore(DerivedShapeStore(self.store, memtable))
269            # The classification should be the same as before
270            self.assert_(self.layer.GetClassification() is self.classification)
271            self.check_messages([(self.layer, LAYER_SHAPESTORE_REPLACED)])
272    
273        def test_set_shape_store_same_field_different_type(self):
274            """Test Layer.SetShapeStore() with same column name but different type
275            """
276            memtable = MemoryTable([("CLPTLABEL", FIELDTYPE_DOUBLE)],
277                          [(0.0,)] * self.layer.ShapeStore().Table().NumRows())
278            self.layer.SetShapeStore(DerivedShapeStore(self.store, memtable))
279            # The classification should contain only the default group now.
280            self.assertEquals(self.layer.GetClassification().GetNumGroups(), 0)
281            self.check_messages([(self.layer, LAYER_CHANGED),
282                                 (self.layer, LAYER_SHAPESTORE_REPLACED)])
283    
284    
285  class TestLayerLegend(unittest.TestCase, support.SubscriberMixin):  class TestLayerLegend(unittest.TestCase, support.SubscriberMixin):

Legend:
Removed from v.839  
changed lines
  Added in v.1142

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26