/[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 1867 by bh, Mon Oct 27 13:02:13 2003 UTC revision 2712 by bernhard, Sun Oct 15 23:27:05 2006 UTC
# Line 1  Line 1 
1  # Copyright (C) 2003 by Intevation GmbH  # Copyright (C) 2003, 2005, 2006 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4    # Bernhard Reiter <[email protected]>
5  #  #
6  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
7  # Read the file COPYING coming with the software for details.  # Read the file COPYING coming with the software for details.
# Line 14  __version__ = "$Revision$" Line 15  __version__ = "$Revision$"
15  import os  import os
16  import binascii  import binascii
17  import unittest  import unittest
18    import locale
19    
20    import localessupport
21  from mockgeo import SimpleShapeStore  from mockgeo import SimpleShapeStore
22  import support  import support
23  support.initthuban()  support.initthuban()
# Line 22  support.initthuban() Line 25  support.initthuban()
25  from Thuban.Model.color import Transparent, Color  from Thuban.Model.color import Transparent, Color
26  from Thuban.Model.data import SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT  from Thuban.Model.data import SHAPETYPE_ARC, SHAPETYPE_POLYGON, SHAPETYPE_POINT
27  from Thuban.Model.map import Map  from Thuban.Model.map import Map
28  from Thuban.Model.layer import Layer, RasterLayer  from Thuban.Model.layer import BaseLayer, Layer, RasterLayer
29  from Thuban.Model.table import MemoryTable, \  from Thuban.Model.table import MemoryTable, \
30       FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING       FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING
31  from Thuban.Model.classification import ClassGroupSingleton  from Thuban.Model.classification import ClassGroupSingleton
32  import Thuban.Model.resource  import Thuban.Model.resource
33    
34    
35  from Thuban.UI.baserenderer import BaseRenderer  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:  class MockDC:
42    
# Line 88  class SimpleRenderer(BaseRenderer): Line 94  class SimpleRenderer(BaseRenderer):
94      def label_font(self):      def label_font(self):
95          return "label font"          return "label font"
96    
97      def draw_raster_data(self, data):      def draw_raster_data(self, x, y, data, format='BMP', opacity=1.0):
98          self.raster_data = data          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("No gdal support")
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:  class MockProjection:
115    
116      """Objects that look like projections but simply apply non-uniform scalings      """Objects that look like projections but simply apply non-uniform scalings
# Line 113  class TestBaseRenderer(unittest.TestCase Line 132  class TestBaseRenderer(unittest.TestCase
132      def setUp(self):      def setUp(self):
133          """Set self.to_destroy to an empty list          """Set self.to_destroy to an empty list
134    
135          Test should put all objects whose Destroy should be called atunittest.main          Tests should put all objects whose Destroy should be called at
136          the end into this list so that they're destroyed in tearDown          the end into this list so that they're destroyed in tearDown.
137          """          """
138          self.to_destroy = []          self.to_destroy = []
139    
# Line 260  class TestBaseRenderer(unittest.TestCase Line 279  class TestBaseRenderer(unittest.TestCase
279                             ('SetFont', "label font"),                             ('SetFont', "label font"),
280                             ('EndDrawing',)])                             ('EndDrawing',)])
281    
282        def test_projected_raster_layer(self):
283            if not Thuban.Model.resource.has_gdal_support():
284                raise support.SkipTest("No gdal support")
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_decimalcommalocale(self):
349            if not Thuban.Model.resource.has_gdal_support():
350                raise support.SkipTest("No gdal support")
351    
352            def _do_project_island():
353                """Project island.tif and return result."""
354                layer = RasterLayer("raster layer",
355                                    os.path.join("..", "Data", "iceland",
356                                                 "island.tif"))
357    
358                dc = MockDC(size = (10, 5))
359                renderer = SimpleRenderer(dc, map, 34, (800, 2250))
360    
361                projection = "+proj=latlong +to_meter=0.017453 +ellps=clrk66"
362                new_projection = "+proj=utm +zone=27 +ellps=clrk66"
363    
364                return renderer.projected_raster_layer(layer, \
365                                projection, new_projection, \
366                                (322003.1320390497, 6964094.1718668584, 876022.1891829354, 7460469.6276894147), [0, 0], (10,5), 1)
367    
368            oldlocale = localessupport.setdecimalcommalocale()
369            img_data2 = _do_project_island()
370            locale.setlocale(locale.LC_NUMERIC, oldlocale)
371    
372            img_data1 = _do_project_island()
373    
374            self.assertEquals(img_data1, img_data2)
375    
376      def test_raster_no_projection(self):      def test_raster_no_projection(self):
377          """Test BaseRenderer with raster layer and no projections          """Test BaseRenderer with raster layer and no projections
378    
# Line 275  class TestBaseRenderer(unittest.TestCase Line 388  class TestBaseRenderer(unittest.TestCase
388          layer = RasterLayer("raster layer",          layer = RasterLayer("raster layer",
389                              os.path.join("..", "Data", "iceland",                              os.path.join("..", "Data", "iceland",
390                                           "island.tif"))                                           "island.tif"))
391            layer.SetMaskType(layer.MASK_NONE)
392    
393          map.AddLayer(layer)          map.AddLayer(layer)
394          self.to_destroy.append(map)          self.to_destroy.append(map)
395    
# Line 285  class TestBaseRenderer(unittest.TestCase Line 400  class TestBaseRenderer(unittest.TestCase
400    
401          # The following commented out code block can be used to generate          # The following commented out code block can be used to generate
402          # the base64 coded reference image data          # the base64 coded reference image data
403          #hexed = binascii.b2a_base64(renderer.raster_data)          #hexed = binascii.b2a_base64(renderer.raster_data[2][0])
404          #while hexed:          #while hexed:
405          #    print repr(hexed[:65])              #print repr(hexed[:65])
406          #    hexed = hexed[65:]              #hexed = hexed[65:]
407    
408          # The reference data as a base64 coded BMP image          # The reference data as a base64 coded RAW image
409          raw_data = binascii.a2b_base64(          raw_data = binascii.a2b_base64(
410              'Qk3GBQAAAAAAADYEAAAoAAAAFAAAABQAAAABAAgAAAAAAJABAAAAAAAAAAAAAAABA'              'UmbmUmbmUmbmUmbmUmbmAtYCJooCAtICAq4CJooCArICAuICArICAuYCAs4COn4CO'
411              'AAAAAAAApYOAALGAgAGfjoAHmZyACZ2egAujo4AArICAE66GgACngIA5mZSAJqONg'              'n4CAq4CAuICFpICUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAuYCAqICAqoCAqoCFp'
412              'ACzgIAAoIyABZqZgAO4uYAAtICAAKqAgAScloAAtYCADKepgAS2t4AAooiAALaAgA'              'ICJooCIo4CCpoCQnoGOn4CDpYCOn4CUmbmUmbmNo6aEpYCLoYCAqICGpICFpICUmb'
413              'CtgIAHsbOAAp2TgACogIAFtbaACqOigAidnoAAuICADKaogACfjoAAr4CAAKSFgAm'              'mAt4CUmbmNo6aAtICArYCAqoCKoYCMoICTnYKOn4CFpICUmbmUmbmUmbmUmbmAp4C'
414              'fnoAAo4eABrS1gAibnoAHsbKAAp6SgACmg4AGs7SACLCxgAqioIAAoYqAAZ6RgACm'              'NoICArYCAr4CCpoCAqYCCpoCEpYCHo4CFpICHo4CGpICFpICKoYCTnYKMoICAp4CU'
415              'goAKrK6AALmAgAC3gIAApIaABZqagACngYAAo4iAAKmAgAivsYAJoJ6AALCAgACyg'              'mbmUmbmUmbmUmbmUmbmUmbmAtYCAroCArYCCpoCAtYCAroCAtICAsYCUmbmAt4CAq'
416              'IAAq4CAAKWEgAOclYALpqeAAK6AgACgjYAEm5eAAKKKgAGekIAHmp6ABpmcgAChi4'              'YCAroCMoICAs4CAs4CAtYCAt4CAqYCUmbmUmbmUmbmUmbmAtoCAtYCAq4CAtoCBp4'
417              'ALpaaACJyegAClhYAEnJeAAZ+QgAqhoIADnZSAB5mdgACiiYAJnp6ACqGegAqrrYA'              'CAroCAqoCAq4CAr4CDpYCGpICAt4CAsICDpYCArICCpoCHo4CAs4CAuICUmbmUmbm'
418              'GmpuAB5megACkh4ALqqyAA52VgAulpYAAoI6AAZ+PgASbmIALpKWAA7m5gAWbmYAG'              'UmbmUmbmUmbmUmbmAuICAqICFpYCAq4CDpoCAqYCFpICAqYCUmbmNo6aAsYCCpoCD'
419              'mpyAC6SjgAqioYADnZOAA7q6gAianoALqauABpqagAqgnoAEnJWAAp6RgAWbmIACu'              'pYCAqICAtoCUmbmAt4CAqoCCpoCAroCHo4CAsYCAq4CAsICAs4CAp4CUmbmAtYCAq'
420              '7uACqGfgAqiooAMqauAAby8gAmusIAMp6qAC6WngAyoqoABvb2AC6SkgAS3uIAJra'              'YCIooCHo4CAsICAr4CAqICEpYCAs4CAqICArICDpYCEpYCEpYCAr4CUmbmEpYCAs4'
421              '+AB7KzgAynqIALq62ADKirgAC+voAGsrSABLi4gAG8vYADubqAC6qtgAuprIABvb6'              'CAtICAs4CAqYCUmbmAtoCAp4CCpoCDpYCAq4CArICAqoCAqYCAqYCAtYCAtoCDpYC'
422              'ACLCygAW2t4AKra+AAru8gAS4uYACuruAAry8gAG+voAAEBAAFhkZABAQEAABp6fA'              'At4CUmbmUmbmUmbmUmbmAt4CAsoCAsoCAp4CAp4CCpoCAsoCAt4CNo6aUmbmUmbmU'
423              'EBACAAAgPwAAPu/AJE9CgBACAAALj1BAEAICAAGPAAAQAgAAAY8+gBACL8AJTxXAA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmAt4CAtYCCpoCAqICAroCAr4CUmbmUm'
424              'gIQAAAPEAAAAgIAAY8QABACAgAAGQAAABAAAAALpoAAEBAAAAALgAAAEAABkAGAEA'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
425              'IQAD2AEAAvwAIAJAu2ABAQEAALmQ5AEBAQAAAnp8AAEAIAAD4+gAAv78An5rDAEBA'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
426              'QAAuhAcAQEBAAAb8AABAvwAAAGQKAABAAABpLksAQEAIAC4ACwBAAAAAAPkGAAC/Q'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
427              'AD2APoAvwC/AJ0umgBAQEAAAGRkAABAQAAGnp8AQEAIAPcA/AC/AL8A7D0GAEAIQA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
428              'D4hAAAv0AAAAD8QAAAvwgA92T6AL9AvwDsLlcAQEBAAC4AQABAAAgA+EAAAL8IAAA'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
429              '8AAAACAAAAJ8uVgBAQEAAAGQ5AABAQAAAnpcAAEBAAPYAQAC/AAgAnQsGAEAAQAAA'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
430              'hG0AAEBAAB38PQAIv0AA9mT6AL9AvwAJLmwAZUBAAB0AQAAIAAgAHUAAAAgIAAAAA'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmU'
431              'AAAAAAAAACzbAAAQEAA//k5AH+/QAAGb5cAQEBAAACy5AAAQAgAAIpAAABACAAAAA'              'mbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUm'
432              'AAAAAAAAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk'              'bmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmb'
433              'JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ'              'mUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm'
434              'CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC'              'UmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbmUmbm\n')
435              'QkJCQkJCQkJCQkJCQkJCQkJCQkyEi8aQCEJCQkJCQkJCQkJCQkJCTI7OwgILzsyCg'  
436              'kJCQkJCQkJCQkJCzcJFggvADwGEDc3EhYAMgkJCQkJEjcVJDohGj0LGgYAPT0hCT0'          self.assertEquals(renderer.raster_data,
437              'LDyI3CQoBLwAaFgkyEC9AJAE8OgsIMjoABi8kCx4JCQkJCQkeGko8KTcLCxIyNwkJ'                            (20,20,(raw_data, None, None)))
438              'CQkWEjwWNUAQPCEAMwgJCQkJCQkSQBcvEkAPAQkyN0AMCQkJCQhBFyEvNy89JCIkM'  
439              'yItGQwJCQo9RxozIgkyCQoPFxAtDBkgIgkJCQkJCQkJMRoQECJQNi9EIAAgCQkJCQ'          self.assertEquals(renderer.raster_format, "RAW")
             'kSUA88UAYeBjELICA8HiI=\n')  
         self.assertEquals(renderer.raster_data, raw_data)  
