/[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 1555 by bh, Thu Aug 7 15:41:05 2003 UTC revision 2562 by jonathan, Wed Feb 16 21:14:47 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  import Thuban.Model.resource
30    
 from Thuban.UI.baserenderer import BaseRenderer  
31    
32    from Thuban.UI.baserenderer import BaseRenderer, \
33         add_renderer_extension, init_renderer_extensions
34    
35    from Thuban.version import versions
36    
37  class MockDC:  class MockDC:
38    
# Line 86  class SimpleRenderer(BaseRenderer): Line 90  class SimpleRenderer(BaseRenderer):
90      def label_font(self):      def label_font(self):
91          return "label font"          return "label font"
92    
93      def draw_raster_data(self, data):      def draw_raster_data(self, x, y, data, format='BMP'):
94          self.raster_data = data          self.raster_data = data
95            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])  
96    
97    
98  class MockProjection:  class MockProjection:
# Line 155  class TestBaseRenderer(unittest.TestCase Line 140  class TestBaseRenderer(unittest.TestCase
140          map.AddLayer(layer)          map.AddLayer(layer)
141    
142          dc = MockDC()          dc = MockDC()
143          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
144    
145          renderer.render_map(map)          renderer.render_map()
146    
147          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
148                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 185  class TestBaseRenderer(unittest.TestCase Line 170  class TestBaseRenderer(unittest.TestCase
170          self.to_destroy.append(map)          self.to_destroy.append(map)
171    
172          dc = MockDC()          dc = MockDC()
173          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
174    
175          renderer.render_map(map)          renderer.render_map()
176    
177          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
178                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 224  class TestBaseRenderer(unittest.TestCase Line 209  class TestBaseRenderer(unittest.TestCase
209          self.to_destroy.append(map)          self.to_destroy.append(map)
210    
211          dc = MockDC()          dc = MockDC()
212          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
213    
214          renderer.render_map(map)          renderer.render_map()
215    
216          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
217                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 263  class TestBaseRenderer(unittest.TestCase Line 248  class TestBaseRenderer(unittest.TestCase
248          self.to_destroy.append(map)          self.to_destroy.append(map)
249    
250          dc = MockDC()          dc = MockDC()
251          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
252    
253          renderer.render_map(map)          renderer.render_map()
254    
255          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
256                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 297  class TestBaseRenderer(unittest.TestCase Line 282  class TestBaseRenderer(unittest.TestCase
282          self.to_destroy.append(map)          self.to_destroy.append(map)
283    
284          dc = MockDC(size = (20, 20))          dc = MockDC(size = (20, 20))
285          renderer = SimpleRenderer(dc, 34, (800, 2250))          renderer = SimpleRenderer(dc, map, 34, (800, 2250))
286    
287          renderer.render_map(map)          renderer.render_map()
288    
289          # The following commented out code block can be used to generate          # The following commented out code block can be used to generate
290          # the base64 coded reference image data          # the base64 coded reference image data
291          #hexed = binascii.b2a_base64(renderer.raster_data)          #hexed = binascii.b2a_base64(renderer.raster_data[2][0])
292          #while hexed:          #while hexed:
293          #    print repr(hexed[:65])              #print repr(hexed[:65])
294          #    hexed = hexed[65:]              #hexed = hexed[65:]
295    
296          # The reference data as a base64 coded BMP image          # The reference data as a base64 coded RAW image
297          raw_data = binascii.a2b_base64(          raw_data = binascii.a2b_base64(
298              'Qk3GBQAAAAAAADYEAAAoAAAAFAAAABQAAAABAAgAAAAAAJABAAAAAAAAAAAAAAABA'              'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO'
299              'AAAAAAAApYOAALGAgAGfjoAHmZyACZ2egAujo4AArICAE66GgACngIA5mZSAJqONg'              'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp'
300              'ACzgIAAoIyABZqZgAO4uYAAtICAAKqAgAScloAAtYCADKepgAS2t4AAooiAALaAgA'              'ICJooCIo4CCpoCQnoGOn4CDpYCOn4CUmbmUmbmNo6aEpYCLoYCAqICGpICFpICUmb'
301              'CtgIAHsbOAAp2TgACogIAFtbaACqOigAidnoAAuICADKaogACfjoAAr4CAAKSFgAm'              'mAt4CUmbmNo6aAtICArYCAqoCKoYCMoICTnYKOn4CFpICUmbmUmbmUmbmUmbmAp4C'
302              'fnoAAo4eABrS1gAibnoAHsbKAAp6SgACmg4AGs7SACLCxgAqioIAAoYqAAZ6RgACm'              'NoICArYCAr4CCpoCAqYCCpoCEpYCHo4CFpICHo4CGpICFpICKoYCTnYKMoICAp4CU'
303              'goAKrK6AALmAgAC3gIAApIaABZqagACngYAAo4iAAKmAgAivsYAJoJ6AALCAgACyg'              'mbmUmbmUmbmUmbmUmbmUmbmAtYCAroCArYCCpoCAtYCAroCAtICAsYCUmbmAt4CAq'
304              'IAAq4CAAKWEgAOclYALpqeAAK6AgACgjYAEm5eAAKKKgAGekIAHmp6ABpmcgAChi4'              'YCAroCMoICAs4CAs4CAtYCAt4CAqYCUmbmUmbmUmbmUmbmAtoCAtYCAq4CAtoCBp4'
305              'ALpaaACJyegAClhYAEnJeAAZ+QgAqhoIADnZSAB5mdgACiiYAJnp6ACqGegAqrrYA'              'CAroCAqoCAq4CAr4CDpYCGpICAt4CAsICDpYCArICCpoCHo4CAs4CAuICUmbmUmbm'
306              'GmpuAB5megACkh4ALqqyAA52VgAulpYAAoI6AAZ+PgASbmIALpKWAA7m5gAWbmYAG'              'UmbmUmbmUmbmUmbmAuICAqICFpYCAq4CDpoCAqYCFpICAqYCUmbmNo6aAsYCCpoCD'
307              'mpyAC6SjgAqioYADnZOAA7q6gAianoALqauABpqagAqgnoAEnJWAAp6RgAWbmIACu'              'pYCAqICAtoCUmbmAt4CAqoCCpoCAroCHo4CAsYCAq4CAsICAs4CAp4CUmbmAtYCAq'
308              '7uACqGfgAqiooAMqauAAby8gAmusIAMp6qAC6WngAyoqoABvb2AC6SkgAS3uIAJra'              'YCIooCHo4CAsICAr4CAqICEpYCAs4CAqICArICDpYCEpYCEpYCAr4CUmbmEpYCAs4'
309              '+AB7KzgAynqIALq62ADKirgAC+voAGsrSABLi4gAG8vYADubqAC6qtgAuprIABvb6'              'CAtICAs4CAqYCUmbmAtoCAp4CCpoCDpYCAq4CArICAqoCAqYCAqYCAtYCAtoCDpYC'
310              'ACLCygAW2t4AKra+AAru8gAS4uYACuruAAry8gAG+voAAEBAAFhkZABAQEAABp6fA'              'At4CUmbmUmbmUmbmUmbmAt4CAsoCAsoCAp4CAp4CCpoCAsoCAt4CNo6aUmbmUmbmU'
311              'EBACAAAgPwAAPu/AJE9CgBACAAALj1BAEAICAAGPAAAQAgAAAY8+gBACL8AJTxXAA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAt4CAtYCCpoCAqICAroCAr4CUmbmUm'
312              'gIQAAAPEAAAAgIAAY8QABACAgAAGQAAABAAAAALpoAAEBAAAAALgAAAEAABkAGAEA'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
313              'IQAD2AEAAvwAIAJAu2ABAQEAALmQ5AEBAQAAAnp8AAEAIAAD4+gAAv78An5rDAEBA'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
314              'QAAuhAcAQEBAAAb8AABAvwAAAGQKAABAAABpLksAQEAIAC4ACwBAAAAAAPkGAAC/Q'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
315              'AD2APoAvwC/AJ0umgBAQEAAAGRkAABAQAAGnp8AQEAIAPcA/AC/AL8A7D0GAEAIQA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
316              'D4hAAAv0AAAAD8QAAAvwgA92T6AL9AvwDsLlcAQEBAAC4AQABAAAgA+EAAAL8IAAA'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
317              '8AAAACAAAAJ8uVgBAQEAAAGQ5AABAQAAAnpcAAEBAAPYAQAC/AAgAnQsGAEAAQAAA'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
318              'hG0AAEBAAB38PQAIv0AA9mT6AL9AvwAJLmwAZUBAAB0AQAAIAAgAHUAAAAgIAAAAA'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
319              'AAAAAAAAACzbAAAQEAA//k5AH+/QAAGb5cAQEBAAACy5AAAQAgAAIpAAABACAAAAA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
320              'AAAAAAAAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
321              'JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
322              'CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n')
323              'QkJCQkJCQkJCQkJCQkJCQkJCQkyEi8aQCEJCQkJCQkJCQkJCQkJCTI7OwgILzsyCg'  
324              'kJCQkJCQkJCQkJCzcJFggvADwGEDc3EhYAMgkJCQkJEjcVJDohGj0LGgYAPT0hCT0'          #print
325              'LDyI3CQoBLwAaFgkyEC9AJAE8OgsIMjoABi8kCx4JCQkJCQkeGko8KTcLCxIyNwkJ'          #hexed = binascii.b2a_base64(renderer.raster_data[2][1])
326              'CQkWEjwWNUAQPCEAMwgJCQkJCQkSQBcvEkAPAQkyN0AMCQkJCQhBFyEvNy89JCIkM'          #while hexed:
327              'yItGQwJCQo9RxozIgkyCQoPFxAtDBkgIgkJCQkJCQkJMRoQECJQNi9EIAAgCQkJCQ'              #print repr(hexed[:61])
328              'kSUA88UAYeBjELICA8HiI=\n')              #hexed = hexed[61:]
329          self.assertEquals(renderer.raster_data, raw_data)  
330    
331            if versions['wxPython-tuple'] < (2,5,3):
332                raw_mask = binascii.a2b_base64(
333                    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
334                    'AAAAAAAAAAAAAAAAAAA\n')
335            else:
336                raw_mask = binascii.a2b_base64(
337                    '//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P//8P/'
338                    '/8P//8P//8P//8P//8P\n')
339    
340            self.assertEquals(renderer.raster_data,
341                              (20,20,(raw_data, raw_mask, None)))
342    
343            self.assertEquals(renderer.raster_format, "RAW")
344    
345          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
346                            [('BeginDrawing',),                            [('BeginDrawing',),
347                             ('SetFont', "label font"),                             ('SetFont', "label font"),
348                             ('EndDrawing',)])                             ('EndDrawing',)])
349    
350            if versions['wxPython-tuple'] >= (2,5,3):
351                layer.SetMaskType(layer.MASK_ALPHA)
352                renderer.render_map()
353    
354                #print
355                #hexed = binascii.b2a_base64(renderer.raster_data[2][2])
356                #while hexed:
357                    #print repr(hexed[:61])
358                    #hexed = hexed[61:]
359                raw_alpha = binascii.a2b_base64(
360                    '/////////////////////////////////////////////////////////////'
361                    '/////////////////////////////////////////////////////////////'
362                    '/////////////////////////////////////////////////////////////'
363                    '/////////////////////////////////////////////////////////////'
364                    '/////////////////////////////////////////////////////////////'
365                    '/////////////////////////////////////////////////////////////'
366                    '/////////////////////////////////////////////////////////////'
367                    '/////////////////////////////////////////////////////////////'
368                    '/////////////////////////////////////////////w==\n')
369                self.assertEquals(renderer.raster_data,
370                                  (20,20,(raw_data, None, raw_alpha)))
371    
372    
373            layer.SetMaskType(layer.MASK_NONE)
374            renderer.render_map()
375            self.assertEquals(renderer.raster_data, (20,20,(raw_data, None, None)))
376    
377      def test_point_map_projection(self):      def test_point_map_projection(self):
378          """Test BaseRenderer with point layer and map projection"""          """Test BaseRenderer with point layer and map projection"""
379          table = MemoryTable([("type", FIELDTYPE_STRING),          table = MemoryTable([("type", FIELDTYPE_STRING),
# Line 364  class TestBaseRenderer(unittest.TestCase Line 390  class TestBaseRenderer(unittest.TestCase
390          self.to_destroy.append(map)          self.to_destroy.append(map)
391    
392          dc = MockDC()          dc = MockDC()
393          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
394    
395          renderer.render_map(map)          renderer.render_map()
396    
397          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
398                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 392  class TestBaseRenderer(unittest.TestCase Line 418  class TestBaseRenderer(unittest.TestCase
418          self.to_destroy.append(map)          self.to_destroy.append(map)
419    
420          dc = MockDC()          dc = MockDC()
421          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
422    
423          renderer.render_map(map)          renderer.render_map()
424    
425          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
426                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 421  class TestBaseRenderer(unittest.TestCase Line 447  class TestBaseRenderer(unittest.TestCase
447          self.to_destroy.append(map)          self.to_destroy.append(map)
448    
449          dc = MockDC()          dc = MockDC()
450          renderer = SimpleRenderer(dc, 2, (10, 10))          renderer = SimpleRenderer(dc, map, 2, (10, 10))
451    
452          renderer.render_map(map)          renderer.render_map()
453    
454          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
455                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 434  class TestBaseRenderer(unittest.TestCase Line 460  class TestBaseRenderer(unittest.TestCase
460                             ('EndDrawing',)])                             ('EndDrawing',)])
461    
462    
463        def test_point_with_classification(self):
464            """Test BaseRenderer with point layer and classification"""
465            table = MemoryTable([("type", FIELDTYPE_STRING),
466                                 ("value", FIELDTYPE_DOUBLE),
467                                 ("code", FIELDTYPE_INT)],
468                                [("UNKNOWN", 0.0, 0),
469                                 ("UNKNOWN", 0.0, 1)])
470            shapes = [[[(0, 0)]], [[(10, 10)]]]
471            store = SimpleShapeStore(SHAPETYPE_POINT, shapes, table)
472    
473            map = Map("TestBaseRenderer")
474            layer = Layer("point layer", store)
475            group = ClassGroupSingleton(1)
476            group.GetProperties().SetFill(Color(0, 0, 1))
477            layer.GetClassification().AppendGroup(group)
478            layer.SetClassificationColumn("code")
479    
480            map.AddLayer(layer)
481            self.to_destroy.append(map)
482    
483            dc = MockDC()
484            renderer = SimpleRenderer(dc, map, 2, (10, 10))
485    
486            renderer.render_map()
487    
488            self.assertEquals(dc.calls,
489                              [('BeginDrawing',),
490                               ('SetBrush', ('brush', Transparent)),
491                               ('SetPen', ('pen', Color(0, 0, 0), 1)),
492                               ('DrawEllipse', 5, 5, 10, 10),
493                               ('SetBrush', ('brush', Color(0, 0, 1))),
494                               ('SetPen', ('pen', Color(0, 0, 0), 1)),
495                               ('DrawEllipse', 25, -15, 10, 10),
496                               ('SetFont', "label font"),
497                               ('EndDrawing',)])
498    
499    
500        def test_renderer_extension(self):
501            """Test renderer with a renderer extension"""
502            class MyLayer(BaseLayer):
503                pass
504    
505            calls = []
506            def my_renderer(renderer, layer):
507                calls.append((renderer, layer))
508                return ()
509    
510            add_renderer_extension(MyLayer, my_renderer)
511    
512            try:
513                map = Map("test_renderer_extension")
514                layer = MyLayer("my layer")
515                map.AddLayer(layer)
516                self.to_destroy.append(map)
517    
518                dc = MockDC()
519                renderer = SimpleRenderer(dc, map, 2, (10, 10))
520                renderer.render_map()
521            finally:
522                init_renderer_extensions()
523    
524            self.assertEquals(calls, [(renderer, layer)])
525    
526    
527  if __name__ == "__main__":  if __name__ == "__main__":
528      support.run_tests()      support.run_tests()

Legend:
Removed from v.1555  
changed lines
  Added in v.2562

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26