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

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

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

revision 742 by jonathan, Fri Apr 25 09:14:41 2003 UTC revision 1811 by bh, Mon Oct 13 13:36:34 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2002 by Intevation GmbH  # Copyright (c) 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 16  __version__ = "$Revision$" Line 16  __version__ = "$Revision$"
16  import unittest  import unittest
17  import os  import os
18    
19    import xmlsupport
20  import support  import support
21  support.initthuban()  support.initthuban()
22    
23  from Thuban.Model.proj import Projection, ProjFile  from Thuban import _
24    from Thuban.Model.proj import Projection, ProjFile, \
25         PROJ_UNITS_METERS, PROJ_UNITS_DEGREES
26    
27  import Thuban.Model.resource as resource  import Thuban.Model.resource as resource
28    
29  from test_save import sax_eventlist  from xmlsupport import sax_eventlist
30    
31  from xml.sax import SAXParseException  from xml.sax import SAXParseException
32    
# Line 35  class TestProjection(unittest.TestCase, Line 38  class TestProjection(unittest.TestCase,
38    
39      def test(self):      def test(self):
40          """Test Projection"""          """Test Projection"""
41          proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])          params = ["zone=26", "proj=utm", "ellps=clrk66"]
42          self.assertEquals(proj.params, ["zone=26", "proj=utm", "ellps=clrk66"])          proj = Projection(params)
43            self.assertEquals(proj.params, params)
44    
45          # It's not clear whether this value is really the correct one          # It's not clear whether this value is really the correct one
46          # but a test failure here probably still means a bug somewhere          # but a test failure here probably still means a bug somewhere
# Line 51  class TestProjection(unittest.TestCase, Line 55  class TestProjection(unittest.TestCase,
55                                    3875381.8535437919, 252962.10480170773),                                    3875381.8535437919, 252962.10480170773),
56                                   epsilon = 1e-5)                                   epsilon = 1e-5)
57    
58            # GetName()
59            self.assertEquals(proj.GetName(), _("Unknown"))
60    
61            # GetParameter()
62          self.assertEquals(proj.GetParameter("zone"), "26")          self.assertEquals(proj.GetParameter("zone"), "26")
63          self.assertEquals(proj.GetParameter("proj"), "utm")          self.assertEquals(proj.GetParameter("proj"), "utm")
64          self.assertEquals(proj.GetParameter("ellps"), "clrk66")          self.assertEquals(proj.GetParameter("ellps"), "clrk66")
65          self.assertEquals(proj.GetParameter("hallo"), "")          self.assertEquals(proj.GetParameter("hallo"), "")
66    
67            # GetAllParameters()
68            self.assertEquals(proj.GetAllParameters(), params)
69    
70            # GetName()
71            proj = Projection(params, "MyName")
72            self.assertEquals(proj.GetName(), "MyName")
73    
74        def test_get_parameter_without_equals_sign(self):
75            """Test Projection.GetParameter() for a parameter without '=' sign"""
76            proj = Projection(["proj=utm", "zone=34", "south", "ellps=clrk66"])
77            # The Projection class pretends that for parameters specified
78            # without a value the value is the same as the parameter name.
79            self.assertEquals(proj.GetParameter("south"), "south")
80    
81        def test_get_projection_units_geo(self):
82            """Test Projection.GetProjectedUnits() for geographic projection"""
83            proj = Projection(["proj=latlong", "to_meter=0.017453292519943295",
84                               "ellps=clrk66"])
85            self.assertEquals(proj.GetProjectedUnits(), PROJ_UNITS_DEGREES)
86    
87        def test_get_projection_units_normal(self):
88            """Test Projection.GetProjectedUnits() for normal projection"""
89            proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
90            self.assertEquals(proj.GetProjectedUnits(), PROJ_UNITS_METERS)
91    
92    
93  sample_projfile = '''\  sample_projfile = '''\
94  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
95  <!DOCTYPE projfile SYSTEM "thuban.dtd">  <!DOCTYPE projectionlist SYSTEM "projfile.dtd">
96  <projectionlist>  <projectionlist>
97      <projection name="Transverse Mercartor">      <projection name="Transverse Mercator">
98          <parameter value="proj=tmerc"/>          <parameter value="proj=tmerc"/>
99          <parameter value="ellps=clrk66"/>          <parameter value="ellps=clrk66"/>
100          <parameter value="lat_0=90w"/>          <parameter value="lat_0=90w"/>
101          <parameter value="lon_0=90w"/>          <parameter value="lon_0=90w"/>
102          <parameter value="k=1"/>          <parameter value="k=1"/>
103      </projection>      </projection>
104      <projection name="Transverse Mercartor">      <projection name="Transverse Mercator">
105          <parameter value="proj=tmerc"/>          <parameter value="proj=tmerc"/>
106          <parameter value="ellps=clrk66"/>          <parameter value="ellps=clrk66"/>
107          <parameter value="lat_0=30w"/>          <parameter value="lat_0=30w"/>
108          <parameter value="lon_0=30w"/>          <parameter value="lon_0=30w"/>
109          <parameter value="k=1"/>          <parameter value="k=1"/>
110      </projection>      </projection>
111      <projection name="Universal Transverse Mercartor">      <projection name="Universal Transverse Mercator">
112          <parameter value="proj=utm"/>          <parameter value="proj=utm"/>
113          <parameter value="ellps=clrk66"/>          <parameter value="ellps=clrk66"/>
114          <parameter value="zone=1"/>          <parameter value="zone=1"/>
# Line 83  sample_projfile = '''\ Line 116  sample_projfile = '''\
116  </projectionlist>  </projectionlist>
117  '''  '''
118    
119  sample_projfile_data = [("Transverse Mercartor", ["proj=tmerc",  sample_projfile_data = [("Transverse Mercator", ["proj=tmerc",
120                                                    "ellps=clrk66",                                                    "ellps=clrk66",
121                                                    "lat_0=90w",                                                    "lat_0=90w",
122                                                    "lon_0=90w",                                                    "lon_0=90w",
123                                                    "k=1"]),                                                    "k=1"]),
124                          ("Transverse Mercartor", ["proj=tmerc",                          ("Transverse Mercator", ["proj=tmerc",
125                                                    "ellps=clrk66",                                                    "ellps=clrk66",
126                                                    "lat_0=30w",                                                    "lat_0=30w",
127                                                    "lon_0=30w",                                                    "lon_0=30w",
128                                                    "k=1"]),                                                    "k=1"]),
129                          ("Universal Transverse Mercartor", ["proj=utm",                          ("Universal Transverse Mercator", ["proj=utm",
130                                                              "ellps=clrk66",                                                              "ellps=clrk66",
131                                                              "zone=1"])]                                                              "zone=1"])]
132    
133  sample_projfile2 = '''\  sample_projfile2 = '''\
134  <?xml version="1.0" encoding="UTF-8"?>  <?xml version="1.0" encoding="UTF-8"?>
135  <!DOCTYPE projfile SYSTEM "thuban.dtd">  <!DOCTYPE projectionlist SYSTEM "projfile.dtd">
136  <projectionlist>  <projectionlist>
137  </projectionlist>  </projectionlist>
138  '''  '''
139    
140  sample_projfile_data2 = []  sample_projfile_data2 = []
141    
142  class TestProjFile(unittest.TestCase, support.FileTestMixin):  class TestProjFile(unittest.TestCase, support.FileTestMixin,
143                       xmlsupport.ValidationTest):
144    
145      """Test cases for reading and writing projection files.      """Test cases for reading and writing projection files.
146      """      """
# Line 119  class TestProjFile(unittest.TestCase, su Line 153  class TestProjFile(unittest.TestCase, su
153    
154          proj0 = Projection(["proj=tmerc", "ellps=clrk66"])          proj0 = Projection(["proj=tmerc", "ellps=clrk66"])
155          proj1 = Projection(["proj=utm", "ellps=clrk66"])          proj1 = Projection(["proj=utm", "ellps=clrk66"])
156          proj2 = Projection(["proj=lcc", "ellps=clrk66"])          proj2 = Projection(["proj=lcc", "ellps=clrk66",
157                                "lat_1=0", "lat_2=20"])
158    
159          eq = self.assertEquals          eq = self.assertEquals
160    
161    
162          #          #
163          # __init__()          # __init__()
164          # GetFilename()          # GetFilename()
# Line 149  class TestProjFile(unittest.TestCase, su Line 185  class TestProjFile(unittest.TestCase, su
185          eq(len(projFile.GetProjections()), 0)          eq(len(projFile.GetProjections()), 0)
186    
187          # try to remove something that doesn't exist          # try to remove something that doesn't exist
188            self.assertRaises(ValueError, projFile.Remove, None)
189          self.assertRaises(ValueError, projFile.Remove, proj0)          self.assertRaises(ValueError, projFile.Remove, proj0)
190    
191          projFile.Add(proj0)          projFile.Add(proj0)
# Line 162  class TestProjFile(unittest.TestCase, su Line 199  class TestProjFile(unittest.TestCase, su
199          eq(projs[1], proj1)          eq(projs[1], proj1)
200          eq(projs[2], proj2)          eq(projs[2], proj2)
201    
202      def testRead(self):          projFile.Remove(proj2)
203          """Test ReadProjFile"""          projFile.Remove(proj1)
204    
205            # Replace()
206            projFile.Replace(proj0, proj1)
207            projs = projFile.GetProjections()
208            eq(projs[0], proj1)
209    
210            # replace a non-existent projection
211            self.assertRaises(ValueError, projFile.Replace, None, proj2)
212            self.assertRaises(ValueError, projFile.Replace, proj0, proj2)
213    
214        def testRead(self):
215            """Test read_proj_file"""
216          self.doTestRead(sample_projfile_data, sample_projfile)          self.doTestRead(sample_projfile_data, sample_projfile)
217          self.doTestRead(sample_projfile_data2, sample_projfile2)          self.doTestRead(sample_projfile_data2, sample_projfile2)
218    
219          #      def test_read_non_existing_file(self):
220          # file doesn't exist          """Test read_proj_file with non-existing file"""
         #  
