source: qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_plot_base.py @ 5605

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_plot_base.py@5605
Revision 5605, 9.6 KB checked in by pnorton, 11 years ago (diff)

First attempt at adding the contour plot. I've tried to re-use existing components where possible. There is still a lot of duplication between the contour plot base and plot base classes.

Line 
1#/urs/bin/env python
2"""
3test_plot_base.py
4"""
5
6import cdms2 as cdms
7import nose
8
9import matplotlib
10
11import geoplot.plot_base
12import geoplot
13from geoplot.plot_base import PlotBase
14
15import geoplot.tests.test_utils as test_utils
16
17import geoplot.tests.test_config as testConfig
18config = testConfig.getConfig()
19       
20       
21arguments = {'format':'jpg', 'width': 400, 'height': 601, 'drawValues': True,
22             'xLimits': (-13.0, 3.0), 'yLimits': (49.0, 60.0), 'dpi': 92,
23             'cmap': matplotlib.cm.hot, 'valueFormat': "%.2f", 'drawColourBar': False,
24             'colourBarLabel': "temperature change", 
25             'colourBarPosition': 'horizontal', 'colourBarMin': 1,
26             'colourBarMax': 10, 'drawLogo': False, 'drawCoast': False,
27             'drawRivers': False, 'plotTitle': " some plot",
28             'metadataList': [('Name one', 'value 1'), ('Name two', 'value 2')],
29             'fontSize': "large", 'units': "degrees", 'showGridLines':True,
30             'outputCMYK':True, 'addShapefile':'some/shape/file/','drawValuesFile':'some/draw/value/file.csv', 'drawContour':True}
31
32argumentTypes = {'format':str, 'width': int, 'height':int, 'drawValues': bool,
33                 'xLimits': tuple, 'yLimits': tuple, 'dpi': int,
34                 'cmap': matplotlib.colors.LinearSegmentedColormap,
35                 'valueFormat': str, 'drawColourBar': bool,
36                 'colourBarLabel': str, 'colourBarPosition': str,
37                 'colourBarMin': float, 'colourBarMax': float,
38                 'drawLogo': bool, 'drawCoast': bool, 'drawRivers': bool, 
39                 'plotTitle': str, 'metadataList': list, 'fontSize': str,
40                 'units': str, 'showGridLines':bool, 'outputCMYK':bool,
41                 'addShapefile':str,'drawValuesFile':str, 'drawContour':bool}
42
43dynamicDefaultArgs = ['colourBarLabel', 'colourBarPosition', 'cmap']
44
45DEFAULTS_SECTION = 'PlotBaseDefaults'
46
47class Test_PlotBase(object):
48
49    def setUp(self):
50        self.oldConfig = geoplot.plot_base.config
51        geoplot.plot_base.config = config
52        self.cdmsVar = cdms.createVariable([1,2,3,4])
53
54    def tearDown(self):
55        geoplot.plot_base.config = self.oldConfig
56   
57    def constructUsingDefaults(self):
58        self.pb = SimplePlot(self.cdmsVar)
59       
60    def constructUsingArguments(self):
61        self.pb = SimplePlot(self.cdmsVar, **arguments)
62   
63    def test_001_checkDefaultArguments(self):
64       
65        self.constructUsingDefaults()
66       
67        #for each of the keys form the valid constructor keys dictionary
68        for key in self.pb.validConstructorKWArgs:
69           
70            #if the default is set dynamically ignore it
71            if key in dynamicDefaultArgs: continue
72           
73            currentValue = getattr(self.pb, key)
74            print "Testing key:", key
75           
76            #if they key is in the config defaults section then it should match
77            #the current attribute, otherwise it will be none
78            if key in config[DEFAULTS_SECTION]:
79                default = config[DEFAULTS_SECTION][key]
80                nose.tools.assert_equals(currentValue, default)
81            else:
82                nose.tools.assert_equals(currentValue, None)
83
84    def test_002_checkInitialiserSetsProperties(self):
85        """
86        Checks that the arguments provided can be retrieved via the objects
87        properties.
88        """
89        self.constructUsingArguments()
90
91        #for each of the keys in the dictionary used as the arguments
92        for key in arguments.keys():
93            print "Testing key", key
94            argumentValue = arguments[key]
95            propertyValue = getattr(self.pb, key)
96            nose.tools.assert_equals(argumentValue, propertyValue)
97       
98    def test_003_checkPropertiesCanBeSet(self):
99        """
100        Chekcs that the properties can be set and then read back
101        """
102        self.constructUsingDefaults()
103       
104        #set each of the proerties using the arguments dictionary
105        for key in self.pb.validConstructorKWArgs:
106            newValue = arguments[key]
107            setattr(self.pb, key, newValue)
108            propertyValue = getattr(self.pb, key)
109            nose.tools.assert_equals(propertyValue, newValue)
110   
111    def test_004_checkPropertieTypes(self):
112        """
113        Chekcs that the properties return the correct type
114        """
115        self.constructUsingArguments()
116               
117        for key in self.pb.validConstructorKWArgs:
118            print "Testing key", key
119            propertyValue = getattr(self.pb, key)
120            propertyType = propertyValue.__class__
121            expectedType = argumentTypes[key]
122            print propertyValue, propertyType, expectedType
123            nose.tools.assert_equals(propertyType, expectedType)
124           
125    def test_005_testMapSet(self):
126        """
127        chack that the map and grid are created
128        """
129        self.constructUsingArguments()
130       
131        map = getattr(self.pb, 'map')
132        gridBuilder = getattr(self.pb, 'gridBuilder')
133       
134        nose.tools.assert_true(map.__class__ == MockMap)
135        nose.tools.assert_true(gridBuilder.__class__ == MockGridBuilder)
136       
137        #test the map attributes match
138        nose.tools.assert_equal(map.xLimits , self.pb.xLimits)
139        nose.tools.assert_equal(map.yLimits , self.pb.yLimits)
140        nose.tools.assert_equal(map.drawCoast , self.pb.drawCoast)
141        nose.tools.assert_equal(map.drawRivers , self.pb.drawRivers)
142       
143        #test the grid attributes
144        nose.tools.assert_true(gridBuilder.cdmsVar is self.pb.cdmsVar)   
145           
146    def test_006_testDefaultColourbarOrientation(self):
147        pbLattudeGreater = SimplePlot(self.cdmsVar, xLimits=[1,10], yLimits=[2,8])
148        pbLongitudeGreater = SimplePlot(self.cdmsVar, xLimits=[50,60], yLimits=[2,30])
149       
150        nose.tools.assert_equal(pbLattudeGreater.colourBarPosition , 'horizontal')
151        nose.tools.assert_equal(pbLongitudeGreater.colourBarPosition , 'vertical')
152       
153    def test_007_testDefautColourBarLabel(self):
154        pb = SimplePlot(self.cdmsVar, units='feet')
155       
156        nose.tools.assert_equal(pb.units, 'feet')
157        nose.tools.assert_equal(pb.colourBarLabel , pb.units)
158       
159    def test_008_testPlotsColourBar(self):
160        self.constructUsingArguments()
161        nose.tools.assert_equal(self.pb.colourBar.__class__ ,
162                               geoplot.colour_bar.ColourBar)
163        nose.tools.assert_equal(self.pb.colourBarLabel ,
164                                self.pb.colourBar.label)
165        nose.tools.assert_equal(self.pb.colourBarPosition ,
166                                self.pb.colourBar.position)
167        nose.tools.assert_equal( (self.pb.colourBarMin, self.pb.colourBarMax) ,
168                                self.pb.colourBar.range)
169       
170    def test_009_testPlotsMetadata(self):
171        self.constructUsingArguments()
172       
173        nose.tools.assert_equal(self.pb.metadataBox.__class__ ,
174                               geoplot.metadata_box.MetadataBox)
175        nose.tools.assert_equal(self.pb.metadataList ,
176                                self.pb.metadataBox.dataList)
177
178    def test_010_testPlotsPlotArea(self):
179        self.constructUsingArguments()
180       
181        nose.tools.assert_equal(self.pb.plotArea.__class__ ,
182                               geoplot.plotarea.PlotArea)
183        nose.tools.assert_equal(self.pb.width,
184                                self.pb.plotArea.width)
185        nose.tools.assert_equal(self.pb.height,
186                                self.pb.plotArea.height)
187        nose.tools.assert_equal(self.pb.dpi,
188                                self.pb.plotArea.dpi)
189        nose.tools.assert_equal(self.pb.fontSize,
190                                self.pb.plotArea.fontSize)
191        nose.tools.assert_equal(self.pb.plotTitle,
192                                self.pb.plotArea.plotTitle)
193               
194    def test_011_testPlotWriterAttribute(self):
195        self.constructUsingArguments()
196       
197        nose.tools.assert_equal(self.pb.plotWriter.__class__ ,
198                               geoplot.plot_writer.PlotWriter)
199        nose.tools.assert_equal(self.pb.format,
200                                self.pb.plotWriter.format)
201        nose.tools.assert_equal(self.pb.outputCMYK,
202                                self.pb.plotWriter.outputCMYK)
203    def test_012_testDefaultCmap(self):
204        self.constructUsingDefaults()
205       
206        defaultCmap = matplotlib.cm.get_cmap()
207        defaultCmap.set_bad("w")
208       
209        nose.tools.assert_equal(self.pb.cmap.__class__, defaultCmap.__class__)
210       
211        nose.tools.assert_true(test_utils._comparePublicAttribues(defaultCmap, 
212                                                               self.pb.cmap))
213       
214class SimplePlot(PlotBase):
215    """
216    A simple implementation of the abstract PlotBase class that uses Mock grid
217    and map objects.
218    """
219    def __init__(self, cdmsVar, **kwargs):
220        PlotBase.__init__(self, cdmsVar, **kwargs)
221
222    def _getMap(self, xLimits, yLimits, drawCoast, drawRivers, addShapefile):
223        return MockMap(xLimits, yLimits, drawCoast, drawRivers, addShapefile)
224
225    def _getGridBuilder(self, cdmsVar):
226        return MockGridBuilder(cdmsVar)
227
228class MockGridBuilder(object):
229    def __init__(self, cdmsVar):
230        self.cdmsVar = cdmsVar
231
232class MockMap(object):
233    def __init__(self,xLimits, yLimits, drawCoast, drawRivers, addShapefile):
234        self.xLimits = xLimits
235        self.yLimits = yLimits
236        self.drawCoast = drawCoast
237        self.drawRivers = drawRivers
238        self.addShapefile = addShapefile
239       
240if __name__ == '__main__':
241
242    import geoplot.log_util
243    geoplot.log_util.setGeoplotHandlerToStdOut()
244
245    nose.runmodule()
Note: See TracBrowser for help on using the repository browser.