/[thuban]/trunk/thuban/test/test_classgen.py
ViewVC logotype

Diff of /trunk/thuban/test/test_classgen.py

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

revision 896 by jonathan, Mon May 12 11:21:14 2003 UTC revision 1379 by bh, Tue Jul 8 13:23:20 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2002 by Intevation GmbH  # Copyright (c) 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 16  import unittest Line 16  import unittest
16  import support  import support
17  support.initthuban()  support.initthuban()
18    
19  from Thuban.Model.classgen import ClassGenerator  from Thuban.Model.classgen import \
20        generate_singletons, \
21        generate_uniform_distribution, \
22        generate_quantiles, \
23        calculate_quantiles, \
24        GreyRamp, CustomRamp
25  from Thuban.Model.range import Range  from Thuban.Model.range import Range
26    from Thuban.Model.color import Color
27    
28    from Thuban.Model.classification import ClassGroupRange, ClassGroupProperties
29    
30  class ClassGenTest(unittest.TestCase):  class ClassGenTest(unittest.TestCase):
31    
32      def test(self):      def doClassRangeTest(self, clazz, ranges):
33          """Test ClassGenerator methods"""          self.assertEquals(clazz.GetNumGroups(), len(ranges))
34            for i in range(clazz.GetNumGroups()):
35                group = clazz.GetGroup(i)
36                r1 = str(Range(ranges[i]))
37                r2 = group.GetRange()
38                self.assertEquals(r1, r2)
39    
40            self.doBoundsTest(clazz)
41    
42        def doClassSingleTest(self, clazz, _list):
43            self.assertEquals(clazz.GetNumGroups(), len(_list))
44            for i in range(clazz.GetNumGroups()):
45                group = clazz.GetGroup(i)
46                self.assertEquals(group.GetValue(), _list[i])
47    
48            self.doBoundsTest(clazz)
49    
50        def doBoundsTest(self, clazz, ramp = GreyRamp):
51    
52            #
53            # check that the properties are right (i.e. the first group
54            # is all white, the last is all black). This assumes that
55            # the GreyRamp, unless another is provided.
56            #
57            if clazz.GetNumGroups() >= 1:
58                groupF = clazz.GetGroup(0)
59                first = ramp.GetProperties(0)
60                self.assertEquals(groupF.GetProperties(), first)
61    
62            if clazz.GetNumGroups() >= 2:
63                groupL = clazz.GetGroup(clazz.GetNumGroups() - 1)
64                last = ramp.GetProperties(1)
65                self.assertEquals(groupL.GetProperties(), last)
66                
67        def test_generate_singletons(self):
68            """Test generate_singletons"""
69    
70          eq = self.assertEquals          eq = self.assertEquals
71            gs = generate_singletons
72            ramp = GreyRamp
73    
74            _list = [1, 2, 3, 4]
75            cl = gs(_list, ramp)
76            self.doClassSingleTest(cl, _list)
77    
78            _list = range(0, 100)
79            cl = gs(_list, ramp)
80            self.doClassSingleTest(cl, _list)
81    
82            _list = range(-100, 100)
83            cl = gs(_list, ramp)
84            self.doClassSingleTest(cl, _list)
85    
86            _list = ['a', 'b', 'c', 'd']
87            cl = gs(_list, ramp)
88            self.doClassSingleTest(cl, _list)
89    
90            _list = []
91            cl = gs(_list, ramp)
92            self.doClassSingleTest(cl, _list)
93    
94            _list = [1]
95            cl = gs(_list, ramp)
96            self.doClassSingleTest(cl, _list)
97            
98    
99        def test_generate_uniform_distribution(self):
100            """Test generate_uniform_distribution"""
101    
102            eq = self.assertEquals
103            gud = generate_uniform_distribution
104            ramp = GreyRamp
105    
106            cl = gud(0, 99, 10, ramp, True)
107            self.doClassRangeTest(cl, ("[0;10[", "[10;20[", "[20;30[", "[30;40[",
108                                  "[40;50[", "[50;60[", "[60;70[", "[70;80[",
109                                  "[80;90[", "[90;99]"))
110    
111            cl = gud(0, 99, 10, ramp, False)
112            self.doClassRangeTest(cl, ("[0;9.9[", "[9.9;19.8[", "[19.8;29.7[",
113                                  "[29.7;39.6[", "[39.6;49.5[", "[49.5;59.4[",
114                                  "[59.4;69.3[", "[69.3;79.2[", "[79.2;89.1[",
115                                  "[89.1;99.0]"))
116    
117            cl = gud(1, 2, 2, ramp, False)
118            self.doClassRangeTest(cl, ("[1;1.5[", "[1.5;2]"))
119    
120            cl = gud(1, 2, 2, ramp, True)
121            self.doClassRangeTest(cl, ("[1;2[", "[2;2]"))
122    
123    
124          cg = ClassGenerator()      def test_generate_quantiles(self):
125            """Test generate_quantiles"""
126    
127            eq = self.assertEquals
128    
129          #          #
130          # Test CalculateQuantiles          # Test calculate_quantiles
131          #          #
132    
133          cq = cg.CalculateQuantiles          gq = generate_quantiles
134    
135            ramp = GreyRamp
136    
137            adj, cl = gq([1, 2, 3, 4], [.25, .5, .75, 1.0], ramp, Range("[1;4]"))
138            self.failIf(adj)
139            self.doClassRangeTest(cl, ("[1;1]", "]1;2]", "]2;3]", "]3;4]"))
140    
141            adj, cl = gq(range(0, 100), [.25, .5, .75, 1.0], ramp, Range("[0;100["))
142            self.failIf(adj)
143            self.doClassRangeTest(cl, ("[0;24]", "]24;49]", "]49;74]", "]74;100["))
144    
145            adj, cl = gq(range(0, 100), [.33, .66, 1.0], ramp, Range("[0;100]"))
146            self.failIf(adj)
147            self.doClassRangeTest(cl, ("[0;32]", "]32;65]", "]65;100]"))
148    
149            # negative input
150            adj,cl = gq(range(-100,100), [.33, .66, 1.0], ramp, Range("[-100;100]"))
151            self.failIf(adj)
152            self.doClassRangeTest(cl, ("[-100;-35]", "]-35;31]", "]31;100]"))
153    
154            # unequal percentiles
155            adj,cl = gq(range(0, 100), [.25, .66, .8, 1.0], ramp, Range("[0;100]"))
156            self.failIf(adj)
157            self.doClassRangeTest(cl, ("[0;24]", "]24;65]", "]65;79]", "]79;100]"))
158    
159            # input all the same
160            adj,cl = gq([1, 1, 1, 1], [.25, .5, .75, 1.0], ramp, Range("[1;4]"))
161            self.failUnless(adj)
162            self.doClassRangeTest(cl, ("[1;4]",))
163    
164            # empty input
165            adj,cl = gq([], [.25, .5, .75, 1.0], ramp, Range("[1;4]"))
166            self.failUnless(adj)
167            self.doClassRangeTest(cl, ())
168    
169            # empty range
170            adj,cl = gq([1, 2, 3, 4], [.25, .5, .75, 1.0], ramp, Range("]0;1["))
171            self.failUnless(adj)
172            self.doClassRangeTest(cl, ())
173    
174            # empty percentiles
175            self.assertRaises(ValueError, gq,
176                              [1, 2, 3, 4], [], ramp, Range("]0;1["))
177    
178            # single percentile
179            self.assertRaises(ValueError, gq,
180                              [1, 2, 3, 4], [.5], ramp, Range("[0;4]"))
181    
182            # more percentiles than input
183            adj,cl = gq([1], [.5, 1.0], ramp, Range("[0;4]"))
184            self.failUnless(adj)
185            self.doClassRangeTest(cl, ("[0;4]",))
186    
187            adj,cl = gq([1], [.1, .2, .3, .4, .5, .6, .7, .8, .9, 1.0], ramp, Range("[0;4]"))
188            self.failUnless(adj)
189            self.doClassRangeTest(cl, ("[0;4]",))
190    
191            # range smaller than the input
192            adj,cl = gq([1, 2, 3, 4], [.5, 1.0], ramp, Range("[2;3]"))
193            self.failIf(adj)
194            self.doClassRangeTest(cl, ("[2;2]","]2;3]"))
195    
196            # range outside the input
197            adj,cl = gq([5, 6, 7, 8], [.5, 1.0], ramp, Range("[2;3]"))
198            self.failUnless(adj)
199            self.doClassRangeTest(cl, ())
200    
201            adj,cl = gq([1, 1, 1, 1, 1, 1], [.25, .5, .75, 1.0], ramp, Range("[1;4]"))
202            self.failUnless(adj)
203            self.doClassRangeTest(cl, ("[1;4]",))
204    
205            adj,cl = gq([1, 1, 1, 1, 1, 2, 3], [.25, .5, .75, 1.0], ramp, Range("[1;4]"))
206            self.failUnless(adj)
207            self.doClassRangeTest(cl, ("[1;1]", "]1;2]", "]2;4]"))
208    
209            # adjusted quantiles
210            adj,cl = gq([1, 1, 1, 1, 1,
211                         2, 2, 2, 2, 2,
212                         3, 3, 3, 3, 3,
213                         4, 4, 4, 4, 4,
214                         5, 5, 5, 5, 5],
215                        [.12, .24, .36, .50, .62, .76, .88, 1.0], ramp, Range("[1;5]"))
216            
217            self.failUnless(adj)
218            self.doClassRangeTest(cl, ("[1;1]", "]1;2]", "]2;3]", "]3;4]", "]4;5]"))
219            
220        def test_calculate_quantiles(self):
221            """Test calculate_quantiles"""
222    
223            eq = self.assertEquals
224    
225            #
226            # Test calculate_quantiles
227            #
228    
229            cq = calculate_quantiles
230    
231          result = cq([1, 2, 3, 4], [.25, .5, .75, 1.0], Range("[1;4]"))          result = cq([1, 2, 3, 4], [.25, .5, .75, 1.0], Range("[1;4]"))
232          eq(result, (0, 0, 3, [(0, .25), (1, .5), (2, .75), (3, 1.0)]))          eq(result, (0, 0, 3, [(0, .25), (1, .5), (2, .75), (3, 1.0)]))
# Line 64  class ClassGenTest(unittest.TestCase): Line 258  class ClassGenTest(unittest.TestCase):
258          eq(result, None)          eq(result, None)
259    
260          # empty percentiles          # empty percentiles
261          result = cq([1, 2, 3, 4], [], Range("]0;1["))          self.assertRaises(ValueError, cq, [1, 2, 3, 4], [], Range("]0;1["))
         eq(result, None)  
