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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1552 by bh, Wed Aug 6 17:21:32 2003 UTC revision 2552 by jonathan, Fri Jan 28 15:54:00 2005 UTC
# Line 15  import os Line 15  import os
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:
# Line 85  class SimpleRenderer(BaseRenderer): Line 89  class SimpleRenderer(BaseRenderer):
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, x, y, 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:
# Line 154  class TestBaseRenderer(unittest.TestCase Line 139  class TestBaseRenderer(unittest.TestCase
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',),
# Line 184  class TestBaseRenderer(unittest.TestCase Line 169  class TestBaseRenderer(unittest.TestCase
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',),
# Line 223  class TestBaseRenderer(unittest.TestCase Line 208  class TestBaseRenderer(unittest.TestCase
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',),
# Line 262  class TestBaseRenderer(unittest.TestCase Line 247  class TestBaseRenderer(unittest.TestCase
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',),
# Line 284  class TestBaseRenderer(unittest.TestCase Line 269  class TestBaseRenderer(unittest.TestCase
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",
# Line 293  class TestBaseRenderer(unittest.TestCase Line 281  class TestBaseRenderer(unittest.TestCase
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
290          #hexed = binascii.b2a_base64(renderer.raster_data)          #hexed = binascii.b2a_base64(renderer.raster_data[2][1])
291          #while hexed:          #while hexed:
292          #    print repr(hexed[:65])              #print repr(hexed[:65])
293          #    hexed = hexed[65:]              #hexed = hexed[65:]
294    
295          # The reference data as a base64 coded BMP image          # The reference data as a base64 coded RAW image
296          raw_data = binascii.a2b_base64(          raw_data = binascii.a2b_base64(
297              'Qk3GBQAAAAAAADYEAAAoAAAAFAAAABQAAAABAAgAAAAAAJABAAAAAAAAAAAAAAABA'              'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO'
298              'AAAAAAAApYOAALGAgAGfjoAHmZyACZ2egAujo4AArICAE66GgACngIA5mZSAJqONg'              'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp'
299              'ACzgIAAoIyABZqZgAO4uYAAtICAAKqAgAScloAAtYCADKepgAS2t4AAooiAALaAgA'              'ICJooCIo4CCpoCQnoGOn4CDpYCOn4CUmbmUmbmNo6aEpYCLoYCAqICGpICFpICUmb'
300              'CtgIAHsbOAAp2TgACogIAFtbaACqOigAidnoAAuICADKaogACfjoAAr4CAAKSFgAm'              'mAt4CUmbmNo6aAtICArYCAqoCKoYCMoICTnYKOn4CFpICUmbmUmbmUmbmUmbmAp4C'
301              'fnoAAo4eABrS1gAibnoAHsbKAAp6SgACmg4AGs7SACLCxgAqioIAAoYqAAZ6RgACm'              'NoICArYCAr4CCpoCAqYCCpoCEpYCHo4CFpICHo4CGpICFpICKoYCTnYKMoICAp4CU'
302              'goAKrK6AALmAgAC3gIAApIaABZqagACngYAAo4iAAKmAgAivsYAJoJ6AALCAgACyg'              'mbmUmbmUmbmUmbmUmbmUmbmAtYCAroCArYCCpoCAtYCAroCAtICAsYCUmbmAt4CAq'
303              'IAAq4CAAKWEgAOclYALpqeAAK6AgACgjYAEm5eAAKKKgAGekIAHmp6ABpmcgAChi4'              'YCAroCMoICAs4CAs4CAtYCAt4CAqYCUmbmUmbmUmbmUmbmAtoCAtYCAq4CAtoCBp4'
304              'ALpaaACJyegAClhYAEnJeAAZ+QgAqhoIADnZSAB5mdgACiiYAJnp6ACqGegAqrrYA'              'CAroCAqoCAq4CAr4CDpYCGpICAt4CAsICDpYCArICCpoCHo4CAs4CAuICUmbmUmbm'
305              'GmpuAB5megACkh4ALqqyAA52VgAulpYAAoI6AAZ+PgASbmIALpKWAA7m5gAWbmYAG'              'UmbmUmbmUmbmUmbmAuICAqICFpYCAq4CDpoCAqYCFpICAqYCUmbmNo6aAsYCCpoCD'
306              'mpyAC6SjgAqioYADnZOAA7q6gAianoALqauABpqagAqgnoAEnJWAAp6RgAWbmIACu'              'pYCAqICAtoCUmbmAt4CAqoCCpoCAroCHo4CAsYCAq4CAsICAs4CAp4CUmbmAtYCAq'
307              '7uACqGfgAqiooAMqauAAby8gAmusIAMp6qAC6WngAyoqoABvb2AC6SkgAS3uIAJra'              'YCIooCHo4CAsICAr4CAqICEpYCAs4CAqICArICDpYCEpYCEpYCAr4CUmbmEpYCAs4'
308              '+AB7KzgAynqIALq62ADKirgAC+voAGsrSABLi4gAG8vYADubqAC6qtgAuprIABvb6'              'CAtICAs4CAqYCUmbmAtoCAp4CCpoCDpYCAq4CArICAqoCAqYCAqYCAtYCAtoCDpYC'
309              'ACLCygAW2t4AKra+AAru8gAS4uYACuruAAry8gAG+voAAEBAAFhkZABAQEAABp6fA'              'At4CUmbmUmbmUmbmUmbmAt4CAsoCAsoCAp4CAp4CCpoCAsoCAt4CNo6aUmbmUmbmU'
310              'EBACAAAgPwAAPu/AJE9CgBACAAALj1BAEAICAAGPAAAQAgAAAY8+gBACL8AJTxXAA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAt4CAtYCCpoCAqICAroCAr4CUmbmUm'
311              'gIQAAAPEAAAAgIAAY8QABACAgAAGQAAABAAAAALpoAAEBAAAAALgAAAEAABkAGAEA'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
312              'IQAD2AEAAvwAIAJAu2ABAQEAALmQ5AEBAQAAAnp8AAEAIAAD4+gAAv78An5rDAEBA'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
313              'QAAuhAcAQEBAAAb8AABAvwAAAGQKAABAAABpLksAQEAIAC4ACwBAAAAAAPkGAAC/Q'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
314              'AD2APoAvwC/AJ0umgBAQEAAAGRkAABAQAAGnp8AQEAIAPcA/AC/AL8A7D0GAEAIQA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
315              'D4hAAAv0AAAAD8QAAAvwgA92T6AL9AvwDsLlcAQEBAAC4AQABAAAgA+EAAAL8IAAA'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
316              '8AAAACAAAAJ8uVgBAQEAAAGQ5AABAQAAAnpcAAEBAAPYAQAC/AAgAnQsGAEAAQAAA'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
317              'hG0AAEBAAB38PQAIv0AA9mT6AL9AvwAJLmwAZUBAAB0AQAAIAAgAHUAAAAgIAAAAA'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
318              'AAAAAAAAACzbAAAQEAA//k5AH+/QAAGb5cAQEBAAACy5AAAQAgAAIpAAABACAAAAA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
319              'AAAAAAAAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
320              'JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
321              'CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n')
322              'QkJCQkJCQkJCQkJCQkJCQkJCQkyEi8aQCEJCQkJCQkJCQkJCQkJCTI7OwgILzsyCg'  
323              'kJCQkJCQkJCQkJCzcJFggvADwGEDc3EhYAMgkJCQkJEjcVJDohGj0LGgYAPT0hCT0'          raw_mask = binascii.a2b_base64(
324              'LDyI3CQoBLwAaFgkyEC9AJAE8OgsIMjoABi8kCx4JCQkJCQkeGko8KTcLCxIyNwkJ'              'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
325              'CQkWEjwWNUAQPCEAMwgJCQkJCQkSQBcvEkAPAQkyN0AMCQkJCQhBFyEvNy89JCIkM'              'AAAAAAAAAAAAAAA\n')
326              'yItGQwJCQo9RxozIgkyCQoPFxAtDBkgIgkJCQkJCQkJMRoQECJQNi9EIAAgCQkJCQ'          self.assertEquals(renderer.raster_data, (20,20,(raw_data, raw_mask)))
327              'kSUA88UAYeBjELICA8HiI=\n')          self.assertEquals(renderer.raster_format, "RAW")
         self.assertEquals(renderer.raster_data, raw_data)  
