--- trunk/thuban/test/test_classgen.py 2003/06/12 12:42:10 1165 +++ trunk/thuban/test/test_classgen.py 2003/06/12 12:42:24 1166 @@ -16,21 +16,195 @@ import support support.initthuban() -from Thuban.Model.classgen import CalculateQuantiles +from Thuban.Model.classgen import \ + generate_singletons, \ + generate_uniform_distribution, \ + generate_quantiles, \ + calculate_quantiles, \ + GreyRamp from Thuban.Model.range import Range +from Thuban.Model.classification import ClassGroupRange + class ClassGenTest(unittest.TestCase): - def test(self): - """Test ClassGenerator methods""" + def doClassRangeTest(self, clazz, ranges): + self.assertEquals(clazz.GetNumGroups(), len(ranges)) + for i in range(len(ranges)): + group = clazz.GetGroup(i) + r1 = str(Range(ranges[i])) + r2 = group.GetRange() + self.assertEquals(r1, r2) + + def doClassSingleTest(self, clazz, _list): + self.assertEquals(clazz.GetNumGroups(), len(_list)) + for i in range(len(_list)): + group = clazz.GetGroup(i) + self.assertEquals(group.GetValue(), _list[i]) + + def test_generate_singletons(self): + """Test generate_singletons""" + + eq = self.assertEquals + gs = generate_singletons + ramp = GreyRamp() + + _list = [1, 2, 3, 4] + cl = gs(_list, len(_list), ramp) + self.doClassSingleTest(cl, _list) + + _list = range(0, 100) + cl = gs(_list, len(_list), ramp) + self.doClassSingleTest(cl, _list) + + _list = range(-100, 100) + cl = gs(_list, len(_list), ramp) + self.doClassSingleTest(cl, _list) + + _list = ['a', 'b', 'c', 'd'] + cl = gs(_list, len(_list), ramp) + self.doClassSingleTest(cl, _list) + + _list = [] + cl = gs(_list, len(_list), ramp) + self.doClassSingleTest(cl, _list) + + _list = [1] + cl = gs(_list, len(_list), ramp) + self.doClassSingleTest(cl, _list) + + + def test_generate_uniform_distribution(self): + """Test generate_uniform_distribution""" + + eq = self.assertEquals + gud = generate_uniform_distribution + ramp = GreyRamp() + + cl = gud(0, 99, 10, ramp, True) + self.doClassRangeTest(cl, ("[0;10[", "[10;20[", "[20;30[", "[30;40[", + "[40;50[", "[50;60[", "[60;70[", "[70;80[", + "[80;90[", "[90;99]")) + + cl = gud(0, 99, 10, ramp, False) + self.doClassRangeTest(cl, ("[0;9.9[", "[9.9;19.8[", "[19.8;29.7[", + "[29.7;39.6[", "[39.6;49.5[", "[49.5;59.4[", + "[59.4;69.3[", "[69.3;79.2[", "[79.2;89.1[", + "[89.1;99.0]")) + + cl = gud(1, 2, 2, ramp, False) + self.doClassRangeTest(cl, ("[1;1.5[", "[1.5;2]")) + + cl = gud(1, 2, 2, ramp, True) + self.doClassRangeTest(cl, ("[1;2[", "[2;2]")) + + + def test_generate_quantiles(self): + """Test generate_quantiles""" eq = self.assertEquals # - # Test CalculateQuantiles + # Test calculate_quantiles # - cq = CalculateQuantiles + gq = generate_quantiles + + ramp = GreyRamp() + + adj, cl = gq([1, 2, 3, 4], [.25, .5, .75, 1.0], ramp, Range("[1;4]")) + self.failIf(adj) + self.doClassRangeTest(cl, ("[1;1]", "]1;2]", "]2;3]", "]3;4]")) + + adj, cl = gq(range(0, 100), [.25, .5, .75, 1.0], ramp, Range("[0;100[")) + self.failIf(adj) + self.doClassRangeTest(cl, ("[0;24]", "]24;49]", "]49;74]", "]74;100[")) + + adj, cl = gq(range(0, 100), [.33, .66, 1.0], ramp, Range("[0;100]")) + self.failIf(adj) + self.doClassRangeTest(cl, ("[0;32]", "]32;65]", "]65;100]")) + + # negative input + adj,cl = gq(range(-100,100), [.33, .66, 1.0], ramp, Range("[-100;100]")) + self.failIf(adj) + self.doClassRangeTest(cl, ("[-100;-35]", "]-35;31]", "]31;100]")) + + # unequal percentiles + adj,cl = gq(range(0, 100), [.25, .66, .8, 1.0], ramp, Range("[0;100]")) + self.failIf(adj) + self.doClassRangeTest(cl, ("[0;24]", "]24;65]", "]65;79]", "]79;100]")) + + # input all the same + adj,cl = gq([1, 1, 1, 1], [.25, .5, .75, 1.0], ramp, Range("[1;4]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ("[1;4]",)) + + # empty input + adj,cl = gq([], [.25, .5, .75, 1.0], ramp, Range("[1;4]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ()) + + # empty range + adj,cl = gq([1, 2, 3, 4], [.25, .5, .75, 1.0], ramp, Range("]0;1[")) + self.failUnless(adj) + self.doClassRangeTest(cl, ()) + + # empty percentiles + self.assertRaises(ValueError, gq, + [1, 2, 3, 4], [], ramp, Range("]0;1[")) + + # single percentile + self.assertRaises(ValueError, gq, + [1, 2, 3, 4], [.5], ramp, Range("[0;4]")) + + # more percentiles than input + adj,cl = gq([1], [.5, 1.0], ramp, Range("[0;4]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ("[0;4]",)) + + adj,cl = gq([1], [.1, .2, .3, .4, .5, .6, .7, .8, .9, 1.0], ramp, Range("[0;4]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ("[0;4]",)) + + # range smaller than the input + adj,cl = gq([1, 2, 3, 4], [.5, 1.0], ramp, Range("[2;3]")) + self.failIf(adj) + self.doClassRangeTest(cl, ("[2;2]","]2;3]")) + + # range outside the input + adj,cl = gq([5, 6, 7, 8], [.5, 1.0], ramp, Range("[2;3]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ()) + + adj,cl = gq([1, 1, 1, 1, 1, 1], [.25, .5, .75, 1.0], ramp, Range("[1;4]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ("[1;4]",)) + + adj,cl = gq([1, 1, 1, 1, 1, 2, 3], [.25, .5, .75, 1.0], ramp, Range("[1;4]")) + self.failUnless(adj) + self.doClassRangeTest(cl, ("[1;1]", "]1;2]", "]2;4]")) + + # adjusted quantiles + adj,cl = gq([1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5], + [.12, .24, .36, .50, .62, .76, .88, 1.0], ramp, Range("[1;5]")) + + self.failUnless(adj) + self.doClassRangeTest(cl, ("[1;1]", "]1;2]", "]2;3]", "]3;4]", "]4;5]")) + + def test_calculate_quantiles(self): + """Test calculate_quantiles""" + + eq = self.assertEquals + + # + # Test calculate_quantiles + # + + cq = calculate_quantiles result = cq([1, 2, 3, 4], [.25, .5, .75, 1.0], Range("[1;4]")) eq(result, (0, 0, 3, [(0, .25), (1, .5), (2, .75), (3, 1.0)])) @@ -62,12 +236,13 @@ eq(result, None) # empty percentiles - result = cq([1, 2, 3, 4], [], Range("]0;1[")) - eq(result, None) + self.assertRaises(ValueError, cq, [1, 2, 3, 4], [], Range("]0;1[")) # single percentile - result = cq([1, 2, 3, 4], [.5], Range("[0;4]")) - eq(result, (0, 0, 3, [(1, .5)])) + self.assertRaises(ValueError, cq, [1, 2, 3, 4], [.5], Range("[0;4]")) + + # percentile doesn't cover range + self.assertRaises(ValueError, cq, [1, 2, 3, 4], [.5,.8], Range("[0;4]")) # more percentiles than input result = cq([1], [.5, 1.0], Range("[0;4]"))