221          self.assertRaises(IOError,          self.assertRaises(IOError,
222              resource.ReadProjFile, self.temp_file_name("nonexistent.proj"))                            resource.read_proj_file,
223                              self.temp_file_name("nonexistent.proj"))
224    
225          #      def test_read_unreadable_file(self):
226          # file isn't readable          """Test read_proj_file with unreadable file
227          #  
228            As currently written this only works on unix-like systems and
229            not e.g. on MS Windows.
230            """
231          filename = self.temp_file_name("projfile.proj")          filename = self.temp_file_name("projfile.proj")
232          file = open(filename, "w")          file = open(filename, "w")
233          file.close()          file.close()
234          os.chmod(filename, 0200) # write-only          os.chmod(filename, 0200) # write-only
235          self.assertRaises(IOError, resource.ReadProjFile, filename)          self.assertRaises(IOError, resource.read_proj_file, filename)
236          os.chmod(filename, 0600) # read/write so we reuse the file          os.chmod(filename, 0600) # read/write so we reuse the file
237    
238          #      def test_read_empty_file(self):
239          # file has invalid XML (or none at all)          """Test read_proj_file with empty file"""
         #  
240          filename = self.temp_file_name("projfile.proj")          filename = self.temp_file_name("projfile.proj")
241          file = open(filename, "w")          file = open(filename, "w")
242          file.close()          file.close()
243    
244          self.assertRaises(SAXParseException, resource.ReadProjFile, filename)          self.assertRaises(SAXParseException, resource.read_proj_file, filename)
245    
246      def testWrite(self):      def testWrite(self):
247          """Test WriteProjFile"""          """Test write_proj_file"""
248    
249          self.doTestWrite(sample_projfile_data, sample_projfile)          self.doTestWrite(sample_projfile_data, sample_projfile)
250          self.doTestWrite(sample_projfile_data2, sample_projfile2)          self.doTestWrite(sample_projfile_data2, sample_projfile2)
# Line 207  class TestProjFile(unittest.TestCase, su Line 257  class TestProjFile(unittest.TestCase, su
257          for proj in data:          for proj in data:
258              pf.Add(Projection(proj[1], proj[0]))              pf.Add(Projection(proj[1], proj[0]))
259    
260          resource.WriteProjFile(pf)          resource.write_proj_file(pf)
261    
262          file = open(filename)          file = open(filename)
263          written_contents = file.read()          written_contents = file.read()
264          file.close()          file.close()
265          self.compare_xml(written_contents, expected)          self.compare_xml(written_contents, expected)
266            self.validate_data(written_contents)
267            self.validate_data(expected)
268    
269      def doTestRead(self, data, input):      def doTestRead(self, data, input):
270    
# Line 221  class TestProjFile(unittest.TestCase, su Line 273  class TestProjFile(unittest.TestCase, su
273          file.write(input)          file.write(input)
274          file.close()          file.close()
275    
276          pf = resource.ReadProjFile(filename)          pf, warnings = resource.read_proj_file(filename)
277            self.assertEquals(warnings, [])
278    
279          eq = self.assertEquals          eq = self.assertEquals
280    
# Line 232  class TestProjFile(unittest.TestCase, su Line 285  class TestProjFile(unittest.TestCase, su
285              for param in proj.GetAllParameters():              for param in proj.GetAllParameters():
286                  self.assert_(param in d[1])                  self.assert_(param in d[1])
287    
288        def test_get_system_proj_file(self):
289            """Test resource.get_system_proj_file()
290    
291            This is primarily to test whether the system proj file contains
292            invalid projection paramers and whether the proj file is not
293            empty
294            """
295            projfile, warnings = resource.get_system_proj_file()
296            self.assertEquals(warnings, [])
297            self.assert_(len(projfile.GetProjections()) > 0)
298    
299    
300    class TestProjFileWithInvalidParameters(unittest.TestCase,
301                                            support.FileLoadTestCase):
302    
303        file_extension = ".proj"
304        file_contents = '''\
305    <?xml version="1.0" encoding="UTF-8"?>
306    <!DOCTYPE projectionlist SYSTEM "projfile.dtd">
307    <projectionlist>
308        <projection name="Universal Transverse Mercator">
309            <parameter value="proj=utm"/>
310            <parameter value="ellps=clrk66"/>
311            <!-- an invalid zone number to trigger the parameter checking
312                 in the proj library -->
313            <parameter value="zone=1000"/>
314        </projection>
315        <projection name="Transverse Mercator">
316            <parameter value="proj=tmerc"/>
317            <parameter value="ellps=clrk66"/>
318            <parameter value="lat_0=90w"/>
319            <parameter value="lon_0=90w"/>
320            <parameter value="k=1"/>
321        </projection>
322    </projectionlist>
323    '''
324    
325        def setUp(self):
326            support.FileLoadTestCase.setUp(self)
327    
328        def test(self):
329            """Test reading a proj file with invalid parameters"""
330            projfile, warnings = resource.read_proj_file(self.filename())
331            projs = projfile.GetProjections()
332            self.assertEquals(len(projs), 1)
333            params = projs[0].GetAllParameters()[:]
334            params.sort()
335            self.assertEquals(params, ['ellps=clrk66', 'k=1', 'lat_0=90w',
336                                       'lon_0=90w', 'proj=tmerc'])
337            self.assertEquals(warnings,
338                           ['Error in projection "Universal Transverse Mercator":'
339                            ' invalid UTM zone number'])
340    
341    
342    
343  if __name__ == "__main__":  if __name__ == "__main__":
344      unittest.main()      unittest.main()

Legend:
Removed from v.742  
changed lines
  Added in v.1811

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26