440    
441          self.assertEquals(dc.calls,          self.assertEquals(dc.calls,
442                            [('BeginDrawing',),                            [('BeginDrawing',),
# Line 453  class TestBaseRenderer(unittest.TestCase Line 566  class TestBaseRenderer(unittest.TestCase
566                             ('EndDrawing',)])                             ('EndDrawing',)])
567    
568    
569        def test_renderer_extension(self):
570            """Test renderer with a renderer extension"""
571            class MyLayer(BaseLayer):
572                pass
573    
574            calls = []
575            def my_renderer(renderer, layer):
576                calls.append((renderer, layer))
577                return ()
578    
579            add_renderer_extension(MyLayer, my_renderer)
580    
581            try:
582                map = Map("test_renderer_extension")
583                layer = MyLayer("my layer")
584                map.AddLayer(layer)
585                self.to_destroy.append(map)
586    
587                dc = MockDC()
588                renderer = SimpleRenderer(dc, map, 2, (10, 10))
589                renderer.render_map()
590            finally:
591                init_renderer_extensions()
592    
593            self.assertEquals(calls, [(renderer, layer)])
594    
595    
596  if __name__ == "__main__":  if __name__ == "__main__":
597      support.run_tests()      support.run_tests()

Legend:
Removed from v.1867  
changed lines
  Added in v.2712

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26