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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1173 - (show annotations)
Thu Jun 12 13:37:18 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/test/test_save.py
File MIME type: text/x-python
File size: 12965 byte(s)
(XMLWriterTest.testEncode): Explicitly check unicode strings.

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 saving a thuban session as XML
10 """
11
12 __version__ = "$Revision$"
13 # $Source$
14 # $Id$
15
16 import os
17 import unittest
18 from StringIO import StringIO
19
20 import xml.sax
21 import xml.sax.handler
22 from xml.sax import make_parser, ErrorHandler, SAXNotRecognizedException
23
24 import support
25 support.initthuban()
26
27 from Thuban.Model.save import XMLWriter, save_session
28 from Thuban.Model.session import Session
29 from Thuban.Model.map import Map
30 from Thuban.Model.layer import Layer, RasterLayer
31 from Thuban.Model.proj import Projection
32
33 from Thuban.Model.classification import ClassGroupSingleton, ClassGroupRange, \
34 ClassGroupProperties
35
36 from Thuban.Model.range import Range
37
38
39 class SaxEventLister(xml.sax.handler.ContentHandler):
40
41 def __init__(self):
42 self.eventlist = []
43
44 def startElementNS(self, name, qname, attrs):
45 items = attrs.items()
46 items.sort()
47 self.eventlist.append(("start", name, qname, items))
48
49 def endElementNS(self, name, qname):
50 self.eventlist.append(("end", name, qname))
51
52
53 def sax_eventlist(data):
54 """Return a list of SAX event generated for the XML data.
55 """
56 handler = SaxEventLister()
57 parser = make_parser()
58 parser.setContentHandler(handler)
59 parser.setErrorHandler(ErrorHandler())
60 parser.setFeature(xml.sax.handler.feature_namespaces, 1)
61
62 #
63 # see comment at the end of Thuban/Model/load.py
64 #
65 try:
66 parser.setFeature(xml.sax.handler.feature_validation, 0)
67 parser.setFeature(xml.sax.handler.feature_external_ges, 0)
68 parser.setFeature(xml.sax.handler.feature_external_pes, 0)
69 except SAXNotRecognizedException:
70 pass
71
72 inpsrc = xml.sax.InputSource()
73 inpsrc.setByteStream(StringIO(data))
74 parser.parse(inpsrc)
75
76 return handler.eventlist
77
78 class XMLWriterTest(unittest.TestCase):
79
80 def testEncode(self):
81 """Test XMLWriter.encode"""
82 writer = XMLWriter()
83
84 writer.encode("hello world")
85 writer.encode(unicode("hello world"))
86
87 writer.encode("\x80\x90\xc2\x100")
88 writer.encode(u"\x80\x90\xc2\x100")
89 writer.encode(u"\xFF5E")
90
91 self.assertEquals(writer.encode('&"\'<>'),
92 "&amp;&quot;&apos;&lt;&gt;")
93 self.assertEquals(writer.encode(unicode('&"\'<>')),
94 "&amp;&quot;&apos;&lt;&gt;")
95
96 class SaveSessionTest(unittest.TestCase, support.FileTestMixin):
97
98 def compare_xml(self, xml1, xml2):
99 self.assertEquals(sax_eventlist(xml1), sax_eventlist(xml2))
100
101 def testEmptySession(self):
102 """Save an empty session"""
103 session = Session("empty session")
104 filename = self.temp_file_name("save_emptysession.thuban")
105 save_session(session, filename)
106 session.Destroy()
107
108 file = open(filename)
109 written_contents = file.read()
110 file.close()
111 self.compare_xml(written_contents,
112 '<?xml version="1.0" encoding="UTF-8"?>\n'
113 '<!DOCTYPE session SYSTEM "thuban.dtd">\n'
114 '<session title="empty session">\n</session>\n')
115
116 def testSingleLayer(self):
117 """Save a session with a single map with a single layer"""
118 # deliberately put an apersand in the title :)
119 session = Session("single map&layer")
120 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
121 map = Map("Test Map", projection = proj)
122 session.AddMap(map)
123 # use shapefile from the example data
124 shpfile = os.path.join(os.path.dirname(__file__),
125 os.pardir, "Data", "iceland", "political.shp")
126 layer = Layer("My Layer", session.OpenShapefile(shpfile))
127 map.AddLayer(layer)
128
129 filename = self.temp_file_name("save_singlemap.thuban")
130 save_session(session, filename)
131
132 file = open(filename)
133 written_contents = file.read()
134 file.close()
135 expected_template = '''<?xml version="1.0" encoding="UTF-8"?>
136 <!DOCTYPE session SYSTEM "thuban.dtd">
137 <session title="single map&amp;layer">
138 <map title="Test Map">
139 <projection name="Unknown">
140 <parameter value="zone=26"/>
141 <parameter value="proj=utm"/>
142 <parameter value="ellps=clrk66"/>
143 </projection>
144 <layer title="My Layer" filename="%s"
145 fill="None" stroke="#000000" stroke_width="1" visible="%s"/>
146 </map>
147 </session>'''
148
149 expected_contents = expected_template % \
150 (os.path.join("..", "..", "Data", "iceland", "political.shp"),
151 "true")
152
153 #print written_contents
154 #print "********************************************"
155 #print expected_contents
156 self.compare_xml(written_contents, expected_contents)
157
158 layer.SetVisible(False)
159 save_session(session, filename)
160
161 file = open(filename)
162 written_contents = file.read()
163 file.close()
164 expected_contents = expected_template % \
165 (os.path.join("..", "..", "Data", "iceland", "political.shp"),
166 "false")
167
168 #print written_contents
169 #print "********************************************"
170 #print expected_contents
171 self.compare_xml(written_contents, expected_contents)
172
173 session.Destroy()
174
175 def testLayerProjection(self):
176 # deliberately put an apersand in the title :)
177 session = Session("single map&layer")
178 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
179 map = Map("Test Map", projection = proj)
180 session.AddMap(map)
181 # use shapefile from the example data
182 shpfile = os.path.join(os.path.dirname(__file__),
183 os.pardir, "Data", "iceland", "political.shp")
184 layer = Layer("My Layer", session.OpenShapefile(shpfile))
185 proj = Projection(["proj=lcc", "ellps=clrk66"], "Layer Projection")
186 layer.SetProjection(proj)
187 map.AddLayer(layer)
188
189 filename = self.temp_file_name("save_singlemap.thuban")
190 save_session(session, filename)
191 session.Destroy()
192
193 file = open(filename)
194 written_contents = file.read()
195 file.close()
196 expected_contents = '''<?xml version="1.0" encoding="UTF-8"?>
197 <!DOCTYPE session SYSTEM "thuban.dtd">
198 <session title="single map&amp;layer">
199 <map title="Test Map">
200 <projection name="Unknown">
201 <parameter value="zone=26"/>
202 <parameter value="proj=utm"/>
203 <parameter value="ellps=clrk66"/>
204 </projection>
205 <layer title="My Layer" filename="%s"
206 fill="None" stroke="#000000" stroke_width="1" visible="true">
207 <projection name="Layer Projection">
208 <parameter value="proj=lcc"/>
209 <parameter value="ellps=clrk66"/>
210 </projection>
211 </layer>
212 </map>
213 </session>''' % os.path.join("..", "..", "Data", "iceland",
214 "political.shp")
215 #print written_contents
216 #print "********************************************"
217 #print expected_contents
218 self.compare_xml(written_contents, expected_contents)
219
220
221 def testRasterLayer(self):
222 # deliberately put an apersand in the title :)
223 session = Session("single map&layer")
224 map = Map("Test Map")
225 session.AddMap(map)
226 # use shapefile from the example data
227 imgfile = os.path.join(os.path.dirname(__file__),
228 os.pardir, "Data", "iceland", "island.tif")
229 layer = RasterLayer("My RasterLayer", imgfile)
230 map.AddLayer(layer)
231
232 filename = self.temp_file_name("save_singlemap.thuban")
233 save_session(session, filename)
234 session.Destroy()
235
236 file = open(filename)
237 written_contents = file.read()
238 file.close()
239 expected_contents = '''<?xml version="1.0" encoding="UTF-8"?>
240 <!DOCTYPE session SYSTEM "thuban.dtd">
241 <session title="single map&amp;layer">
242 <map title="Test Map">
243 <rasterlayer title="My RasterLayer" filename="%s"
244 visible="true">
245 </rasterlayer>
246 </map>
247 </session>''' % os.path.join(os.path.dirname(__file__),
248 os.pardir, "Data", "iceland",
249 "island.tif")
250 #print written_contents
251 #print "********************************************"
252 #print expected_contents
253 self.compare_xml(written_contents, expected_contents)
254
255 def testClassifiedLayer(self):
256 """Save a session with a single map with a single layer
257 with a classificaton.
258 """
259 # deliberately put an apersand in the title :)
260 session = Session("single map&layer")
261 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
262 map = Map("Test Map", projection = proj)
263 session.AddMap(map)
264 # use shapefile from the example data
265 shpfile = os.path.join(os.path.dirname(__file__),
266 os.pardir, "Data", "iceland", "political.shp")
267 layer = Layer("My Layer", session.OpenShapefile(shpfile))
268 map.AddLayer(layer)
269
270 clazz = layer.GetClassification()
271
272 clazz.SetField("AREA")
273
274 clazz.AppendGroup(ClassGroupSingleton(42,
275 ClassGroupProperties(),
276 "single"))
277 clazz.AppendGroup(ClassGroupSingleton("text",
278 ClassGroupProperties(),
279 "single-text"))
280
281 clazz.AppendGroup(ClassGroupRange(0, 42,
282 ClassGroupProperties(),
283 "range"))
284
285 range = ClassGroupRange(Range("[0;42]"))
286 range.SetProperties(ClassGroupProperties())
287 range.SetLabel("new-range")
288 clazz.AppendGroup(range)
289
290 filename = self.temp_file_name("save_singlemap.thuban")
291 save_session(session, filename)
292
293 file = open(filename)
294 written_contents = file.read()
295 file.close()
296 expected_template = '''<?xml version="1.0" encoding="UTF-8"?>
297 <!DOCTYPE session SYSTEM "thuban.dtd">
298 <session title="single map&amp;layer">
299 <map title="Test Map">
300 <projection name="Unknown">
301 <parameter value="zone=26"/>
302 <parameter value="proj=utm"/>
303 <parameter value="ellps=clrk66"/>
304 </projection>
305 <layer title="My Layer" filename="%s"
306 fill="None" stroke="#000000" stroke_width="1" visible="%s">
307 <classification field="AREA" field_type="double">
308 <clnull label="">
309 <cldata fill="None" stroke="#000000" stroke_width="1"/>
310 </clnull>
311 <clpoint value="42" label="single">
312 <cldata fill="None" stroke="#000000" stroke_width="1"/>
313 </clpoint>
314 <clpoint value="text" label="single-text">
315 <cldata fill="None" stroke="#000000" stroke_width="1"/>
316 </clpoint>
317 <clrange range="[0;42[" label="range">
318 <cldata fill="None" stroke="#000000" stroke_width="1"/>
319 </clrange>
320 <clrange range="[0;42]" label="new-range">
321 <cldata fill="None" stroke="#000000" stroke_width="1"/>
322 </clrange>
323 </classification>
324 </layer>
325 </map>
326 </session>'''
327
328 expected_contents = expected_template % \
329 (os.path.join("..", "..", "Data", "iceland", "political.shp"),
330 "true")
331
332 #print written_contents
333 #print "********************************************"
334 #print expected_contents
335 self.compare_xml(written_contents, expected_contents)
336
337 session.Destroy()
338
339
340 if __name__ == "__main__":
341 # Fake the __file__ global because it's needed by a test
342 import sys
343 __file__ = sys.argv[0]
344 support.run_tests()

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26