/[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 1848 by bh, Tue Oct 21 11:06:56 2003 UTC revision 2034 by bh, Mon Dec 22 16:35:16 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    from Thuban.Model.label import ALIGN_CENTER, ALIGN_TOP, ALIGN_BOTTOM, \
54         ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE
55    
56    
57  def filenames_equal(name1, name2):  def filenames_equal(name1, name2):
58      """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 89  class LoadSessionTest(support.FileLoadTe
89          self.session = None          self.session = None
90    
91    
92      dtd = "http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"      dtd = "http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
93      thubanids = [((dtd, n), (None, "id")) for n in      thubanids = [((dtd, n), (None, "id")) for n in
94                   ["fileshapesource", "filetable", "jointable",                   ["fileshapesource", "filetable", "jointable",
95                    "derivedshapesource"]]                    "derivedshapesource"]]
# Line 92  class LoadSessionTest(support.FileLoadTe Line 99  class LoadSessionTest(support.FileLoadTe
99                       ("jointable", "right"),                       ("jointable", "right"),
100                       ("derivedshapesource", "table"),                       ("derivedshapesource", "table"),
101                       ("derivedshapesource", "shapesource")]]                       ("derivedshapesource", "shapesource")]]
102      filenames = [((dtd, n), (None, m)) for n, m in  
103                   [("fileshapesource", "filename"),      # The filenames in the tests should be understandable on all
104                    ("rasterlayer", "filename"),      # currently supported platforms so filenames is an empty list
105                    ("filetable", "filename")]]      filenames = []
106    
107      del n, m, dtd      del n, m, dtd
108    
109      def check_format(self):      def check_format(self):
# Line 178  class TestSingleLayer(LoadSessionTest): Line 186  class TestSingleLayer(LoadSessionTest):
186      file_contents = '''\      file_contents = '''\
187  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
188  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
189  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
190          title="Stra\xc3\x9fen &amp; Landmarken">          title="Stra\xc3\x9fen &amp; Landmarken">
191      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
192          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 242  class TestSingleLayer(LoadSessionTest): Line 250  class TestSingleLayer(LoadSessionTest):
250          self.session.Destroy()          self.session.Destroy()
251          self.session = None          self.session = None
252    
253        def test_leak(self):
254            """Test load_session for resource leaks
255    
256            The load_session function had a resource leak in that it created
257            cyclic references. The objects would have been eventually
258            collected by the garbage collector but too late. One symptom is
259            that when layers are removed so that the last normal reference
260            owned indirectly by the session to a shape store goes away, the
261            shape store is not actually removed from the session even though
262            the session only keeps weak references because there are still
263            references owned by the cyclic garbage.
264            """
265            session = load_session(self.filename())
266            self.session = session
267    
268            # sanity check
269            self.assertEquals(len(session.ShapeStores()), 1)
270    
271            # remove the map. The shapestore should go away too
272            session.RemoveMap(session.Maps()[0])
273            self.assertEquals(len(session.ShapeStores()), 0)
274    
275    
276    class TestNonAsciiColumnName(LoadSessionTest):
277    
278        file_contents = '''\
279    <?xml version="1.0" encoding="UTF-8"?>
280    <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
281    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
282            title="Non ASCII column name test">
283        <fileshapesource filetype="shapefile" id="D1"
284            filename="TestNonAsciiColumnName.shp"/>
285        <map title="map">
286            <projection name="Some Projection">
287                <parameter value="datum=WGS84"/>
288                <parameter value="ellps=WGS84"/>
289                <parameter value="proj=utm"/>
290                <parameter value="units=m"/>
291                <parameter value="zone=27"/>
292            </projection>
293            <layer shapestore="D1" visible="true"
294                    stroke="#000000" title="layer" stroke_width="1"
295                    fill="None">
296                <classification field="Fl\xc3\xa4che" field_type="double">
297                    <clnull label="">
298                        <cldata stroke="#000000" stroke_width="1" fill="None"/>
299                    </clnull>
300                </classification>
301            </layer>
302        </map>
303    </session>
304    '''
305    
306        def test(self):
307            """Load a session with a single map with a single layer"""
308    
309            # Create a shapefile and a dbffile with a non-ascii column name
310            dbffile = self.temp_file_name("TestNonAsciiColumnName.dbf")
311            shpfile = self.temp_file_name("TestNonAsciiColumnName.shp")
312            dbf = dbflib.create(dbffile)
313            dbf.add_field('Fl\xe4che', dbflib.FTDouble, 10, 5)
314            dbf.write_record(0, (0.0,))
315            dbf.close()
316            shp = shapelib.create(shpfile, shapelib.SHPT_POLYGON)
317            shp.write_object(-1, shapelib.SHPObject(shapelib.SHPT_POLYGON, 1,
318                                                    [[(0,0), (10, 10), (10, 0),
319                                                      (0, 0)]]))
320            shp.close()
321    
322            try:
323                session = load_session(self.filename())
324            except ValueError, v:
325                # Usually if the field name is not decoded properly the
326                # loading fails because the field type mentioned in the file
327                # is not None as returned from the layer for a non-existing
328                # column name so we check for that and report it as failure.
329                # Other exceptions are errors in the test case.
330                if str(v) == "xml field type differs from database!":
331                    self.fail("Cannot load file with non-ascii column names")
332                else:
333                    raise
334            self.session = session
335    
336            # In case Thuban could load the file anyway (i.e. no ValueError
337            # exception in load_session()), check explicitly whether the
338            # field name was decoded properly. The test will probably lead
339            # to a UnicodeError instead of a test failure so we check that
340            # too
341            layer = session.Maps()[0].Layers()[0]
342            try:
343                self.assertEquals(layer.GetClassificationColumn(), 'Fl\xe4che')
344            except UnicodeError:
345                # FIXME: Obviously this will have to change if Thuban ever
346                # supports unicode properly.
347                self.fail("Column name was not converted to a bytestring")
348    
349            # roundtrip check
350            self.check_format()
351    
352    
353  class TestLayerVisibility(LoadSessionTest):  class TestLayerVisibility(LoadSessionTest):
354    
355      file_contents = '''\      file_contents = '''\
356  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
357  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
358  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
359          title="single map&amp;layer">          title="single map&amp;layer">
360      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
361          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 285  class TestClassification(ClassificationT Line 392  class TestClassification(ClassificationT
392    
393      file_contents = '''\      file_contents = '''\
394  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
395  <!DOCTYPE session SYSTEM "thuban.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
396  <session title="single map&amp;layer">  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
397          <map title="Test Map">          title="single map&amp;layer">
398                  <projection>      <fileshapesource filetype="shapefile" id="D138389860"
399                          <parameter value="zone=26"/>          filename="../../Data/iceland/political.shp"/>
400                          <parameter value="proj=utm"/>      <fileshapesource filetype="shapefile" id="D138504492"
401                          <parameter value="ellps=clrk66"/>          filename="../../Data/iceland/political.shp"/>
402                  </projection>      <map title="Test Map">
403                  <layer title="My Layer" stroke_width="1" fill="None"          <projection name="">
404                      filename="../../Data/iceland/political.shp"              <parameter value="zone=26"/>
405                      stroke="#000000">              <parameter value="proj=utm"/>
406                <parameter value="ellps=clrk66"/>
407            </projection>
408            <layer shapestore="D138389860" visible="true" stroke="#000000"
409                    title="My Layer" stroke_width="1" fill="None">
410              <classification field="POPYREG" field_type="string">              <classification field="POPYREG" field_type="string">
411                  <clnull>                  <clnull label="">
412                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
413                  </clnull>                  </clnull>
414                  <clpoint value="1">                  <clpoint label="" value="1">
415                      <cldata stroke="#000000" stroke_width="2" fill="None"/>                      <cldata stroke="#000000" stroke_width="2" fill="None"/>
416                  </clpoint>                  </clpoint>
417                  <clpoint value="1">                  <clpoint label="" value="1">
418                      <cldata stroke="#000000" stroke_width="10" fill="None"/>                      <cldata stroke="#000000" stroke_width="10" fill="None"/>
419                  </clpoint>                  </clpoint>
420                  <clpoint value="\xc3\xa4\xc3\xb6\xc3\xbc"                  <clpoint label="\xc3\x9cml\xc3\xa4uts"
421                           label="\xc3\x9cml\xc3\xa4uts">                          value="\xc3\xa4\xc3\xb6\xc3\xbc">
422                      <cldata fill="None" stroke="#000000" stroke_width="1"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
423                  </clpoint>                  </clpoint>
424              </classification>              </classification>
425          </layer>          </layer>
426                  <layer title="My Layer 2" stroke_width="1" fill="None"          <layer shapestore="D138504492" visible="true" stroke="#000000"
427                      filename="../../Data/iceland/political.shp"                  title="My Layer 2" stroke_width="2" fill="None">
                     stroke="#000000">  
428              <classification field="AREA" field_type="double">              <classification field="AREA" field_type="double">
429                  <clnull>                  <clnull label="">
430                      <cldata stroke="#000000" stroke_width="2" fill="None"/>                      <cldata stroke="#000000" stroke_width="2" fill="None"/>
431                  </clnull>                  </clnull>
432                  <clrange min="0" max="1">                  <clrange label="" range="[0;1[">
433                      <cldata stroke="#111111" stroke_width="1" fill="None"/>                      <cldata stroke="#111111" stroke_width="1" fill="None"/>
434                  </clrange>                  </clrange>
435                  <clpoint value=".5">                  <clpoint label="" value="0.5">
436                      <cldata stroke="#000000" stroke_width="1" fill="#111111"/>                      <cldata stroke="#000000" stroke_width="1" fill="#111111"/>
437                  </clpoint>                  </clpoint>
438                  <clrange min="-1" max="0">                  <clrange label="" range="[-1;0[">
439                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
440                  </clrange>                  </clrange>
441                  <clpoint value="-.5">                  <clpoint label="" value="-0.5">
442                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
443                  </clpoint>                  </clpoint>
444              </classification>              </classification>
445          </layer>          </layer>
446          </map>      </map>
447  </session>  </session>
448  '''  '''
449    
# Line 367  class TestClassification(ClassificationT Line 477  class TestClassification(ClassificationT
477    
478          self.TestLayers(map.Layers(), expected)          self.TestLayers(map.Layers(), expected)
479    
480            self.check_format()
481    
482    
483  class TestLabels(ClassificationTest):  class TestLabels(ClassificationTest):
484    
485      file_contents = '''\      file_contents = '''\
486  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
487  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
488  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
489          title="single map&amp;layer">          title="single map&amp;layer">
490      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
491          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 421  class TestLayerProjection(LoadSessionTes Line 533  class TestLayerProjection(LoadSessionTes
533      file_contents = '''\      file_contents = '''\
534  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
535  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
536  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
537          title="single map&amp;layer">          title="single map&amp;layer">
538      <fileshapesource filetype="shapefile" id="D2"      <fileshapesource filetype="shapefile" id="D2"
539          filename="../../Data/iceland/roads-line.shp"/>          filename="../../Data/iceland/roads-line.shp"/>
# Line 499  class TestRasterLayer(LoadSessionTest): Line 611  class TestRasterLayer(LoadSessionTest):
611      file_contents = '''\      file_contents = '''\
612  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
613  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
614  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
615          title="single map&amp;layer">          title="single map&amp;layer">
616      <map title="Test Map">      <map title="Test Map">
617          <rasterlayer visible="false" filename="../../Data/iceland/island.tif"          <rasterlayer visible="false" filename="../../Data/iceland/island.tif"
# Line 533  class TestJoinedTable(LoadSessionTest): Line 645  class TestJoinedTable(LoadSessionTest):
645    
646      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
647  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
648  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd" title="A Joined Table session">  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd" title="A Joined Table session">
649      <fileshapesource filetype="shapefile" id="D137227612"      <fileshapesource filetype="shapefile" id="D137227612"
650          filename="../../Data/iceland/roads-line.shp"/>          filename="../../Data/iceland/roads-line.shp"/>
651      <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"      <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"
# Line 577  class TestJoinedTable(LoadSessionTest): Line 689  class TestJoinedTable(LoadSessionTest):
689          self.check_format()          self.check_format()
690    
691    
692    class TestLabelLayer(LoadSessionTest):
693    
694        # Note that the labels deliberately contain non-ascii characters to
695        # test whether they're supported correctly.
696    
697        file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
698    <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
699    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd" title="Thuban sample session">
700        <fileshapesource filetype="shapefile" id="D145265052"
701            filename="../../Data/iceland/political.shp"/>
702        <fileshapesource filetype="shapefile" id="D145412868"
703            filename="../../Data/iceland/cultural_landmark-point.shp"/>
704        <map title="Iceland map">
705            <projection name="Unknown">
706                <parameter value="zone=26"/>
707                <parameter value="proj=utm"/>
708                <parameter value="ellps=clrk66"/>
709            </projection>
710            <layer shapestore="D145265052" visible="true" stroke="#000000"
711                    title="political" stroke_width="1" fill="#c0c0c0">
712                <projection name="Geographic">
713                    <parameter value="proj=latlong"/>
714                    <parameter value="to_meter=0.017453"/>
715                    <parameter value="ellps=clrk66"/>
716                </projection>
717            </layer>
718            <layer shapestore="D145412868" visible="true" stroke="#000000"
719                    title="landmarks" stroke_width="1" fill="#ffff00">
720                <projection name="Geographic">
721                    <parameter value="proj=latlong"/>
722                    <parameter value="to_meter=0.017453"/>
723                    <parameter value="ellps=clrk66"/>
724                </projection>
725            </layer>
726            <labellayer>
727                <label x="-21.5" y="64.25" text="RUINS"
728                    halign="left" valign="center"/>
729                <label x="-15.125" y="64.75" text="H\xc3\xbctte"
730                    halign="right" valign="top"/>
731            </labellayer>
732        </map>
733    </session>
734    '''
735    
736        def test(self):
737            """Test loading a session with a label layer"""
738            session = load_session(self.filename())
739            self.session = session
740    
741            label_layer = self.session.Maps()[0].LabelLayer()
742            expected_labels = [(-21.5, 64.25, "RUINS", ALIGN_LEFT, ALIGN_CENTER),
743                               (-15.125, 64.75, "H\xfctte", ALIGN_RIGHT, ALIGN_TOP),
744                               ]
745            for label, values in zip(label_layer.Labels(), expected_labels):
746                self.assertEquals((label.x, label.y, label.text, label.halign,
747                                   label.valign),
748                                  values)
749            self.check_format()
750    
751    
752  class TestPostGISLayer(LoadSessionTest):  class TestPostGISLayer(LoadSessionTest):
753    
754      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
755  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
756  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
757          title="unnamed session">          title="unnamed session">
758      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
759          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
# Line 631  class TestPostGISLayerPassword(LoadSessi Line 802  class TestPostGISLayerPassword(LoadSessi
802    
803      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
804  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
805  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
806          title="unnamed session">          title="unnamed session">
807      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
808          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
# Line 726  class TestLoadError(LoadSessionTest): Line 897  class TestLoadError(LoadSessionTest):
897      file_contents = '''\      file_contents = '''\
898  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
899  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">  <!DOCTYPE session SYSTEM "thuban-1.0.dtd">
900  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd"
901          title="single map&amp;layer">          title="single map&amp;layer">
902      <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>      <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>
903      <map title="Test Map">      <map title="Test Map">
# Line 753  class TestLoadError(LoadSessionTest): Line 924  class TestLoadError(LoadSessionTest):
924              # LoadError really was about the missing attribute              # LoadError really was about the missing attribute
925              self.assertEquals(str(value),              self.assertEquals(str(value),
926                "Element "                "Element "
927                "(u'http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd',"                "(u'http://thuban.intevation.org/dtds/thuban-1.0rc1.dtd',"
928                " u'fileshapesource') requires an attribute 'filetype'")                " u'fileshapesource') requires an attribute 'filetype'")
929          else:          else:
930              self.fail("Missing filetype attribute doesn't raise LoadError")              self.fail("Missing filetype attribute doesn't raise LoadError")

Legend:
Removed from v.1848  
changed lines
  Added in v.2034

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26