15 |
import binascii |
import binascii |
16 |
import unittest |
import unittest |
17 |
|
|
18 |
|
from mockgeo import SimpleShapeStore |
19 |
import support |
import support |
20 |
support.initthuban() |
support.initthuban() |
21 |
|
|
22 |
from Thuban.Model.color import Transparent, Color |
from Thuban.Model.color import Transparent, Color |
23 |
from Thuban.Model.data import Shape, SHAPETYPE_ARC, SHAPETYPE_POLYGON, \ |
from Thuban.Model.data import SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT |
|
SHAPETYPE_POINT |
|
24 |
from Thuban.Model.map import Map |
from Thuban.Model.map import Map |
25 |
from Thuban.Model.layer import Layer, RasterLayer |
from Thuban.Model.layer import BaseLayer, Layer, RasterLayer |
26 |
from Thuban.Model.table import MemoryTable, \ |
from Thuban.Model.table import MemoryTable, \ |
27 |
FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING |
FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING |
28 |
|
from Thuban.Model.classification import ClassGroupSingleton |
29 |
|
import Thuban.Model.resource |
30 |
|
|
31 |
from Thuban.UI.baserenderer import BaseRenderer |
|
32 |
|
from Thuban.UI.baserenderer import BaseRenderer, \ |
33 |
|
add_renderer_extension, init_renderer_extensions |
34 |
|
|
35 |
|
|
36 |
class MockDC: |
class MockDC: |
89 |
def label_font(self): |
def label_font(self): |
90 |
return "label font" |
return "label font" |
91 |
|
|
92 |
def draw_raster_data(self, data): |
def draw_raster_data(self, data, format='BMP'): |
93 |
self.raster_data = data |
self.raster_data = data |
94 |
|
self.raster_format = format |
|
class SimpleShapeStore: |
|
|
|
|
|
def __init__(self, shapetype, shapes, table): |
|
|
self.shapetype = shapetype |
|
|
self.shapes = shapes |
|
|
self.table = table |
|
|
assert table.NumRows() == len(shapes) |
|
|
|
|
|
def ShapeType(self): |
|
|
return self.shapetype |
|
|
|
|
|
def Table(self): |
|
|
return self.table |
|
|
|
|
|
def NumShapes(self): |
|
|
return len(self.shapes) |
|
|
|
|
|
def Shape(self, index): |
|
|
return Shape(self.shapes[index]) |
|
95 |
|
|
96 |
|
|
97 |
class MockProjection: |
class MockProjection: |
139 |
map.AddLayer(layer) |
map.AddLayer(layer) |
140 |
|
|
141 |
dc = MockDC() |
dc = MockDC() |
142 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
143 |
|
|
144 |
renderer.render_map(map) |
renderer.render_map() |
145 |
|
|
146 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
147 |
[('BeginDrawing',), |
[('BeginDrawing',), |
169 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
170 |
|
|
171 |
dc = MockDC() |
dc = MockDC() |
172 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
173 |
|
|
174 |
renderer.render_map(map) |
renderer.render_map() |
175 |
|
|
176 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
177 |
[('BeginDrawing',), |
[('BeginDrawing',), |
208 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
209 |
|
|
210 |
dc = MockDC() |
dc = MockDC() |
211 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
212 |
|
|
213 |
renderer.render_map(map) |
renderer.render_map() |
214 |
|
|
215 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
216 |
[('BeginDrawing',), |
[('BeginDrawing',), |
247 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
248 |
|
|
249 |
dc = MockDC() |
dc = MockDC() |
250 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
251 |
|
|
252 |
renderer.render_map(map) |
renderer.render_map() |
253 |
|
|
254 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
255 |
[('BeginDrawing',), |
[('BeginDrawing',), |
269 |
to round-off errors. It simply compares the complete BMP file |
to round-off errors. It simply compares the complete BMP file |
270 |
returned by gdalwarp.ProjectRasterFile to a BMP file data. |
returned by gdalwarp.ProjectRasterFile to a BMP file data. |
271 |
""" |
""" |
272 |
|
if not Thuban.Model.resource.has_gdal_support(): |
273 |
|
raise support.SkipTest("No gdal support") |
274 |
|
|
275 |
map = Map("TestBaseRenderer") |
map = Map("TestBaseRenderer") |
276 |
|
|
277 |
layer = RasterLayer("raster layer", |
layer = RasterLayer("raster layer", |
281 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
282 |
|
|
283 |
dc = MockDC(size = (20, 20)) |
dc = MockDC(size = (20, 20)) |
284 |
renderer = SimpleRenderer(dc, 34, (800, 2250)) |
renderer = SimpleRenderer(dc, map, 34, (800, 2250)) |
285 |
|
|
286 |
renderer.render_map(map) |
renderer.render_map() |
287 |
|
|
288 |
# The following commented out code block can be used to generate |
# The following commented out code block can be used to generate |
289 |
# the base64 coded reference image data |
# the base64 coded reference image data |
326 |
'yItGQwJCQo9RxozIgkyCQoPFxAtDBkgIgkJCQkJCQkJMRoQECJQNi9EIAAgCQkJCQ' |
'yItGQwJCQo9RxozIgkyCQoPFxAtDBkgIgkJCQkJCQkJMRoQECJQNi9EIAAgCQkJCQ' |
327 |
'kSUA88UAYeBjELICA8HiI=\n') |
'kSUA88UAYeBjELICA8HiI=\n') |
328 |
self.assertEquals(renderer.raster_data, raw_data) |
self.assertEquals(renderer.raster_data, raw_data) |
329 |
|
self.assertEquals(renderer.raster_format, "BMP") |
330 |
|
|
331 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
332 |
[('BeginDrawing',), |
[('BeginDrawing',), |
349 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
350 |
|
|
351 |
dc = MockDC() |
dc = MockDC() |
352 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
353 |
|
|
354 |
renderer.render_map(map) |
renderer.render_map() |
355 |
|
|
356 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
357 |
[('BeginDrawing',), |
[('BeginDrawing',), |
377 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
378 |
|
|
379 |
dc = MockDC() |
dc = MockDC() |
380 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
381 |
|
|
382 |
renderer.render_map(map) |
renderer.render_map() |
383 |
|
|
384 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
385 |
[('BeginDrawing',), |
[('BeginDrawing',), |
406 |
self.to_destroy.append(map) |
self.to_destroy.append(map) |
407 |
|
|
408 |
dc = MockDC() |
dc = MockDC() |
409 |
renderer = SimpleRenderer(dc, 2, (10, 10)) |
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
410 |
|
|
411 |
renderer.render_map(map) |
renderer.render_map() |
412 |
|
|
413 |
self.assertEquals(dc.calls, |
self.assertEquals(dc.calls, |
414 |
[('BeginDrawing',), |
[('BeginDrawing',), |
419 |
('EndDrawing',)]) |
('EndDrawing',)]) |
420 |
|
|
421 |
|
|
422 |
|
def test_point_with_classification(self): |
423 |
|
"""Test BaseRenderer with point layer and classification""" |
424 |
|
table = MemoryTable([("type", FIELDTYPE_STRING), |
425 |
|
("value", FIELDTYPE_DOUBLE), |
426 |
|
("code", FIELDTYPE_INT)], |
427 |
|
[("UNKNOWN", 0.0, 0), |
428 |
|
("UNKNOWN", 0.0, 1)]) |
429 |
|
shapes = [[[(0, 0)]], [[(10, 10)]]] |
430 |
|
store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table) |
431 |
|
|
432 |
|
map = Map("TestBaseRenderer") |
433 |
|
layer = Layer("point layer", store) |
434 |
|
group = ClassGroupSingleton(1) |
435 |
|
group.GetProperties().SetFill(Color(0, 0, 1)) |
436 |
|
layer.GetClassification().AppendGroup(group) |
437 |
|
layer.SetClassificationColumn("code") |
438 |
|
|
439 |
|
map.AddLayer(layer) |
440 |
|
self.to_destroy.append(map) |
441 |
|
|
442 |
|
dc = MockDC() |
443 |
|
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
444 |
|
|
445 |
|
renderer.render_map() |
446 |
|
|
447 |
|
self.assertEquals(dc.calls, |
448 |
|
[('BeginDrawing',), |
449 |
|
('SetBrush', ('brush', Transparent)), |
450 |
|
('SetPen', ('pen', Color(0, 0, 0), 1)), |
451 |
|
('DrawEllipse', 5, 5, 10, 10), |
452 |
|
('SetBrush', ('brush', Color(0, 0, 1))), |
453 |
|
('SetPen', ('pen', Color(0, 0, 0), 1)), |
454 |
|
('DrawEllipse', 25, -15, 10, 10), |
455 |
|
('SetFont', "label font"), |
456 |
|
('EndDrawing',)]) |
457 |
|
|
458 |
|
|
459 |
|
def test_renderer_extension(self): |
460 |
|
"""Test renderer with a renderer extension""" |
461 |
|
class MyLayer(BaseLayer): |
462 |
|
pass |
463 |
|
|
464 |
|
calls = [] |
465 |
|
def my_renderer(renderer, layer): |
466 |
|
calls.append((renderer, layer)) |
467 |
|
return () |
468 |
|
|
469 |
|
add_renderer_extension(MyLayer, my_renderer) |
470 |
|
|
471 |
|
try: |
472 |
|
map = Map("test_renderer_extension") |
473 |
|
layer = MyLayer("my layer") |
474 |
|
map.AddLayer(layer) |
475 |
|
self.to_destroy.append(map) |
476 |
|
|
477 |
|
dc = MockDC() |
478 |
|
renderer = SimpleRenderer(dc, map, 2, (10, 10)) |
479 |
|
renderer.render_map() |
480 |
|
finally: |
481 |
|
init_renderer_extensions() |
482 |
|
|
483 |
|
self.assertEquals(calls, [(renderer, layer)]) |
484 |
|
|
485 |
|
|
486 |
if __name__ == "__main__": |
if __name__ == "__main__": |
487 |
support.run_tests() |
support.run_tests() |