262    
263          # single percentile          # single percentile
264          result = cq([1, 2, 3, 4], [.5], Range("[0;4]"))          self.assertRaises(ValueError, cq, [1, 2, 3, 4], [.5], Range("[0;4]"))
265          eq(result, (0, 0, 3, [(1, .5)]))  
266            # percentile doesn't cover range
267            self.assertRaises(ValueError, cq, [1, 2, 3, 4], [.5,.8], Range("[0;4]"))
268    
269          # more percentiles than input          # more percentiles than input
270          result = cq([1], [.5, 1.0], Range("[0;4]"))          result = cq([1], [.5, 1.0], Range("[0;4]"))
# Line 104  class ClassGenTest(unittest.TestCase): Line 299  class ClassGenTest(unittest.TestCase):
299                      [.12, .24, .36, .50, .62, .76, .88, 1.0], Range("[1;5]"))                      [.12, .24, .36, .50, .62, .76, .88, 1.0], Range("[1;5]"))
300          eq(result, (1, 0, 24, [(4, .2), (9, .4), (14, .6), (19, .8), (24, 1.0)]))          eq(result, (1, 0, 24, [(4, .2), (9, .4), (14, .6), (19, .8), (24, 1.0)]))
301    
302    
303    class TestCustomRamp(unittest.TestCase):
304    
305        def test_color_interpolation(self):
306            """Test CustomRamp color interpolation"""
307            start = ClassGroupProperties()
308            start.SetFill(Color(1, 1, 1))
309            start.SetLineColor(Color(0, 0, 0))
310    
311            end = ClassGroupProperties()
312            end.SetFill(Color(1, 0, 0))
313            end.SetLineColor(Color(0, 1, 0))
314    
315            ramp = CustomRamp(start, end)
316            half = ramp.GetProperties(0.5)
317            self.assertEquals(half.GetFill(), Color(1, 0.5, 0.5))
318            self.assertEquals(half.GetLineColor(), Color(0, 0.5, 0))
319    
320    
321  if __name__ == "__main__":  if __name__ == "__main__":
322      unittest.main()      unittest.main()
323    

Legend:
Removed from v.896  
changed lines
  Added in v.1379

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26