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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1813 - (show annotations)
Mon Oct 13 14:01:37 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/test/test_proj.py
File MIME type: text/x-python
File size: 11871 byte(s)
Some more refactoring of the test cases
(ProjFileTest): New base class for the proj file tests.
(TestProjFile): Derive from ProjFileTest
(TestProjFile.test_read_unreadable_file)
(TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
the new filename method to get a unique filename
(TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
(WriteProjFileTests): New class for proj file write tests.
Contains the write test that were in TestProjFile originally.

1 # Copyright (c) 2002, 2003 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with Thuban for details.
7
8 """
9 Test the Thuban-specific Projection class
10 """
11
12 __version__ = "$Revision$"
13 # $Source$
14 # $Id$
15
16 import unittest
17 import os
18
19 import xmlsupport
20 import support
21 support.initthuban()
22
23 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
28
29 from xmlsupport import sax_eventlist
30
31 from xml.sax import SAXParseException
32
33
34 class TestProjection(unittest.TestCase, support.FloatComparisonMixin):
35
36 """Test cases for the Thuban-specific Projection class
37 """
38
39 def test(self):
40 """Test Projection"""
41 params = ["zone=26", "proj=utm", "ellps=clrk66"]
42 proj = Projection(params)
43 self.assertEquals(proj.params, params)
44
45 # It's not clear whether this value is really the correct one
46 # but a test failure here probably still means a bug somewhere
47 self.assertFloatSeqEqual(proj.Forward(0, 0),
48 [3623101.8103431347, 0.0],
49 epsilon = 1e-5)
50 self.assertFloatSeqEqual(proj.Inverse(3623101.8103431347, 0.0),
51 [-0.00065775699878736467, 0])
52
53 self.assertFloatSeqEqual(proj.ForwardBBox((0, 0, 2, 2)),
54 (3620891.3077618643, 0.0,
55 3875381.8535437919, 252962.10480170773),
56 epsilon = 1e-5)
57
58 # GetName()
59 self.assertEquals(proj.GetName(), _("Unknown"))
60
61 # GetParameter()
62 self.assertEquals(proj.GetParameter("zone"), "26")
63 self.assertEquals(proj.GetParameter("proj"), "utm")
64 self.assertEquals(proj.GetParameter("ellps"), "clrk66")
65 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 = '''\
94 <?xml version="1.0" encoding="UTF-8"?>
95 <!DOCTYPE projectionlist SYSTEM "projfile.dtd">
96 <projectionlist>
97 <projection name="Transverse Mercator">
98 <parameter value="proj=tmerc"/>
99 <parameter value="ellps=clrk66"/>
100 <parameter value="lat_0=90w"/>
101 <parameter value="lon_0=90w"/>
102 <parameter value="k=1"/>
103 </projection>
104 <projection name="Transverse Mercator">
105 <parameter value="proj=tmerc"/>
106 <parameter value="ellps=clrk66"/>
107 <parameter value="lat_0=30w"/>
108 <parameter value="lon_0=30w"/>
109 <parameter value="k=1"/>
110 </projection>
111 <projection name="Universal Transverse Mercator">
112 <parameter value="proj=utm"/>
113 <parameter value="ellps=clrk66"/>
114 <parameter value="zone=1"/>
115 </projection>
116 </projectionlist>
117 '''
118
119 sample_projfile_data = [("Transverse Mercator", ["proj=tmerc",
120 "ellps=clrk66",
121 "lat_0=90w",
122 "lon_0=90w",
123 "k=1"]),
124 ("Transverse Mercator", ["proj=tmerc",
125 "ellps=clrk66",
126 "lat_0=30w",
127 "lon_0=30w",
128 "k=1"]),
129 ("Universal Transverse Mercator", ["proj=utm",
130 "ellps=clrk66",
131 "zone=1"])]
132
133 sample_projfile2 = '''\
134 <?xml version="1.0" encoding="UTF-8"?>
135 <!DOCTYPE projectionlist SYSTEM "projfile.dtd">
136 <projectionlist>
137 </projectionlist>
138 '''
139
140 sample_projfile_data2 = []
141
142 class ProjFileTest(unittest.TestCase, support.FileTestMixin):
143
144 """Base class for the proj file tests"""
145
146 def filename(self):
147 """Return the filename for the test"""
148 return self.temp_file_name(self.id() + ".proj")
149
150
151 class TestProjFile(ProjFileTest, xmlsupport.ValidationTest):
152
153 """Test cases for reading and writing projection files.
154 """
155
156 def test(self):
157 """Test ProjFile"""
158
159 proj0 = Projection(["proj=tmerc", "ellps=clrk66"])
160 proj1 = Projection(["proj=utm", "ellps=clrk66"])
161 proj2 = Projection(["proj=lcc", "ellps=clrk66",
162 "lat_1=0", "lat_2=20"])
163
164 eq = self.assertEquals
165
166
167 #
168 # __init__()
169 # GetFilename()
170 # SetFilename()
171 #
172 for name in ["", "hello_world"]:
173 projFile = ProjFile(name)
174 eq(projFile.GetFilename(), name)
175
176 projFile.SetFilename("XXX")
177 projFile.SetFilename(name)
178 eq(projFile.GetFilename(), name)
179
180 # initial number of projections should be 0
181 eq(len(projFile.GetProjections()), 0)
182
183 #
184 # Add()
185 # Remove()
186 #
187 projFile.Add(proj0)
188 eq(len(projFile.GetProjections()), 1)
189 projFile.Remove(proj0)
190 eq(len(projFile.GetProjections()), 0)
191
192 # try to remove something that doesn't exist
193 self.assertRaises(ValueError, projFile.Remove, None)
194 self.assertRaises(ValueError, projFile.Remove, proj0)
195
196 projFile.Add(proj0)
197 projFile.Add(proj1)
198 projFile.Add(proj2)
199 eq(len(projFile.GetProjections()), 3)
200
201 # GetProjections() -- tests order
202 projs = projFile.GetProjections()
203 eq(projs[0], proj0)
204 eq(projs[1], proj1)
205 eq(projs[2], proj2)
206
207 projFile.Remove(proj2)
208 projFile.Remove(proj1)
209
210 # Replace()
211 projFile.Replace(proj0, proj1)
212 projs = projFile.GetProjections()
213 eq(projs[0], proj1)
214
215 # replace a non-existent projection
216 self.assertRaises(ValueError, projFile.Replace, None, proj2)
217 self.assertRaises(ValueError, projFile.Replace, proj0, proj2)
218
219 def testRead(self):
220 """Test read_proj_file"""
221 self.doTestRead(sample_projfile_data, sample_projfile)
222 self.doTestRead(sample_projfile_data2, sample_projfile2)
223
224 def test_read_non_existing_file(self):
225 """Test read_proj_file with non-existing file"""
226 self.assertRaises(IOError,
227 resource.read_proj_file,
228 self.temp_file_name("nonexistent.proj"))
229
230 def test_read_unreadable_file(self):
231 """Test read_proj_file with unreadable file
232
233 As currently written this only works on unix-like systems and
234 not e.g. on MS Windows.
235 """
236 filename = self.filename()
237 file = open(filename, "w")
238 file.close()
239 os.chmod(filename, 0200) # write-only
240 self.assertRaises(IOError, resource.read_proj_file, filename)
241 os.chmod(filename, 0600) # read/write so we reuse the file
242
243 def test_read_empty_file(self):
244 """Test read_proj_file with empty file"""
245 filename = self.filename()
246 file = open(filename, "w")
247 file.close()
248
249 self.assertRaises(SAXParseException, resource.read_proj_file, filename)
250
251 def doTestRead(self, data, input):
252
253 filename = self.filename()
254 file = open(filename, "w")
255 file.write(input)
256 file.close()
257
258 pf, warnings = resource.read_proj_file(filename)
259 self.assertEquals(warnings, [])
260
261 eq = self.assertEquals
262
263 eq(pf.GetFilename(), filename)
264
265 for proj, d in zip(pf.GetProjections(), data):
266 eq(proj.GetName(), d[0])
267 for param in proj.GetAllParameters():
268 self.assert_(param in d[1])
269
270 def test_get_system_proj_file(self):
271 """Test resource.get_system_proj_file()
272
273 This is primarily to test whether the system proj file contains
274 invalid projection paramers and whether the proj file is not
275 empty
276 """
277 projfile, warnings = resource.get_system_proj_file()
278 self.assertEquals(warnings, [])
279 self.assert_(len(projfile.GetProjections()) > 0)
280
281
282 class WriteProjFileTests(ProjFileTest, xmlsupport.ValidationTest):
283
284 """Test cases for writing proj files"""
285
286 def compare_xml(self, xml1, xml2):
287 self.assertEquals(sax_eventlist(xml1), sax_eventlist(xml2))
288
289 def doTestWrite(self, data, expected):
290 filename = self.filename()
291
292 pf = ProjFile(filename)
293 for proj in data:
294 pf.Add(Projection(proj[1], proj[0]))
295
296 resource.write_proj_file(pf)
297
298 file = open(filename)
299 written_contents = file.read()
300 file.close()
301 self.compare_xml(written_contents, expected)
302 self.validate_data(written_contents)
303 self.validate_data(expected)
304
305 def test_write(self):
306 """Test write_proj_file"""
307 self.doTestWrite(sample_projfile_data, sample_projfile)
308
309 def test_write_empty_file(self):
310 """Test write empty ProjFile"""
311 self.doTestWrite(sample_projfile_data2, sample_projfile2)
312
313
314 class TestProjFileWithInvalidParameters(unittest.TestCase,
315 support.FileLoadTestCase):
316
317 file_extension = ".proj"
318 file_contents = '''\
319 <?xml version="1.0" encoding="UTF-8"?>
320 <!DOCTYPE projectionlist SYSTEM "projfile.dtd">
321 <projectionlist>
322 <projection name="Universal Transverse Mercator">
323 <parameter value="proj=utm"/>
324 <parameter value="ellps=clrk66"/>
325 <!-- an invalid zone number to trigger the parameter checking
326 in the proj library -->
327 <parameter value="zone=1000"/>
328 </projection>
329 <projection name="Transverse Mercator">
330 <parameter value="proj=tmerc"/>
331 <parameter value="ellps=clrk66"/>
332 <parameter value="lat_0=90w"/>
333 <parameter value="lon_0=90w"/>
334 <parameter value="k=1"/>
335 </projection>
336 </projectionlist>
337 '''
338
339 def setUp(self):
340 support.FileLoadTestCase.setUp(self)
341
342 def test(self):
343 """Test reading a proj file with invalid parameters"""
344 projfile, warnings = resource.read_proj_file(self.filename())
345 projs = projfile.GetProjections()
346 self.assertEquals(len(projs), 1)
347 params = projs[0].GetAllParameters()[:]
348 params.sort()
349 self.assertEquals(params, ['ellps=clrk66', 'k=1', 'lat_0=90w',
350 'lon_0=90w', 'proj=tmerc'])
351 self.assertEquals(warnings,
352 ['Error in projection "Universal Transverse Mercator":'
353 ' invalid UTM zone number'])
354
355
356 if __name__ == "__main__":
357 unittest.main()

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26