/[thuban]/branches/WIP-pyshapelib-Unicode/thuban/test/test_baserenderer.py
ViewVC logotype

Contents of /branches/WIP-pyshapelib-Unicode/thuban/test/test_baserenderer.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2886 - (show annotations)
Tue Aug 18 20:04:10 2009 UTC (15 years, 6 months ago) by bramz
File MIME type: text/x-python
File size: 25451 byte(s)
Forward porting trunk (2864:2885] to WIP-pyshapelib-Unicode branch.
1 # Copyright (C) 2003, 2005, 2006 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <[email protected]>
4 # Bernhard Reiter <[email protected]>
5 #
6 # This program is free software under the GPL (>=v2)
7 # Read the file COPYING coming with the software for details.
8
9 """Test Thuban.Model.baserenderer"""
10
11 __version__ = "$Revision$"
12 # $Source$
13 # $Id$
14
15 import os
16 import binascii
17 import unittest
18 import locale
19
20 import localessupport
21 from mockgeo import SimpleShapeStore
22 import support
23 support.initthuban()
24
25 from Thuban.Model.color import Transparent, Color
26 from Thuban.Model.data import SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT
27 from Thuban.Model.map import Map
28 from Thuban.Model.layer import BaseLayer, Layer, RasterLayer
29 from Thuban.Model.table import MemoryTable, \
30 FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING
31 from Thuban.Model.classification import ClassGroupSingleton
32 import Thuban.Model.resource
33
34
35 from Thuban.UI.baserenderer import BaseRenderer, \
36 add_renderer_extension, init_renderer_extensions
37
38 if Thuban.Model.resource.has_gdal_support():
39 from gdalwarp import ProjectRasterFile
40
41 class MockDC:
42
43 def __init__(self, size = None):
44 self.calls = []
45 self.size = size
46
47 def GetSizeTuple(self):
48 return self.size
49
50 def __getattr__(self, attr):
51 def method(*args):
52 self.calls.append((attr,) + args)
53 return method
54
55 class P:
56
57 """A simple point"""
58
59 def __init__(self, x, y):
60 self.x = x
61 self.y = y
62
63 def __eq__(self, other):
64 return self.x == other.x and self.y == other.y
65
66 def __ne__(self, other):
67 return self.x != other.x and self.y != other.y
68
69 def __repr__(self):
70 return "P(%r, %r)" % (self.x, self.y)
71
72
73 class SimpleRenderer(BaseRenderer):
74
75 TRANSPARENT_PEN = ("pen", Transparent)
76 TRANSPARENT_BRUSH = ("brush", Transparent)
77
78 def make_point(self, x, y):
79 return P(x, y)
80
81 def tools_for_property(self, prop):
82 fill = prop.GetFill()
83 brush = ("brush", fill)
84
85 stroke = prop.GetLineColor()
86 stroke_width = prop.GetLineWidth()
87 if stroke is Transparent:
88 pen = ("pen", Transparent)
89 else:
90 pen = ("pen", stroke, stroke_width)
91
92 return pen, brush
93
94 def label_font(self):
95 return "label font"
96
97 def draw_raster_data(self, x, y, data, format='BMP', opacity=1.0):
98 self.raster_data = data
99 self.raster_format = format
100
101 def projected_raster_layer(self, layer, srcProj, dstProj, extents,
102 resolution, dimensions, options):
103
104 if not Thuban.Model.resource.has_gdal_support():
105 raise support.SkipTest(Thuban.Model.resource.gdal_support_status)
106
107 #print srcProj, dstProj,extents, resolution, dimensions, options
108
109 return ProjectRasterFile(layer.GetImageFilename(),
110 srcProj, dstProj,
111 extents, resolution, dimensions,
112 options)
113
114 class MockProjection:
115
116 """Objects that look like projections but simply apply non-uniform scalings
117 """
118
119 def __init__(self, xscale, yscale):
120 self.xscale = float(xscale)
121 self.yscale = float(yscale)
122
123 def Forward(self, x, y):
124 return (x * self.xscale, y * self.yscale)
125
126 def Inverse(self, x, y):
127 return (x / self.xscale, y / self.yscale)
128
129
130 class TestBaseRenderer(unittest.TestCase):
131
132 def setUp(self):
133 """Set self.to_destroy to an empty list
134
135 Tests should put all objects whose Destroy should be called at
136 the end into this list so that they're destroyed in tearDown.
137 """
138 self.to_destroy = []
139
140 def tearDown(self):
141 for obj in self.to_destroy:
142 obj.Destroy()
143
144 def test_arc_no_projection(self):
145 """Test BaseRenderer with arc layer and no projections"""
146 table = MemoryTable([("type", FIELDTYPE_STRING),
147 ("value", FIELDTYPE_DOUBLE),
148 ("code", FIELDTYPE_INT)],
149 [("UNKNOWN", 0.0, 0)])
150 shapes = [[[(0, 0), (10, 10)]]]
151 store = SimpleShapeStore(SHAPETYPE_ARC, shapes, table)
152
153 map = Map("TestBaseRenderer")
154 self.to_destroy.append(map)
155 layer = Layer("arc layer", store)
156 map.AddLayer(layer)
157
158 dc = MockDC()
159 renderer = SimpleRenderer(dc, map, 2, (10, 10))
160
161 renderer.render_map()
162
163 self.assertEquals(dc.calls,
164 [('BeginDrawing',),
165 ('SetBrush', ('brush', Transparent)),
166 ('SetPen', ('pen', Color(0, 0, 0), 1)),
167 ('DrawLines', [P(10, 10), P(30, -10)]),
168 ('SetFont', "label font"),
169 ('EndDrawing',)])
170
171 def test_polygon_no_projection(self):
172 """Test BaseRenderer with polygon layer and no projections"""
173 table = MemoryTable([("type", FIELDTYPE_STRING),
174 ("value", FIELDTYPE_DOUBLE),
175 ("code", FIELDTYPE_INT)],
176 [("UNKNOWN", 0.0, 0)])
177 shapes = [[[(0, 0), (10, 10), (10, 0), (0, 0)]]]
178 store = SimpleShapeStore(SHAPETYPE_POLYGON, shapes, table)
179
180 map = Map("TestBaseRenderer")
181 layer = Layer("polygon layer", store)
182 prop = layer.GetClassification().GetDefaultGroup().GetProperties()
183 prop.SetFill(Color(1, 1, 1))
184
185 map.AddLayer(layer)
186 self.to_destroy.append(map)
187
188 dc = MockDC()
189 renderer = SimpleRenderer(dc, map, 2, (10, 10))
190
191 renderer.render_map()
192
193 self.assertEquals(dc.calls,
194 [('BeginDrawing',),
195 ('SetBrush', ('brush', Color(1, 1, 1))),
196 ('SetPen', ('pen', Transparent)),
197 ('DrawPolygon', [P(10, 10), P(30, -10), P(30, 10),
198 P(10, 10)]),
199 ('SetBrush', ('brush', Transparent)),
200 ('SetPen', ('pen', Color(0, 0, 0), 1)),
201 ('DrawLines', [P(10, 10), P(30, -10), P(30, 10),
202 P(10, 10)]),
203 ('SetFont', "label font"),
204 ('EndDrawing',)])
205
206 def test_complex_polygon(self):
207 """Test BaseRenderer with complex polygon and no projections"""
208 # A square inside a sqare. This has to be drawn with at least a
209 # draw polygon call and two draw lines calls.
210 shapes = [[[(0, 0), (0, 10), (10, 10), (10, 0), (0, 0)],
211 [(2, 2), (8, 2), (8, 8), (2, 8), (2, 2)]]]
212
213 table = MemoryTable([("type", FIELDTYPE_STRING),
214 ("value", FIELDTYPE_DOUBLE),
215 ("code", FIELDTYPE_INT)],
216 [("UNKNOWN", 0.0, 0)])
217 store = SimpleShapeStore(SHAPETYPE_POLYGON, shapes, table)
218
219 map = Map("TestBaseRenderer")
220 layer = Layer("polygon layer", store)
221 prop = layer.GetClassification().GetDefaultGroup().GetProperties()
222 prop.SetFill(Color(1, 1, 1))
223
224 map.AddLayer(layer)
225 self.to_destroy.append(map)
226
227 dc = MockDC()
228 renderer = SimpleRenderer(dc, map, 2, (10, 10))
229
230 renderer.render_map()
231
232 self.assertEquals(dc.calls,
233 [('BeginDrawing',),
234 ('SetBrush', ('brush', Color(1, 1, 1))),
235 ('SetPen', ('pen', Transparent)),
236 ('DrawPolygon',
237 [P(10, 10), P(10, -10), P(30, -10), P(30, 10),
238 P(10, 10),
239 P(14, 6), P(26, 6), P(26, -6), P(14, -6),
240 P(14, 6),
241 P(10, 10)]),
242 ('SetBrush', ('brush', Transparent)),
243 ('SetPen', ('pen', Color(0, 0, 0), 1)),
244 ('DrawLines', [P(10, 10), P(10, -10), P(30, -10),
245 P(30, 10), P(10, 10)]),
246 ('DrawLines', [P(14, 6), P(26, 6), P(26, -6),
247 P(14, -6), P(14, 6)]),
248 ('SetFont', "label font"),
249 ('EndDrawing',)])
250
251 def test_point_no_projection(self):
252 """Test BaseRenderer with point layer and no projections"""
253 table = MemoryTable([("type", FIELDTYPE_STRING),
254 ("value", FIELDTYPE_DOUBLE),
255 ("code", FIELDTYPE_INT)],
256 [("UNKNOWN", 0.0, 0),
257 ("UNKNOWN", 0.0, 1)])
258 shapes = [[[(0, 0)]], [[(10, 10)]]]
259 store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
260
261 map = Map("TestBaseRenderer")
262 layer = Layer("point layer", store)
263 map.AddLayer(layer)
264 self.to_destroy.append(map)
265
266 dc = MockDC()
267 renderer = SimpleRenderer(dc, map, 2, (10, 10))
268
269 renderer.render_map()
270
271 self.assertEquals(dc.calls,
272 [('BeginDrawing',),
273 ('SetBrush', ('brush', Transparent)),
274 ('SetPen', ('pen', Color(0, 0, 0), 1)),
275 ('DrawEllipse', 5, 5, 10, 10),
276 ('SetBrush', ('brush', Transparent)),
277 ('SetPen', ('pen', Color(0, 0, 0), 1)),
278 ('DrawEllipse', 25, -15, 10, 10),
279 ('SetFont', "label font"),
280 ('EndDrawing',)])
281
282 def test_projected_raster_layer(self):
283 if not Thuban.Model.resource.has_gdal_support():
284 raise support.SkipTest(Thuban.Model.resource.gdal_support_status)
285
286 layer = RasterLayer("raster layer",
287 os.path.join("..", "Data", "iceland",
288 "island.tif"))
289
290 dc = MockDC(size = (20, 20))
291 renderer = SimpleRenderer(dc, map, 34, (800, 2250))
292
293 # The reference data as a base64 coded RAW image
294 raw_data = binascii.a2b_base64(
295 'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO'
296 'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp'
297 'ICJooCIo4CCpoCQnoGOn4CDpYCOn4CUmbmUmbmNo6aEpYCLoYCAqICGpICFpICUmb'
298 'mAt4CUmbmNo6aAtICArYCAqoCKoYCMoICTnYKOn4CFpICUmbmUmbmUmbmUmbmAp4C'
299 'NoICArYCAr4CCpoCAqYCCpoCEpYCHo4CFpICHo4CGpICFpICKoYCTnYKMoICAp4CU'
300 'mbmUmbmUmbmUmbmUmbmUmbmAtYCAroCArYCCpoCAtYCAroCAtICAsYCUmbmAt4CAq'
301 'YCAroCMoICAs4CAs4CAtYCAt4CAqYCUmbmUmbmUmbmUmbmAtoCAtYCAq4CAtoCBp4'
302 'CAroCAqoCAq4CAr4CDpYCGpICAt4CAsICDpYCArICCpoCHo4CAs4CAuICUmbmUmbm'
303 'UmbmUmbmUmbmUmbmAuICAqICFpYCAq4CDpoCAqYCFpICAqYCUmbmNo6aAsYCCpoCD'
304 'pYCAqICAtoCUmbmAt4CAqoCCpoCAroCHo4CAsYCAq4CAsICAs4CAp4CUmbmAtYCAq'
305 'YCIooCHo4CAsICAr4CAqICEpYCAs4CAqICArICDpYCEpYCEpYCAr4CUmbmEpYCAs4'
306 'CAtICAs4CAqYCUmbmAtoCAp4CCpoCDpYCAq4CArICAqoCAqYCAqYCAtYCAtoCDpYC'
307 'At4CUmbmUmbmUmbmUmbmAt4CAsoCAsoCAp4CAp4CCpoCAsoCAt4CNo6aUmbmUmbmU'
308 'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAt4CAtYCCpoCAqICAroCAr4CUmbmUm'
309 'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
310 'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
311 'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
312 'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
313 'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
314 'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
315 'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
316 'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
317 'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
318 'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
319 'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n')
320
321 raw_mask = binascii.a2b_base64(
322 '//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P/'
323 '/8P//8P//8P//8P//8P\n')
324
325 raw_mask_inverted = binascii.a2b_base64(
326 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
327 'AAAAAAAAAAAAAAAAAAA\n')
328
329 raw_alpha = binascii.a2b_base64(
330 '/////////////////////////////////////////////////////////////'
331 '/////////////////////////////////////////////////////////////'
332 '/////////////////////////////////////////////////////////////'
333 '/////////////////////////////////////////////////////////////'
334 '/////////////////////////////////////////////////////////////'
335 '/////////////////////////////////////////////////////////////'
336 '/////////////////////////////////////////////////////////////'
337 '/////////////////////////////////////////////////////////////'
338 '/////////////////////////////////////////////w==\n')
339
340 for opts, data in [[1, (raw_data, raw_mask, None)],
341 [1|4, (raw_data, raw_mask_inverted, None)],
342 [2, (raw_data, None, raw_alpha)]]:
343
344 img_data = renderer.projected_raster_layer(layer, "", "",
345 (-24, 65, -23, 66), [0, 0], (20, 20), opts)
346 self.assertEquals(img_data, data)
347
348 def test_projected_raster_broken(self):
349 """
350 Until using gdal 1.5, we could load more than one file with gdal
351 without problems. After 1.5 we had problems having this message in
352 the stdout when loading a second file with GDAL:
353
354 ERROR 4: `../Data/iceland/island.tif' not recognised as a
355 supported file format.
356
357 This was only after a call to ProjectRasterFile.
358
359 If this test passes without IOException, the problem will be solved.
360 """
361 tiffile= os.path.join("..", "Data", "iceland",
362 "island.tif")
363 projection = "+proj=latlong +to_meter=0.017453 +ellps=clrk66"
364 new_projection = "+proj=utm +zone=27 +ellps=clrk66"
365
366 from osgeo.gdal import Open
367 t1 = RasterLayer("rast",tiffile)
368 v = ProjectRasterFile(tiffile,projection, new_projection, \
369 (322003.1320390497, 6964094.1718668584,\
370 876022.1891829354, 7460469.6276894147), \
371 [0, 0], (10,5), 1)
372 v =None
373 t2 = RasterLayer("rast3", tiffile)
374
375 def test_projected_raster_decimalcommalocale(self):
376 if not Thuban.Model.resource.has_gdal_support():
377 raise support.SkipTest(Thuban.Model.resource.gdal_support_status)
378
379 def _do_project_island():
380 """Project island.tif and return result."""
381 layer = RasterLayer("raster layer",
382 os.path.join("..", "Data", "iceland",
383 "island.tif"))
384
385 dc = MockDC(size = (10, 5))
386 renderer = SimpleRenderer(dc, map, 34, (800, 2250))
387
388 projection = "+proj=latlong +to_meter=0.017453 +ellps=clrk66"
389 new_projection = "+proj=utm +zone=27 +ellps=clrk66"
390
391 return renderer.projected_raster_layer(layer, \
392 projection, new_projection, \
393 (322003.1320390497, 6964094.1718668584, 876022.1891829354, 7460469.6276894147), [0, 0], (10,5), 1)
394
395 oldlocale = localessupport.setdecimalcommalocale()
396 img_data2 = _do_project_island()
397 locale.setlocale(locale.LC_NUMERIC, oldlocale)
398
399 img_data1 = _do_project_island()
400
401 self.assertEquals(img_data1, img_data2)
402
403 def test_raster_no_projection(self):
404 """Test BaseRenderer with raster layer and no projections
405
406 This test is very simple minded and perhaps can easily fail due
407 to round-off errors. It simply compares the complete BMP file
408 returned by gdalwarp.ProjectRasterFile to a BMP file data.
409 """
410 if not Thuban.Model.resource.has_gdal_support():
411 raise support.SkipTest(Thuban.Model.resource.gdal_support_status)
412
413 map = Map("TestBaseRenderer")
414
415 layer = RasterLayer("raster layer",
416 os.path.join("..", "Data", "iceland",
417 "island.tif"))
418 layer.SetMaskType(layer.MASK_NONE)
419
420 map.AddLayer(layer)
421 self.to_destroy.append(map)
422
423 dc = MockDC(size = (20, 20))
424 renderer = SimpleRenderer(dc, map, 34, (800, 2250))
425
426 renderer.render_map()
427
428 # The following commented out code block can be used to generate
429 # the base64 coded reference image data
430 #hexed = binascii.b2a_base64(renderer.raster_data[2][0])
431 #while hexed:
432 #print repr(hexed[:65])
433 #hexed = hexed[65:]
434
435 # The reference data as a base64 coded RAW image
436 raw_data = binascii.a2b_base64(
437 'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO'
438 'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp'
439 'ICJooCIo4CCpoCQnoGOn4CDpYCOn4CUmbmUmbmNo6aEpYCLoYCAqICGpICFpICUmb'
440 'mAt4CUmbmNo6aAtICArYCAqoCKoYCMoICTnYKOn4CFpICUmbmUmbmUmbmUmbmAp4C'
441 'NoICArYCAr4CCpoCAqYCCpoCEpYCHo4CFpICHo4CGpICFpICKoYCTnYKMoICAp4CU'
442 'mbmUmbmUmbmUmbmUmbmUmbmAtYCAroCArYCCpoCAtYCAroCAtICAsYCUmbmAt4CAq'
443 'YCAroCMoICAs4CAs4CAtYCAt4CAqYCUmbmUmbmUmbmUmbmAtoCAtYCAq4CAtoCBp4'
444 'CAroCAqoCAq4CAr4CDpYCGpICAt4CAsICDpYCArICCpoCHo4CAs4CAuICUmbmUmbm'
445 'UmbmUmbmUmbmUmbmAuICAqICFpYCAq4CDpoCAqYCFpICAqYCUmbmNo6aAsYCCpoCD'
446 'pYCAqICAtoCUmbmAt4CAqoCCpoCAroCHo4CAsYCAq4CAsICAs4CAp4CUmbmAtYCAq'
447 'YCIooCHo4CAsICAr4CAqICEpYCAs4CAqICArICDpYCEpYCEpYCAr4CUmbmEpYCAs4'
448 'CAtICAs4CAqYCUmbmAtoCAp4CCpoCDpYCAq4CArICAqoCAqYCAqYCAtYCAtoCDpYC'
449 'At4CUmbmUmbmUmbmUmbmAt4CAsoCAsoCAp4CAp4CCpoCAsoCAt4CNo6aUmbmUmbmU'
450 'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAt4CAtYCCpoCAqICAroCAr4CUmbmUm'
451 'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
452 'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
453 'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
454 'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
455 'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
456 'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
457 'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
458 'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
459 'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
460 'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
461 'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n')
462
463 self.assertEquals(renderer.raster_data,
464 (20,20,(raw_data, None, None)))
465
466 self.assertEquals(renderer.raster_format, "RAW")
467
468 self.assertEquals(dc.calls,
469 [('BeginDrawing',),
470 ('SetFont', "label font"),
471 ('EndDrawing',)])
472
473 def test_point_map_projection(self):
474 """Test BaseRenderer with point layer and map projection"""
475 table = MemoryTable([("type", FIELDTYPE_STRING),
476 ("value", FIELDTYPE_DOUBLE),
477 ("code", FIELDTYPE_INT)],
478 [("UNKNOWN", 0.0, 0)])
479 shapes = [[[(10, 10)]]]
480 store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
481
482 map = Map("TestBaseRenderer")
483 map.SetProjection(MockProjection(-3, 3))
484 layer = Layer("point layer", store)
485 map.AddLayer(layer)
486 self.to_destroy.append(map)
487
488 dc = MockDC()
489 renderer = SimpleRenderer(dc, map, 2, (10, 10))
490
491 renderer.render_map()
492
493 self.assertEquals(dc.calls,
494 [('BeginDrawing',),
495 ('SetBrush', ('brush', Transparent)),
496 ('SetPen', ('pen', Color(0, 0, 0), 1)),
497 ('DrawEllipse', -55, -55, 10, 10),
498 ('SetFont', "label font"),
499 ('EndDrawing',)])
500
501 def test_point_layer_projection(self):
502 """Test BaseRenderer with point layer and layer projection"""
503 table = MemoryTable([("type", FIELDTYPE_STRING),
504 ("value", FIELDTYPE_DOUBLE),
505 ("code", FIELDTYPE_INT)],
506 [("UNKNOWN", 0.0, 0)])
507 shapes = [[[(9, 9)]]]
508 store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
509
510 map = Map("TestBaseRenderer")
511 layer = Layer("point layer", store)
512 layer.SetProjection(MockProjection(3, -3))
513 map.AddLayer(layer)
514 self.to_destroy.append(map)
515
516 dc = MockDC()
517 renderer = SimpleRenderer(dc, map, 2, (10, 10))
518
519 renderer.render_map()
520
521 self.assertEquals(dc.calls,
522 [('BeginDrawing',),
523 ('SetBrush', ('brush', Transparent)),
524 ('SetPen', ('pen', Color(0, 0, 0), 1)),
525 ('DrawEllipse', 11, 11, 10, 10),
526 ('SetFont', "label font"),
527 ('EndDrawing',)])
528
529 def test_point_layer_and_map_projection(self):
530 """Test BaseRenderer with point layer and layer and map projection"""
531 table = MemoryTable([("type", FIELDTYPE_STRING),
532 ("value", FIELDTYPE_DOUBLE),
533 ("code", FIELDTYPE_INT)],
534 [("UNKNOWN", 0.0, 0)])
535 shapes = [[[(9, 9)]]]
536 store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
537
538 map = Map("TestBaseRenderer")
539 map.SetProjection(MockProjection(-3, 3))
540 layer = Layer("point layer", store)
541 layer.SetProjection(MockProjection(3, -3))
542 map.AddLayer(layer)
543 self.to_destroy.append(map)
544
545 dc = MockDC()
546 renderer = SimpleRenderer(dc, map, 2, (10, 10))
547
548 renderer.render_map()
549
550 self.assertEquals(dc.calls,
551 [('BeginDrawing',),
552 ('SetBrush', ('brush', Transparent)),
553 ('SetPen', ('pen', Color(0, 0, 0), 1)),
554 ('DrawEllipse', -13, 23, 10, 10),
555 ('SetFont', "label font"),
556 ('EndDrawing',)])
557
558
559 def test_point_with_classification(self):
560 """Test BaseRenderer with point layer and classification"""
561 table = MemoryTable([("type", FIELDTYPE_STRING),
562 ("value", FIELDTYPE_DOUBLE),
563 ("code", FIELDTYPE_INT)],
564 [("UNKNOWN", 0.0, 0),
565 ("UNKNOWN", 0.0, 1)])
566 shapes = [[[(0, 0)]], [[(10, 10)]]]
567 store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
568
569 map = Map("TestBaseRenderer")
570 layer = Layer("point layer", store)
571 group = ClassGroupSingleton(1)
572 group.GetProperties().SetFill(Color(0, 0, 1))
573 layer.GetClassification().AppendGroup(group)
574 layer.SetClassificationColumn("code")
575
576 map.AddLayer(layer)
577 self.to_destroy.append(map)
578
579 dc = MockDC()
580 renderer = SimpleRenderer(dc, map, 2, (10, 10))
581
582 renderer.render_map()
583
584 self.assertEquals(dc.calls,
585 [('BeginDrawing',),
586 ('SetBrush', ('brush', Transparent)),
587 ('SetPen', ('pen', Color(0, 0, 0), 1)),
588 ('DrawEllipse', 5, 5, 10, 10),
589 ('SetBrush', ('brush', Color(0, 0, 1))),
590 ('SetPen', ('pen', Color(0, 0, 0), 1)),
591 ('DrawEllipse', 25, -15, 10, 10),
592 ('SetFont', "label font"),
593 ('EndDrawing',)])
594
595
596 def test_renderer_extension(self):
597 """Test renderer with a renderer extension"""
598 class MyLayer(BaseLayer):
599 pass
600
601 calls = []
602 def my_renderer(renderer, layer):
603 calls.append((renderer, layer))
604 return ()
605
606 add_renderer_extension(MyLayer, my_renderer)
607
608 try:
609 map = Map("test_renderer_extension")
610 layer = MyLayer("my layer")
611 map.AddLayer(layer)
612 self.to_destroy.append(map)
613
614 dc = MockDC()
615 renderer = SimpleRenderer(dc, map, 2, (10, 10))
616 renderer.render_map()
617 finally:
618 init_renderer_extensions()
619
620 self.assertEquals(calls, [(renderer, layer)])
621
622
623 if __name__ == "__main__":
624 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