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

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

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

revision 1687 by bh, Fri Aug 29 10:02:16 2003 UTC revision 2004 by bh, Tue Dec 2 13:25:55 2003 UTC
# Line 38  import postgissupport Line 38  import postgissupport
38  from xmlsupport import sax_eventlist  from xmlsupport import sax_eventlist
39    
40  import dbflib  import dbflib
41    import shapelib
42    
43  from Thuban.Model.save import save_session  from Thuban.Model.save import save_session
44  from Thuban.Model.load import load_session, parse_color, LoadError, \  from Thuban.Model.load import load_session, parse_color, LoadError, \
# Line 46  from Thuban.Model.color import Transpare Line 47  from Thuban.Model.color import Transpare
47  from Thuban.Model.classification import ClassGroupProperties, ClassGroupRange,\  from Thuban.Model.classification import ClassGroupProperties, ClassGroupRange,\
48      ClassGroupSingleton, ClassGroupDefault      ClassGroupSingleton, ClassGroupDefault
49  from Thuban.Model.postgisdb import ConnectionError  from Thuban.Model.postgisdb import ConnectionError
50    from Thuban.Model.table import DBFTable, MemoryTable, \
51         FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING, \
52         table_to_dbf
53    
54    
55  def filenames_equal(name1, name2):  def filenames_equal(name1, name2):
56      """Return true if the filenames name1 and name2 are equal.      """Return true if the filenames name1 and name2 are equal.
# Line 82  class LoadSessionTest(support.FileLoadTe Line 87  class LoadSessionTest(support.FileLoadTe
87          self.session = None          self.session = None
88    
89    
90      dtd = "http://thuban.intevation.org/dtds/thuban-0.9.dtd"      dtd = "http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
91      thubanids = [((dtd, n), (None, "id")) for n in      thubanids = [((dtd, n), (None, "id")) for n in
92                   ["fileshapesource", "filetable", "jointable",                   ["fileshapesource", "filetable", "jointable",
93                    "derivedshapesource"]]                    "derivedshapesource"]]
# Line 92  class LoadSessionTest(support.FileLoadTe Line 97  class LoadSessionTest(support.FileLoadTe
97                       ("jointable", "right"),                       ("jointable", "right"),
98                       ("derivedshapesource", "table"),                       ("derivedshapesource", "table"),
99                       ("derivedshapesource", "shapesource")]]                       ("derivedshapesource", "shapesource")]]
100      filenames = [((dtd, n), (None, m)) for n, m in  
101                   [("fileshapesource", "filename"),      # The filenames in the tests should be understandable on all
102                    ("rasterlayer", "filename"),      # currently supported platforms so filenames is an empty list
103                    ("filetable", "filename")]]      filenames = []
104    
105      del n, m, dtd      del n, m, dtd
106    
107      def check_format(self):      def check_format(self):
# Line 173  class ClassificationTest(LoadSessionTest Line 179  class ClassificationTest(LoadSessionTest
179    
180  class TestSingleLayer(LoadSessionTest):  class TestSingleLayer(LoadSessionTest):
181    
182        # Note: The use of & and non-ascii characters is deliberate. We
183        # want to test whether the loading code handles that correctly.
184      file_contents = '''\      file_contents = '''\
185  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
186  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
187  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
188          title="single map&amp;layer">          title="Stra\xc3\x9fen &amp; Landmarken">
189      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
190          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
191      <map title="Test Map">      <map title="\xc3\x9cbersicht">
192          <projection name="Unknown">          <projection epsg="32627" name="WGS 84 / UTM zone 27N">
193              <parameter value="zone=26"/>              <parameter value="datum=WGS84"/>
194                <parameter value="ellps=WGS84"/>
195              <parameter value="proj=utm"/>              <parameter value="proj=utm"/>
196              <parameter value="ellps=clrk66"/>              <parameter value="units=m"/>
197                <parameter value="zone=27"/>
198          </projection>          </projection>
199          <layer shapestore="D1" visible="true"          <layer shapestore="D1" visible="true"
200                  stroke="#000000" title="My Layer" stroke_width="1"                  stroke="#000000" title="K\xc3\xbcste" stroke_width="1"
201                  fill="None"/>                  fill="None"/>
202      </map>      </map>
203  </session>  </session>
# Line 200  class TestSingleLayer(LoadSessionTest): Line 210  class TestSingleLayer(LoadSessionTest):
210          self.session = session          self.session = session
211    
212          # Check the title          # Check the title
213          eq(session.Title(), "single map&layer")          eq(session.Title(), "Stra\xdfen & Landmarken")
214    
215          # the session has one map.          # the session has one map.
216          maps = session.Maps()          maps = session.Maps()
# Line 208  class TestSingleLayer(LoadSessionTest): Line 218  class TestSingleLayer(LoadSessionTest):
218    
219          # Check the map's attributes          # Check the map's attributes
220          map = maps[0]          map = maps[0]
221          eq(map.Title(), "Test Map")          eq(map.Title(), "\xdcbersicht")
222            proj = map.GetProjection()
223            eq(proj.GetName(), "WGS 84 / UTM zone 27N")
224            eq(proj.EPSGCode(), "32627")
225            params = proj.GetAllParameters()
226            params.sort()
227            eq(params, ["datum=WGS84", "ellps=WGS84", "proj=utm", "units=m",
228                        "zone=27"])
229    
230          # the map has a single layer          # the map has a single layer
231          layers = map.Layers()          layers = map.Layers()
# Line 216  class TestSingleLayer(LoadSessionTest): Line 233  class TestSingleLayer(LoadSessionTest):
233    
234          # Check the layer attributes          # Check the layer attributes
235          layer = layers[0]          layer = layers[0]
236          eq(layer.Title(), "My Layer")          eq(layer.Title(), "K\xfcste")
237          self.failUnless(filenames_equal(layer.ShapeStore().FileName(),          self.failUnless(filenames_equal(layer.ShapeStore().FileName(),
238                                          os.path.join(self.temp_dir(),                                          os.path.join(self.temp_dir(),
239                                                       os.pardir, os.pardir,                                                       os.pardir, os.pardir,
# Line 231  class TestSingleLayer(LoadSessionTest): Line 248  class TestSingleLayer(LoadSessionTest):
248          self.session.Destroy()          self.session.Destroy()
249          self.session = None          self.session = None
250    
251        def test_leak(self):
252            """Test load_session for resource leaks
253    
254            The load_session function had a resource leak in that it created
255            cyclic references. The objects would have been eventually
256            collected by the garbage collector but too late. One symptom is
257            that when layers are removed so that the last normal reference
258            owned indirectly by the session to a shape store goes away, the
259            shape store is not actually removed from the session even though
260            the session only keeps weak references because there are still
261            references owned by the cyclic garbage.
262            """
263            session = load_session(self.filename())
264            self.session = session
265    
266            # sanity check
267            self.assertEquals(len(session.ShapeStores()), 1)
268    
269            # remove the map. The shapestore should go away too
270            session.RemoveMap(session.Maps()[0])
271            self.assertEquals(len(session.ShapeStores()), 0)
272    
273    
274    class TestNonAsciiColumnName(LoadSessionTest):
275    
276        file_contents = '''\
277    <?xml version="1.0" encoding="UTF-8"?>
278    <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
279    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
280            title="Non ASCII column name test">
281        <fileshapesource filetype="shapefile" id="D1"
282            filename="TestNonAsciiColumnName.shp"/>
283        <map title="map">
284            <projection name="Some Projection">
285                <parameter value="datum=WGS84"/>
286                <parameter value="ellps=WGS84"/>
287                <parameter value="proj=utm"/>
288                <parameter value="units=m"/>
289                <parameter value="zone=27"/>
290            </projection>
291            <layer shapestore="D1" visible="true"
292                    stroke="#000000" title="layer" stroke_width="1"
293                    fill="None">
294                <classification field="Fl\xc3\xa4che" field_type="double">
295                    <clnull label="">
296                        <cldata stroke="#000000" stroke_width="1" fill="None"/>
297                    </clnull>
298                </classification>
299            </layer>
300        </map>
301    </session>
302    '''
303    
304        def test(self):
305            """Load a session with a single map with a single layer"""
306    
307            # Create a shapefile and a dbffile with a non-ascii column name
308            dbffile = self.temp_file_name("TestNonAsciiColumnName.dbf")
309            shpfile = self.temp_file_name("TestNonAsciiColumnName.shp")
310            dbf = dbflib.create(dbffile)
311            dbf.add_field('Fl\xe4che', dbflib.FTDouble, 10, 5)
312            dbf.write_record(0, (0.0,))
313            dbf.close()
314            shp = shapelib.create(shpfile, shapelib.SHPT_POLYGON)
315            shp.write_object(-1, shapelib.SHPObject(shapelib.SHPT_POLYGON, 1,
316                                                    [[(0,0), (10, 10), (10, 0),
317                                                      (0, 0)]]))
318            shp.close()
319    
320            try:
321                session = load_session(self.filename())
322            except ValueError, v:
323                # Usually if the field name is not decoded properly the
324                # loading fails because the field type mentioned in the file
325                # is not None as returned from the layer for a non-existing
326                # column name so we check for that and report it as failure.
327                # Other exceptions are errors in the test case.
328                if str(v) == "xml field type differs from database!":
329                    self.fail("Cannot load file with non-ascii column names")
330                else:
331                    raise
332            self.session = session
333    
334            # In case Thuban could load the file anyway (i.e. no ValueError
335            # exception in load_session()), check explicitly whether the
336            # field name was decoded properly. The test will probably lead
337            # to a UnicodeError instead of a test failure so we check that
338            # too
339            layer = session.Maps()[0].Layers()[0]
340            try:
341                self.assertEquals(layer.GetClassificationColumn(), 'Fl\xe4che')
342            except UnicodeError:
343                # FIXME: Obviously this will have to change if Thuban ever
344                # supports unicode properly.
345                self.fail("Column name was not converted to a bytestring")
346    
347            # roundtrip check
348            self.check_format()
349    
350    
351  class TestLayerVisibility(LoadSessionTest):  class TestLayerVisibility(LoadSessionTest):
352    
353      file_contents = '''\      file_contents = '''\
354  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
355  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
356  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
357          title="single map&amp;layer">          title="single map&amp;layer">
358      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
359          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 274  class TestClassification(ClassificationT Line 390  class TestClassification(ClassificationT
390    
391      file_contents = '''\      file_contents = '''\
392  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
393  <!DOCTYPE session SYSTEM "thuban.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
394  <session title="single map&amp;layer">  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
395          <map title="Test Map">          title="single map&amp;layer">
396                  <projection>      <fileshapesource filetype="shapefile" id="D138389860"
397                          <parameter value="zone=26"/>          filename="../../Data/iceland/political.shp"/>
398                          <parameter value="proj=utm"/>      <fileshapesource filetype="shapefile" id="D138504492"
399                          <parameter value="ellps=clrk66"/>          filename="../../Data/iceland/political.shp"/>
400                  </projection>      <map title="Test Map">
401                  <layer title="My Layer" stroke_width="1" fill="None"          <projection name="">
402                      filename="../../Data/iceland/political.shp"              <parameter value="zone=26"/>
403                      stroke="#000000">              <parameter value="proj=utm"/>
404                <parameter value="ellps=clrk66"/>
405            </projection>
406            <layer shapestore="D138389860" visible="true" stroke="#000000"
407                    title="My Layer" stroke_width="1" fill="None">
408              <classification field="POPYREG" field_type="string">              <classification field="POPYREG" field_type="string">
409                  <clnull>                  <clnull label="">
410                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
411                  </clnull>                  </clnull>
412                  <clpoint value="1">                  <clpoint label="" value="1">
413                      <cldata stroke="#000000" stroke_width="2" fill="None"/>                      <cldata stroke="#000000" stroke_width="2" fill="None"/>
414                  </clpoint>                  </clpoint>
415                  <clpoint value="1">                  <clpoint label="" value="1">
416                      <cldata stroke="#000000" stroke_width="10" fill="None"/>                      <cldata stroke="#000000" stroke_width="10" fill="None"/>
417                  </clpoint>                  </clpoint>
418                  <clpoint value="\xc3\xa4\xc3\xb6\xc3\xbc"                  <clpoint label="\xc3\x9cml\xc3\xa4uts"
419                           label="\xc3\x9cml\xc3\xa4uts">                          value="\xc3\xa4\xc3\xb6\xc3\xbc">
420                      <cldata fill="None" stroke="#000000" stroke_width="1"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
421                  </clpoint>                  </clpoint>
422              </classification>              </classification>
423          </layer>          </layer>
424                  <layer title="My Layer 2" stroke_width="1" fill="None"          <layer shapestore="D138504492" visible="true" stroke="#000000"
425                      filename="../../Data/iceland/political.shp"                  title="My Layer 2" stroke_width="2" fill="None">
                     stroke="#000000">  
426              <classification field="AREA" field_type="double">              <classification field="AREA" field_type="double">
427                  <clnull>                  <clnull label="">
428                      <cldata stroke="#000000" stroke_width="2" fill="None"/>                      <cldata stroke="#000000" stroke_width="2" fill="None"/>
429                  </clnull>                  </clnull>
430                  <clrange min="0" max="1">                  <clrange label="" range="[0;1[">
431                      <cldata stroke="#111111" stroke_width="1" fill="None"/>                      <cldata stroke="#111111" stroke_width="1" fill="None"/>
432                  </clrange>                  </clrange>
433                  <clpoint value=".5">                  <clpoint label="" value="0.5">
434                      <cldata stroke="#000000" stroke_width="1" fill="#111111"/>                      <cldata stroke="#000000" stroke_width="1" fill="#111111"/>
435                  </clpoint>                  </clpoint>
436                  <clrange min="-1" max="0">                  <clrange label="" range="[-1;0[">
437                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
438                  </clrange>                  </clrange>
439                  <clpoint value="-.5">                  <clpoint label="" value="-0.5">
440                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
441                  </clpoint>                  </clpoint>
442              </classification>              </classification>
443          </layer>          </layer>
444          </map>      </map>
445  </session>  </session>
446  '''  '''
447    
# Line 356  class TestClassification(ClassificationT Line 475  class TestClassification(ClassificationT
475    
476          self.TestLayers(map.Layers(), expected)          self.TestLayers(map.Layers(), expected)
477    
478            self.check_format()
479    
480    
481  class TestLabels(ClassificationTest):  class TestLabels(ClassificationTest):
482    
483      file_contents = '''\      file_contents = '''\
484  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
485  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
486  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
487          title="single map&amp;layer">          title="single map&amp;layer">
488      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
489          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 409  class TestLayerProjection(LoadSessionTes Line 530  class TestLayerProjection(LoadSessionTes
530    
531      file_contents = '''\      file_contents = '''\
532  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
533  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
534  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
535          title="single map&amp;layer">          title="single map&amp;layer">
536      <fileshapesource filetype="shapefile" id="D2"      <fileshapesource filetype="shapefile" id="D2"
537          filename="../../Data/iceland/roads-line.shp"/>          filename="../../Data/iceland/roads-line.shp"/>
# Line 487  class TestRasterLayer(LoadSessionTest): Line 608  class TestRasterLayer(LoadSessionTest):
608    
609      file_contents = '''\      file_contents = '''\
610  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
611  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
612  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
613          title="single map&amp;layer">          title="single map&amp;layer">
614      <map title="Test Map">      <map title="Test Map">
615          <rasterlayer visible="false" filename="../../Data/iceland/island.tif"          <rasterlayer visible="false" filename="../../Data/iceland/island.tif"
# Line 521  class TestRasterLayer(LoadSessionTest): Line 642  class TestRasterLayer(LoadSessionTest):
642  class TestJoinedTable(LoadSessionTest):  class TestJoinedTable(LoadSessionTest):
643    
644      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
645  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
646  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd" title="A Joined Table session">  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd" title="A Joined Table session">
647      <fileshapesource filetype="shapefile" id="D137227612"      <fileshapesource filetype="shapefile" id="D137227612"
648          filename="../../Data/iceland/roads-line.shp"/>          filename="../../Data/iceland/roads-line.shp"/>
649      <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"      <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"
# Line 570  class TestJoinedTable(LoadSessionTest): Line 691  class TestJoinedTable(LoadSessionTest):
691  class TestPostGISLayer(LoadSessionTest):  class TestPostGISLayer(LoadSessionTest):
692    
693      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
694  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
695  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
696          title="unnamed session">          title="unnamed session">
697      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
698          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
# Line 619  class TestPostGISLayer(LoadSessionTest): Line 740  class TestPostGISLayer(LoadSessionTest):
740  class TestPostGISLayerPassword(LoadSessionTest):  class TestPostGISLayerPassword(LoadSessionTest):
741    
742      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
743  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
744  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
745          title="unnamed session">          title="unnamed session">
746      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
747          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
# Line 714  class TestLoadError(LoadSessionTest): Line 835  class TestLoadError(LoadSessionTest):
835    
836      file_contents = '''\      file_contents = '''\
837  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
838  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
839  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
840          title="single map&amp;layer">          title="single map&amp;layer">
841      <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>      <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>
842      <map title="Test Map">      <map title="Test Map">
# Line 742  class TestLoadError(LoadSessionTest): Line 863  class TestLoadError(LoadSessionTest):
863              # LoadError really was about the missing attribute              # LoadError really was about the missing attribute
864              self.assertEquals(str(value),              self.assertEquals(str(value),
865                "Element "                "Element "
866                "(u'http://thuban.intevation.org/dtds/thuban-0.9.dtd',"                "(u'http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd',"
867                " u'fileshapesource') requires an attribute 'filetype'")                " u'fileshapesource') requires an attribute 'filetype'")
868          else:          else:
869              self.fail("Missing filetype attribute doesn't raise LoadError")              self.fail("Missing filetype attribute doesn't raise LoadError")

Legend:
Removed from v.1687  
changed lines
  Added in v.2004

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26