/[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 1200 - (show annotations)
Fri Jun 13 15:04:44 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: 13103 byte(s)
(XMLWriterTest.Encode): Check return values.  Fixes RTbug #1851.

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 eq = self.assertEquals
84
85 eq(writer.encode("hello world"), "hello world")
86 eq(writer.encode(unicode("hello world")), unicode("hello world"))
87
88 eq(writer.encode("\x80\x90\xc2\x100"),
89 "\xc2\x80\xc2\x90\xc3\x82\x100")
90 eq(writer.encode(u"\x80\x90\xc2\x100"),
91 "\xc2\x80\xc2\x90\xc3\x82\x100")
92 eq(writer.encode(u"\xFF5E"), "\xc3\xbf5E")
93
94 eq(writer.encode('&"\'<>'), "&amp;&quot;&apos;&lt;&gt;")
95 eq(writer.encode(unicode('&"\'<>')), "&amp;&quot;&apos;&lt;&gt;")
96
97 class SaveSessionTest(unittest.TestCase, support.FileTestMixin):
98
99 def compare_xml(self, xml1, xml2):
100 self.assertEquals(sax_eventlist(xml1), sax_eventlist(xml2))
101
102 def testEmptySession(self):
103 """Save an empty session"""
104 session = Session("empty session")
105 filename = self.temp_file_name("save_emptysession.thuban")
106 save_session(session, filename)
107 session.Destroy()
108
109 file = open(filename)
110 written_contents = file.read()
111 file.close()
112 self.compare_xml(written_contents,
113 '<?xml version="1.0" encoding="UTF-8"?>\n'
114 '<!DOCTYPE session SYSTEM "thuban.dtd">\n'
115 '<session title="empty session">\n</session>\n')
116
117 def testSingleLayer(self):
118 """Save a session with a single map with a single layer"""
119 # deliberately put an apersand in the title :)
120 session = Session("single map&layer")
121 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
122 map = Map("Test Map", projection = proj)
123 session.AddMap(map)
124 # use shapefile from the example data
125 shpfile = os.path.join(os.path.dirname(__file__),
126 os.pardir, "Data", "iceland", "political.shp")
127 layer = Layer("My Layer", session.OpenShapefile(shpfile))
128 map.AddLayer(layer)
129
130 filename = self.temp_file_name("save_singlemap.thuban")
131 save_session(session, filename)
132
133 file = open(filename)
134 written_contents = file.read()
135 file.close()
136 expected_template = '''<?xml version="1.0" encoding="UTF-8"?>
137 <!DOCTYPE session SYSTEM "thuban.dtd">
138 <session title="single map&amp;layer">
139 <map title="Test Map">
140 <projection name="Unknown">
141 <parameter value="zone=26"/>
142 <parameter value="proj=utm"/>
143 <parameter value="ellps=clrk66"/>
144 </projection>
145 <layer title="My Layer" filename="%s"
146 fill="None" stroke="#000000" stroke_width="1" visible="%s"/>
147 </map>
148 </session>'''
149
150 expected_contents = expected_template % \
151 (os.path.join("..", "..", "Data", "iceland", "political.shp"),
152 "true")
153
154 #print written_contents
155 #print "********************************************"
156 #print expected_contents
157 self.compare_xml(written_contents, expected_contents)
158
159 layer.SetVisible(False)
160 save_session(session, filename)
161
162 file = open(filename)
163 written_contents = file.read()
164 file.close()
165 expected_contents = expected_template % \
166 (os.path.join("..", "..", "Data", "iceland", "political.shp"),
167 "false")
168
169 #print written_contents
170 #print "********************************************"
171 #print expected_contents
172 self.compare_xml(written_contents, expected_contents)
173
174 session.Destroy()
175
176 def testLayerProjection(self):
177 # deliberately put an apersand in the title :)
178 session = Session("single map&layer")
179 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
180 map = Map("Test Map", projection = proj)
181 session.AddMap(map)
182 # use shapefile from the example data
183 shpfile = os.path.join(os.path.dirname(__file__),
184 os.pardir, "Data", "iceland", "political.shp")
185 layer = Layer("My Layer", session.OpenShapefile(shpfile))
186 proj = Projection(["proj=lcc", "ellps=clrk66"], "Layer Projection")
187 layer.SetProjection(proj)
188 map.AddLayer(layer)
189
190 filename = self.temp_file_name("save_singlemap.thuban")
191 save_session(session, filename)
192 session.Destroy()
193
194 file = open(filename)
195 written_contents = file.read()
196 file.close()
197 expected_contents = '''<?xml version="1.0" encoding="UTF-8"?>
198 <!DOCTYPE session SYSTEM "thuban.dtd">
199 <session title="single map&amp;layer">
200 <map title="Test Map">
201 <projection name="Unknown">
202 <parameter value="zone=26"/>
203 <parameter value="proj=utm"/>
204 <parameter value="ellps=clrk66"/>
205 </projection>
206 <layer title="My Layer" filename="%s"
207 fill="None" stroke="#000000" stroke_width="1" visible="true">
208 <projection name="Layer Projection">
209 <parameter value="proj=lcc"/>
210 <parameter value="ellps=clrk66"/>
211 </projection>
212 </layer>
213 </map>
214 </session>''' % os.path.join("..", "..", "Data", "iceland",
215 "political.shp")
216 #print written_contents
217 #print "********************************************"
218 #print expected_contents
219 self.compare_xml(written_contents, expected_contents)
220
221
222 def testRasterLayer(self):
223 # deliberately put an apersand in the title :)
224 session = Session("single map&layer")
225 map = Map("Test Map")
226 session.AddMap(map)
227 # use shapefile from the example data
228 imgfile = os.path.join(os.path.dirname(__file__),
229 os.pardir, "Data", "iceland", "island.tif")
230 layer = RasterLayer("My RasterLayer", imgfile)
231 map.AddLayer(layer)
232
233 filename = self.temp_file_name("save_singlemap.thuban")
234 save_session(session, filename)
235 session.Destroy()
236
237 file = open(filename)
238 written_contents = file.read()
239 file.close()
240 expected_contents = '''<?xml version="1.0" encoding="UTF-8"?>
241 <!DOCTYPE session SYSTEM "thuban.dtd">
242 <session title="single map&amp;layer">
243 <map title="Test Map">
244 <rasterlayer title="My RasterLayer" filename="%s"
245 visible="true">
246 </rasterlayer>
247 </map>
248 </session>''' % os.path.join(os.path.dirname(__file__),
249 os.pardir, "Data", "iceland",
250 "island.tif")
251 #print written_contents
252 #print "********************************************"
253 #print expected_contents
254 self.compare_xml(written_contents, expected_contents)
255
256 def testClassifiedLayer(self):
257 """Save a session with a single map with a single layer
258 with a classificaton.
259 """
260 # deliberately put an apersand in the title :)
261 session = Session("single map&layer")
262 proj = Projection(["zone=26", "proj=utm", "ellps=clrk66"])
263 map = Map("Test Map", projection = proj)
264 session.AddMap(map)
265 # use shapefile from the example data
266 shpfile = os.path.join(os.path.dirname(__file__),
267 os.pardir, "Data", "iceland", "political.shp")
268 layer = Layer("My Layer", session.OpenShapefile(shpfile))
269 map.AddLayer(layer)
270
271 clazz = layer.GetClassification()
272
273 clazz.SetField("AREA")
274
275 clazz.AppendGroup(ClassGroupSingleton(42,
276 ClassGroupProperties(),
277 "single"))
278 clazz.AppendGroup(ClassGroupSingleton("text",
279 ClassGroupProperties(),
280 "single-text"))
281
282 clazz.AppendGroup(ClassGroupRange(0, 42,
283 ClassGroupProperties(),
284 "range"))
285
286 range = ClassGroupRange(Range("[0;42]"))
287 range.SetProperties(ClassGroupProperties())
288 range.SetLabel("new-range")
289 clazz.AppendGroup(range)
290
291 filename = self.temp_file_name("save_singlemap.thuban")
292 save_session(session, filename)
293
294 file = open(filename)
295 written_contents = file.read()
296 file.close()
297 expected_template = '''<?xml version="1.0" encoding="UTF-8"?>
298 <!DOCTYPE session SYSTEM "thuban.dtd">
299 <session title="single map&amp;layer">
300 <map title="Test Map">
301 <projection name="Unknown">
302 <parameter value="zone=26"/>
303 <parameter value="proj=utm"/>
304 <parameter value="ellps=clrk66"/>
305 </projection>
306 <layer title="My Layer" filename="%s"
307 fill="None" stroke="#000000" stroke_width="1" visible="%s">
308 <classification field="AREA" field_type="double">
309 <clnull label="">
310 <cldata fill="None" stroke="#000000" stroke_width="1"/>
311 </clnull>
312 <clpoint value="42" label="single">
313 <cldata fill="None" stroke="#000000" stroke_width="1"/>
314 </clpoint>
315 <clpoint value="text" label="single-text">
316 <cldata fill="None" stroke="#000000" stroke_width="1"/>
317 </clpoint>
318 <clrange range="[0;42[" label="range">
319 <cldata fill="None" stroke="#000000" stroke_width="1"/>
320 </clrange>
321 <clrange range="[0;42]" label="new-range">
322 <cldata fill="None" stroke="#000000" stroke_width="1"/>
323 </clrange>
324 </classification>
325 </layer>
326 </map>
327 </session>'''
328
329 expected_contents = expected_template % \
330 (os.path.join("..", "..", "Data", "iceland", "political.shp"),
331 "true")
332
333 #print written_contents
334 #print "********************************************"
335 #print expected_contents
336 self.compare_xml(written_contents, expected_contents)
337
338 session.Destroy()
339
340
341 if __name__ == "__main__":
342 # Fake the __file__ global because it's needed by a test
343 import sys
344 __file__ = sys.argv[0]
345 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