328    
329          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
330                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 360  class TestBaseRenderer(unittest.TestCase Line 347  class TestBaseRenderer(unittest.TestCase
347          self.to_destroy.append(map)          self.to_destroy.append(map)
348    
349          dc = MockDC()          dc = MockDC()
350          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
351    
352          renderer.render_map(map)          renderer.render_map()
353    
354          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
355                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 388  class TestBaseRenderer(unittest.TestCase Line 375  class TestBaseRenderer(unittest.TestCase
375          self.to_destroy.append(map)          self.to_destroy.append(map)
376    
377          dc = MockDC()          dc = MockDC()
378          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
379    
380          renderer.render_map(map)          renderer.render_map()
381    
382          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
383                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 417  class TestBaseRenderer(unittest.TestCase Line 404  class TestBaseRenderer(unittest.TestCase
404          self.to_destroy.append(map)          self.to_destroy.append(map)
405    
406          dc = MockDC()          dc = MockDC()
407          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
408    
409          renderer.render_map(map)          renderer.render_map()
410    
411          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
412                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 430  class TestBaseRenderer(unittest.TestCase Line 417  class TestBaseRenderer(unittest.TestCase
417                             ('EndDrawing',)])                             ('EndDrawing',)])
418    
419    
420        def test_point_with_classification(self):
421            """Test BaseRenderer with point layer and classification"""
422            table = MemoryTable([("type", FIELDTYPE_STRING),
423                                 ("value", FIELDTYPE_DOUBLE),
424                                 ("code", FIELDTYPE_INT)],
425                                [("UNKNOWN", 0.0, 0),
426                                 ("UNKNOWN", 0.0, 1)])
427            shapes = [[[(0, 0)]], [[(10, 10)]]]
428            store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
429    
430            map = Map("TestBaseRenderer")
431            layer = Layer("point layer", store)
432            group = ClassGroupSingleton(1)
433            group.GetProperties().SetFill(Color(0, 0, 1))
434            layer.GetClassification().AppendGroup(group)
435            layer.SetClassificationColumn("code")
436    
437            map.AddLayer(layer)
438            self.to_destroy.append(map)
439    
440            dc = MockDC()
441            renderer = SimpleRenderer(dc, map, 2, (10, 10))
442    
443            renderer.render_map()
444    
445            self.assertEquals(dc.calls,
446                              [('BeginDrawing',),
447                               ('SetBrush', ('brush', Transparent)),
448                               ('SetPen', ('pen', Color(0, 0, 0), 1)),
449                               ('DrawEllipse', 5, 5, 10, 10),
450                               ('SetBrush', ('brush', Color(0, 0, 1))),
451                               ('SetPen', ('pen', Color(0, 0, 0), 1)),
452                               ('DrawEllipse', 25, -15, 10, 10),
453                               ('SetFont', "label font"),
454                               ('EndDrawing',)])
455    
456    
457        def test_renderer_extension(self):
458            """Test renderer with a renderer extension"""
459            class MyLayer(BaseLayer):
460                pass
461    
462            calls = []
463            def my_renderer(renderer, layer):
464                calls.append((renderer, layer))
465                return ()
466    
467            add_renderer_extension(MyLayer, my_renderer)
468    
469            try:
470                map = Map("test_renderer_extension")
471                layer = MyLayer("my layer")
472                map.AddLayer(layer)
473                self.to_destroy.append(map)
474    
475                dc = MockDC()
476                renderer = SimpleRenderer(dc, map, 2, (10, 10))
477                renderer.render_map()
478            finally:
479                init_renderer_extensions()
480    
481            self.assertEquals(calls, [(renderer, layer)])
482    
483    
484  if __name__ == "__main__":  if __name__ == "__main__":
485      support.run_tests()      support.run_tests()

Legend:
Removed from v.1552  
changed lines
  Added in v.2552

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26