/[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 2446 by frank, Mon Dec 13 11:52:34 2004 UTC
# Line 1  Line 1 
1  # Copyright (c) 2002, 2003 by Intevation GmbH  # Copyright (c) 2002, 2003, 2004 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 16  files created by Thuban 0.2. Line 16  files created by Thuban 0.2.
16  Maintenance of the test cases:  Maintenance of the test cases:
17    
18  When during a development period the file format is changed with respect  When during a development period the file format is changed with respect
19  to the last released version for the first, the tests here should be  to the last released version for the first time, the tests here should
20  copied to the version specific test file. The round-trip tests which  be copied to the version specific test file.  The round-trip tests which
21  save the session again and compare the XML files should not be copied  save the session again and compare the XML files should not be copied
22  over as they only make sense here to make sure th that the files checked  over as they only make sense here to make sure th that the files checked
23  here are actually ones that may have been written by the current thuban  here are actually ones that may have been written by the current thuban
# 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-0.9.dtd"      dtd = "http://thuban.intevation.org/dtds/thuban-1.1-dev.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 154  class ClassificationTest(LoadSessionTest Line 162  class ClassificationTest(LoadSessionTest
162                  props.SetLineWidth(data[CLASSES][i][GROUP_PROPS][1])                  props.SetLineWidth(data[CLASSES][i][GROUP_PROPS][1])
163                  props.SetFill(                  props.SetFill(
164                      parse_color(data[CLASSES][i][GROUP_PROPS][2]))                      parse_color(data[CLASSES][i][GROUP_PROPS][2]))
165                    if len(data[CLASSES][i][GROUP_PROPS]) > 3:
166                        props.SetSize(data[CLASSES][i][GROUP_PROPS][3])
167    
168                  if data[CLASSES][i][GROUP_TYPE] == "default":                  if data[CLASSES][i][GROUP_TYPE] == "default":
169                      g = ClassGroupDefault(props, data[CLASSES][i][GROUP_LABEL])                      g = ClassGroupDefault(props, data[CLASSES][i][GROUP_LABEL])
# Line 173  class ClassificationTest(LoadSessionTest Line 183  class ClassificationTest(LoadSessionTest
183    
184  class TestSingleLayer(LoadSessionTest):  class TestSingleLayer(LoadSessionTest):
185    
186        # Note: The use of &amp; and non-ascii characters is deliberate. We
187        # want to test whether the loading code handles that correctly.
188      file_contents = '''\      file_contents = '''\
189  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
190  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
191  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
192          title="single map&amp;layer">          title="Stra\xc3\x9fen &amp; Landmarken">
193      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
194          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
195      <map title="Test Map">      <map title="\xc3\x9cbersicht">
196          <projection name="Unknown">          <projection epsg="32627" name="WGS 84 / UTM zone 27N">
197              <parameter value="zone=26"/>              <parameter value="datum=WGS84"/>
198                <parameter value="ellps=WGS84"/>
199              <parameter value="proj=utm"/>              <parameter value="proj=utm"/>
200              <parameter value="ellps=clrk66"/>              <parameter value="units=m"/>
201                <parameter value="zone=27"/>
202          </projection>          </projection>
203          <layer shapestore="D1" visible="true"          <layer shapestore="D1" visible="true"
204                  stroke="#000000" title="My Layer" stroke_width="1"                  stroke="#000000" title="K\xc3\xbcste" stroke_width="1"
205                  fill="None"/>                  fill="None"/>
206      </map>      </map>
207  </session>  </session>
# Line 200  class TestSingleLayer(LoadSessionTest): Line 214  class TestSingleLayer(LoadSessionTest):
214          self.session = session          self.session = session
215    
216          # Check the title          # Check the title
217          eq(session.Title(), "single map&layer")          eq(session.Title(), "Stra\xdfen & Landmarken")
218    
219          # the session has one map.          # the session has one map.
220          maps = session.Maps()          maps = session.Maps()
# Line 208  class TestSingleLayer(LoadSessionTest): Line 222  class TestSingleLayer(LoadSessionTest):
222    
223          # Check the map's attributes          # Check the map's attributes
224          map = maps[0]          map = maps[0]
225          eq(map.Title(), "Test Map")          eq(map.Title(), "\xdcbersicht")
226            proj = map.GetProjection()
227            eq(proj.GetName(), "WGS 84 / UTM zone 27N")
228            eq(proj.EPSGCode(), "32627")
229            params = proj.GetAllParameters()
230            params.sort()
231            eq(params, ["datum=WGS84", "ellps=WGS84", "proj=utm", "units=m",
232                        "zone=27"])
233    
234          # the map has a single layer          # the map has a single layer
235          layers = map.Layers()          layers = map.Layers()
# Line 216  class TestSingleLayer(LoadSessionTest): Line 237  class TestSingleLayer(LoadSessionTest):
237    
238          # Check the layer attributes          # Check the layer attributes
239          layer = layers[0]          layer = layers[0]
240          eq(layer.Title(), "My Layer")          eq(layer.Title(), "K\xfcste")
241          self.failUnless(filenames_equal(layer.ShapeStore().FileName(),          self.failUnless(filenames_equal(layer.ShapeStore().FileName(),
242                                          os.path.join(self.temp_dir(),                                          os.path.join(self.temp_dir(),
243                                                       os.pardir, os.pardir,                                                       os.pardir, os.pardir,
# Line 231  class TestSingleLayer(LoadSessionTest): Line 252  class TestSingleLayer(LoadSessionTest):
252          self.session.Destroy()          self.session.Destroy()
253          self.session = None          self.session = None
254    
255        def test_leak(self):
256            """Test load_session for resource leaks
257    
258            The load_session function had a resource leak in that it created
259            cyclic references. The objects would have been eventually
260            collected by the garbage collector but too late. One symptom is
261            that when layers are removed so that the last normal reference
262            owned indirectly by the session to a shape store goes away, the
263            shape store is not actually removed from the session even though
264            the session only keeps weak references because there are still
265            references owned by the cyclic garbage.
266            """
267            session = load_session(self.filename())
268            self.session = session
269    
270            # sanity check
271            self.assertEquals(len(session.ShapeStores()), 1)
272    
273            # remove the map. The shapestore should go away too
274            session.RemoveMap(session.Maps()[0])
275            self.assertEquals(len(session.ShapeStores()), 0)
276    
277    
278    class TestNonAsciiColumnName(LoadSessionTest):
279    
280        file_contents = '''\
281    <?xml version="1.0" encoding="UTF-8"?>
282    <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
283    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
284            title="Non ASCII column name test">
285        <fileshapesource filetype="shapefile" id="D1"
286            filename="TestNonAsciiColumnName.shp"/>
287        <map title="map">
288            <projection name="Some Projection">
289                <parameter value="datum=WGS84"/>
290                <parameter value="ellps=WGS84"/>
291                <parameter value="proj=utm"/>
292                <parameter value="units=m"/>
293                <parameter value="zone=27"/>
294            </projection>
295            <layer shapestore="D1" visible="true"
296                    stroke="#000000" title="layer" stroke_width="1"
297                    fill="None">
298                <classification field="Fl\xc3\xa4che" field_type="double">
299                    <clnull label="">
300                        <cldata stroke="#000000" stroke_width="1" fill="None"/>
301                    </clnull>
302                </classification>
303            </layer>
304        </map>
305    </session>
306    '''
307    
308        def test(self):
309            """Load a session with a single map with a single layer"""
310    
311            # Create a shapefile and a dbffile with a non-ascii column name
312            dbffile = self.temp_file_name("TestNonAsciiColumnName.dbf")
313            shpfile = self.temp_file_name("TestNonAsciiColumnName.shp")
314            dbf = dbflib.create(dbffile)
315            dbf.add_field('Fl\xe4che', dbflib.FTDouble, 10, 5)
316            dbf.write_record(0, (0.0,))
317            dbf.close()
318            shp = shapelib.create(shpfile, shapelib.SHPT_POLYGON)
319            shp.write_object(-1, shapelib.SHPObject(shapelib.SHPT_POLYGON, 1,
320                                                    [[(0,0), (10, 10), (10, 0),
321                                                      (0, 0)]]))
322            shp.close()
323    
324            try:
325                session = load_session(self.filename())
326            except ValueError, v:
327                # Usually if the field name is not decoded properly the
328                # loading fails because the field type mentioned in the file
329                # is not None as returned from the layer for a non-existing
330                # column name so we check for that and report it as failure.
331                # Other exceptions are errors in the test case.
332                if str(v) == "xml field type differs from database!":
333                    self.fail("Cannot load file with non-ascii column names")
334                else:
335                    raise
336            self.session = session
337    
338            # In case Thuban could load the file anyway (i.e. no ValueError
339            # exception in load_session()), check explicitly whether the
340            # field name was decoded properly. The test will probably lead
341            # to a UnicodeError instead of a test failure so we check that
342            # too
343            layer = session.Maps()[0].Layers()[0]
344            try:
345                self.assertEquals(layer.GetClassificationColumn(), 'Fl\xe4che')
346            except UnicodeError:
347                # FIXME: Obviously this will have to change if Thuban ever
348                # supports unicode properly.
349                self.fail("Column name was not converted to a bytestring")
350    
351            # roundtrip check
352            self.check_format()
353    
354    
355  class TestLayerVisibility(LoadSessionTest):  class TestLayerVisibility(LoadSessionTest):
356    
357      file_contents = '''\      file_contents = '''\
358  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
359  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
360  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
361          title="single map&amp;layer">          title="single map&amp;layer">
362      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
363          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 270  class TestLayerVisibility(LoadSessionTes Line 390  class TestLayerVisibility(LoadSessionTes
390          self.check_format()          self.check_format()
391    
392    
393    class TestSymbolSize(ClassificationTest):
394    
395        file_contents = '''\
396    <?xml version="1.0" encoding="UTF-8"?>
397    <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
398    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd" title="Thuban sample session">
399        <fileshapesource filetype="shapefile" id="D813968480" filename="../../Data/iceland/cultural_landmark-point.shp"/>
400        <map title="Iceland map">
401            <layer title="cultural_landmark-point" stroke_width="1" shapestore="D813968480" visible="true" stroke="#000000" fill="#000000">
402                <classification field="CLPTLABEL" field_type="string">
403                    <clnull label="">
404                        <cldata stroke="#000000" stroke_width="1" size="3" fill="#000000"/>
405                    </clnull>
406                    <clpoint label="" value="RUINS">
407                        <cldata stroke="#000000" stroke_width="1" size="6" fill="#ffffff"/>
408                    </clpoint>
409                    <clpoint label="" value="FARM">
410                        <cldata stroke="#000000" stroke_width="1" size="9" fill="#ffff00"/>
411                    </clpoint>
412                </classification>
413            </layer>
414        </map>
415    </session>
416    '''
417    
418        def test(self):
419            """Test that the size attribute for point symbols is correctly
420            loaded for a layer."""
421            eq = self.assertEquals
422            session = load_session(self.filename())
423            self.session = session
424    
425            map = session.Maps()[0] # only one map in the sample
426    
427            expected = [("cultural_landmark-point", 2,
428                            [("default", (), "",
429                                ("#000000", 1, "#000000", 3)),
430                             ("single", "RUINS", "",
431                                ("#000000", 1, "#ffffff", 6)),
432                             ("single", "FARM", "",
433                                ("#000000", 1, "#ffff00", 9))])]
434    
435            self.TestLayers(map.Layers(), expected)
436    
437            self.check_format()
438    
439    
440  class TestClassification(ClassificationTest):  class TestClassification(ClassificationTest):
441    
442      file_contents = '''\      file_contents = '''\
443  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
444  <!DOCTYPE session SYSTEM "thuban.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
445  <session title="single map&amp;layer">  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
446          <map title="Test Map">          title="single map&amp;layer">
447                  <projection>      <fileshapesource filetype="shapefile" id="D138389860"
448                          <parameter value="zone=26"/>          filename="../../Data/iceland/political.shp"/>
449                          <parameter value="proj=utm"/>      <fileshapesource filetype="shapefile" id="D138504492"
450                          <parameter value="ellps=clrk66"/>          filename="../../Data/iceland/political.shp"/>
451                  </projection>      <map title="Test Map">
452                  <layer title="My Layer" stroke_width="1" fill="None"          <projection name="">
453                      filename="../../Data/iceland/political.shp"              <parameter value="zone=26"/>
454                      stroke="#000000">              <parameter value="proj=utm"/>
455                <parameter value="ellps=clrk66"/>
456            </projection>
457            <layer shapestore="D138389860" visible="true" stroke="#000000"
458                    title="My Layer" stroke_width="1" fill="None">
459              <classification field="POPYREG" field_type="string">              <classification field="POPYREG" field_type="string">
460                  <clnull>                  <clnull label="">
461                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
462                  </clnull>                  </clnull>
463                  <clpoint value="1">                  <clpoint label="" value="1">
464                      <cldata stroke="#000000" stroke_width="2" fill="None"/>                      <cldata stroke="#000000" stroke_width="2" fill="None"/>
465                  </clpoint>                  </clpoint>
466                  <clpoint value="1">                  <clpoint label="" value="1">
467                      <cldata stroke="#000000" stroke_width="10" fill="None"/>                      <cldata stroke="#000000" stroke_width="10" fill="None"/>
468                  </clpoint>                  </clpoint>
469                  <clpoint value="\xc3\xa4\xc3\xb6\xc3\xbc"                  <clpoint label="\xc3\x9cml\xc3\xa4uts"
470                           label="\xc3\x9cml\xc3\xa4uts">                          value="\xc3\xa4\xc3\xb6\xc3\xbc">
471                      <cldata fill="None" stroke="#000000" stroke_width="1"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
472                  </clpoint>                  </clpoint>
473              </classification>              </classification>
474          </layer>          </layer>
475                  <layer title="My Layer 2" stroke_width="1" fill="None"          <layer shapestore="D138504492" visible="true" stroke="#000000"
476                      filename="../../Data/iceland/political.shp"                  title="My Layer 2" stroke_width="2" fill="None">
                     stroke="#000000">  
477              <classification field="AREA" field_type="double">              <classification field="AREA" field_type="double">
478                  <clnull>                  <clnull label="">
479                      <cldata stroke="#000000" stroke_width="2" fill="None"/>                      <cldata stroke="#000000" stroke_width="2" fill="None"/>
480                  </clnull>                  </clnull>
481                  <clrange min="0" max="1">                  <clrange label="" range="[0;1[">
482                      <cldata stroke="#111111" stroke_width="1" fill="None"/>                      <cldata stroke="#111111" stroke_width="1" fill="None"/>
483                  </clrange>                  </clrange>
484                  <clpoint value=".5">                  <clpoint label="" value="0.5">
485                      <cldata stroke="#000000" stroke_width="1" fill="#111111"/>                      <cldata stroke="#000000" stroke_width="1" fill="#111111"/>
486                  </clpoint>                  </clpoint>
487                  <clrange min="-1" max="0">                  <clrange label="" range="[-1;0[">
488                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
489                  </clrange>                  </clrange>
490                  <clpoint value="-.5">                  <clpoint label="" value="-0.5">
491                      <cldata stroke="#000000" stroke_width="1" fill="None"/>                      <cldata stroke="#000000" stroke_width="1" fill="None"/>
492                  </clpoint>                  </clpoint>
493              </classification>              </classification>
494          </layer>          </layer>
495          </map>      </map>
496  </session>  </session>
497  '''  '''
498    
# Line 356  class TestClassification(ClassificationT Line 526  class TestClassification(ClassificationT
526    
527          self.TestLayers(map.Layers(), expected)          self.TestLayers(map.Layers(), expected)
528    
529            self.check_format()
530    
531    
532  class TestLabels(ClassificationTest):  class TestLabels(ClassificationTest):
533    
534      file_contents = '''\      file_contents = '''\
535  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
536  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
537  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
538          title="single map&amp;layer">          title="single map&amp;layer">
539      <fileshapesource filetype="shapefile" id="D1"      <fileshapesource filetype="shapefile" id="D1"
540          filename="../../Data/iceland/political.shp"/>          filename="../../Data/iceland/political.shp"/>
# Line 409  class TestLayerProjection(LoadSessionTes Line 581  class TestLayerProjection(LoadSessionTes
581    
582      file_contents = '''\      file_contents = '''\
583  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
584  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
585  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
586          title="single map&amp;layer">          title="single map&amp;layer">
587      <fileshapesource filetype="shapefile" id="D2"      <fileshapesource filetype="shapefile" id="D2"
588          filename="../../Data/iceland/roads-line.shp"/>          filename="../../Data/iceland/roads-line.shp"/>
# Line 487  class TestRasterLayer(LoadSessionTest): Line 659  class TestRasterLayer(LoadSessionTest):
659    
660      file_contents = '''\      file_contents = '''\
661  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
662  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
663  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
664          title="single map&amp;layer">          title="single map&amp;layer">
665      <map title="Test Map">      <map title="Test Map">
666          <rasterlayer visible="false" filename="../../Data/iceland/island.tif"          <rasterlayer visible="false" filename="../../Data/iceland/island.tif"
# Line 521  class TestRasterLayer(LoadSessionTest): Line 693  class TestRasterLayer(LoadSessionTest):
693  class TestJoinedTable(LoadSessionTest):  class TestJoinedTable(LoadSessionTest):
694    
695      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
696  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
697  <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.1-dev.dtd" title="A Joined Table session">
698      <fileshapesource filetype="shapefile" id="D137227612"      <fileshapesource filetype="shapefile" id="D137227612"
699          filename="../../Data/iceland/roads-line.shp"/>          filename="../../Data/iceland/roads-line.shp"/>
700      <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"      <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"
# Line 566  class TestJoinedTable(LoadSessionTest): Line 738  class TestJoinedTable(LoadSessionTest):
738          self.check_format()          self.check_format()
739    
740    
741    class TestLabelLayer(LoadSessionTest):
742    
743        # Note that the labels deliberately contain non-ascii characters to
744        # test whether they're supported correctly.
745    
746        file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
747    <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
748    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd" title="Thuban sample session">
749        <fileshapesource filetype="shapefile" id="D145265052"
750            filename="../../Data/iceland/political.shp"/>
751        <fileshapesource filetype="shapefile" id="D145412868"
752            filename="../../Data/iceland/cultural_landmark-point.shp"/>
753        <map title="Iceland map">
754            <projection name="Unknown">
755                <parameter value="zone=26"/>
756                <parameter value="proj=utm"/>
757                <parameter value="ellps=clrk66"/>
758            </projection>
759            <layer shapestore="D145265052" visible="true" stroke="#000000"
760                    title="political" stroke_width="1" fill="#c0c0c0">
761                <projection name="Geographic">
762                    <parameter value="proj=latlong"/>
763                    <parameter value="to_meter=0.017453"/>
764                    <parameter value="ellps=clrk66"/>
765                </projection>
766            </layer>
767            <layer shapestore="D145412868" visible="true" stroke="#000000"
768                    title="landmarks" stroke_width="1" fill="#ffff00">
769                <projection name="Geographic">
770                    <parameter value="proj=latlong"/>
771                    <parameter value="to_meter=0.017453"/>
772                    <parameter value="ellps=clrk66"/>
773                </projection>
774            </layer>
775            <labellayer>
776                <label x="-21.5" y="64.25" text="RUINS"
777                    halign="left" valign="center"/>
778                <label x="-15.125" y="64.75" text="H\xc3\xbctte"
779                    halign="right" valign="top"/>
780            </labellayer>
781        </map>
782    </session>
783    '''
784    
785        def test(self):
786            """Test loading a session with a label layer"""
787            session = load_session(self.filename())
788            self.session = session
789    
790            label_layer = self.session.Maps()[0].LabelLayer()
791            expected_labels = [(-21.5, 64.25, "RUINS", ALIGN_LEFT, ALIGN_CENTER),
792                               (-15.125, 64.75, "H\xfctte", ALIGN_RIGHT, ALIGN_TOP),
793                               ]
794            for label, values in zip(label_layer.Labels(), expected_labels):
795                self.assertEquals((label.x, label.y, label.text, label.halign,
796                                   label.valign),
797                                  values)
798            self.check_format()
799    
800    
801  class TestPostGISLayer(LoadSessionTest):  class TestPostGISLayer(LoadSessionTest):
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-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
805  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.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"/>
809      <dbshapesource tablename="landmarks" id="D143149420" dbconn="D142684948"/>      <dbshapesource id="D143149420" dbconn="D142684948"
810            tablename="landmarks_point_id" id_column="point_id"
811            geometry_column="the_geom" />
812      <map title="unnamed map">      <map title="unnamed map">
813          <layer shapestore="D143149420" visible="true" stroke="#000000"          <layer shapestore="D143149420" visible="true" stroke="#000000"
814                  title="landmarks" stroke_width="1" fill="None"/>                  title="landmarks" stroke_width="1" fill="None"/>
# Line 619  class TestPostGISLayer(LoadSessionTest): Line 852  class TestPostGISLayer(LoadSessionTest):
852  class TestPostGISLayerPassword(LoadSessionTest):  class TestPostGISLayerPassword(LoadSessionTest):
853    
854      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>      file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
855  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
856  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
857          title="unnamed session">          title="unnamed session">
858      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"      <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
859          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>          dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
# Line 714  class TestLoadError(LoadSessionTest): Line 947  class TestLoadError(LoadSessionTest):
947    
948      file_contents = '''\      file_contents = '''\
949  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
950  <!DOCTYPE session SYSTEM "thuban-0.9.dtd">  <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
951  <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"  <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
952          title="single map&amp;layer">          title="single map&amp;layer">
953      <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>      <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>
954      <map title="Test Map">      <map title="Test Map">
# Line 742  class TestLoadError(LoadSessionTest): Line 975  class TestLoadError(LoadSessionTest):
975              # LoadError really was about the missing attribute              # LoadError really was about the missing attribute
976              self.assertEquals(str(value),              self.assertEquals(str(value),
977                "Element "                "Element "
978                "(u'http://thuban.intevation.org/dtds/thuban-0.9.dtd',"                "(u'http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd',"
979                " u'fileshapesource') requires an attribute 'filetype'")                " u'fileshapesource') requires an attribute 'filetype'")
980          else:          else:
981              self.fail("Missing filetype attribute doesn't raise LoadError")              self.fail("Missing filetype attribute doesn't raise LoadError")
982    
983    class Shapefile_CallBack:
984    
985        def __init__(self, params):
986            """Initialize the callback return values.
987              
988               params must be a dictionary of the potential CB modes (keys),
989               with lists of tuples of return values as values.
990               Depending on the test the callback can be called multiple,
991               each time a return value is poped from the list
992            """
993    
994            self.params = params
995    
996    
997        def s_cb(self, filename, mode = None, second_try= 0):
998            if self.params.has_key(mode):
999                return self.params[mode].pop(0)
1000            else:
1001                raise LoadError
1002            
1003    class TestAltPath(LoadSessionTest):
1004    
1005        """Test the various cases in the alternative path feature.
1006    
1007           The test checks the reasonable cases:
1008           - First recognition of a path error, fixed with user interaction.
1009           - First recognition of a path error, load cancelled.
1010           - Path error fixed from list, confirmed by user.
1011           - Path error fixed from list, changed by user.
1012           - Path error fixed from list, cancelled by user.
1013           - Path error wrongly fixed from list, manual fix forced.
1014        """
1015    
1016        file_contents = '''\
1017    <?xml version="1.0" encoding="UTF-8"?>
1018    <!DOCTYPE session SYSTEM "thuban-1.1.dtd">
1019    <session xmlns="http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd" title="Thuban sample session">
1020        <fileshapesource filetype="shapefile" id="D1108450956" filename="../../Data/iceland/political.shp"/>
1021        <fileshapesource filetype="shapefile" id="D1108900076" filename="../Data/iceland/roads-line.shp"/>
1022        <fileshapesource filetype="shapefile" id="D1108947244" filename="../../Data/iceland/cultural_landmark-point.shp"/>
1023        <map title="not the iceland map">
1024            <layer title="political" stroke_width="1" shapestore="D1108450956" visible="true" stroke="#000000" fill="#c0c0c0"/>
1025            <layer title="roads-line" stroke_width="1" shapestore="D1108900076" visible="true" stroke="#000000" fill="None"/>
1026            <layer title="something else" stroke_width="1" shapestore="D1108947244" visible="true" stroke="#000000" fill="None"/>
1027        </map>
1028    </session>
1029    '''
1030    
1031        def test_01_single_path_error_fix(self):
1032            """Test single file path error fix."""
1033            # The usual initial case
1034            s_cb = Shapefile_CallBack({
1035                        "search": [("../Data/iceland/roads-line.shp",0)],
1036                        "check": [(None, None)]})
1037            self.session = load_session(self.filename(),
1038                                        shapefile_callback =s_cb.s_cb)
1039            self.session.Destroy()
1040            self.session = None
1041    
1042        def test_02_path_error_fix_from_list(self):
1043            """Test single file path error fix."""
1044            # This represents the usual case for "from_list"
1045            s_cb = Shapefile_CallBack({
1046                    "search": [("../Data/iceland/roads-line.shp",1)],
1047                    "check": [(os.path.abspath("../Data/iceland/roads-line.shp"),1)]
1048                   })
1049            self.session = load_session(self.filename(),
1050                                        shapefile_callback =s_cb.s_cb)
1051            self.session.Destroy()
1052            self.session = None
1053    
1054        def test_03_single_path_error_cancelled(self):
1055            """Test alternative path cancelled."""
1056            s_cb = Shapefile_CallBack({
1057                        "search": [(None,0)],
1058                        "check": [(None, None)]})
1059            self.assertRaises(LoadCancelled,
1060                                load_session, self.filename(), None, s_cb.s_cb)
1061    
1062        def test_04_path_error_fix_from_list_cancelled(self):
1063            """Test alternative path from list cancelled."""
1064            s_cb = Shapefile_CallBack({
1065                    "search": [("../Data/iceland/roads-line.shp",1)],
1066                    "check": [(None,1)]
1067                   })
1068            self.assertRaises(LoadCancelled,
1069                                load_session, self.filename(), None, s_cb.s_cb)
1070    
1071        def test_05_path_error_fix_from_list_changed(self):
1072            """Test alternative path from list changed."""
1073            s_cb = Shapefile_CallBack({
1074                    "search": [("../Data/iceland/roads-line.shp",1)],
1075                    "check": [("../Data/iceland/roads-line.shp",0)]
1076                   })
1077            self.session = load_session(self.filename(),
1078                                        shapefile_callback =s_cb.s_cb)
1079            self.session.Destroy()
1080            self.session = None
1081    
1082        def test_06_path_error_fix_from_list_fails(self):
1083            """Test alternative path recovery from list."""
1084            s_cb = Shapefile_CallBack({
1085                    "search": [("../wrong/iceland/roads-line.shp",1),
1086                                ("../Data/iceland/roads-line.shp",0)],
1087                    "check": [(None,None)]
1088                   })
1089            self.session = load_session(self.filename(),
1090                                        shapefile_callback =s_cb.s_cb)
1091            self.assertRaises(IndexError,
1092                                s_cb.s_cb, None, "search")
1093            
1094            self.session.Destroy()
1095            self.session = None
1096    
1097    
1098  if __name__ == "__main__":  if __name__ == "__main__":
1099      support.run_tests()      support.run_tests()

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26