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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2571 - (show annotations)
Fri Feb 18 14:54:17 2005 UTC (20 years ago) by jonathan
Original Path: trunk/thuban/test/test_baserenderer.py
File MIME type: text/x-python
File size: 22885 byte(s)
Refactored baserenderer.py and renderer.py to remove baserenderer.py's
dependencies on wxPython. Added a new method projected_raster_layer()
that returns a raster layer image in projected space. This must be
implemented in classes derived from BaseRenderer. This also eliminates
the dependency on gdal in baserenderer.py.

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