Changeset 109 for trunk/tests/bar.py

Show
Ignore:
Timestamp:
10/27/08 16:49:58 (4 years ago)
Author:
lgs
Message:

Some refactoring and support for negative values in line and bar charts. Inspired by Nicolas patch

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/tests/bar.py

    r85 r109  
    6262        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
    6363        dataset = ( 
    64             ('dataset1', ([0, 3], [1, 4], [2, 2], [3,5], [4,3.5])), 
    65             ('dataset2', ([0, 2], [1, 3], [2, 1], [3,5], [4,2.5])), 
     64            ('dataset1', ([0, 3], [1, 4], [2, 2], [3, 5], [4, 3.5])), 
     65            ('dataset2', ([0, 2], [1, 3], [2, 1], [3, 5], [4, 2.5])), 
    6666            ) 
    6767        ch = pycha.bar.VerticalBarChart(surface) 
     
    6969        ch._updateXY() 
    7070        ch._updateChart() 
     71        self.assertEqual(ch.minxval, 0) 
     72        self.assertEqual(ch.maxxval, 4) 
    7173        self.assertEqual(ch.xrange, 4) 
    72         self.assertAlmostEqual(ch.xscale, 0.2, 4) 
    73         self.assertAlmostEqual(ch.yscale, 0.2, 4) 
     74        self.assertAlmostEqual(ch.xscale, 0.20, 4) 
     75        self.assertEqual(ch.minyval, 0) 
     76        self.assertEqual(ch.maxyval, 5) 
     77        self.assertEqual(ch.yrange, 5) 
     78        self.assertAlmostEqual(ch.yscale, 0.20, 4) 
    7479        self.assertEqual(ch.minxdelta, 1) 
    7580        self.assertAlmostEqual(ch.barWidthForSet, 0.075, 4) 
    7681        self.assertAlmostEqual(ch.barMargin, 0.025, 4) 
    7782 
     83        R = pycha.bar.Rect 
    7884        bars = ( 
    79             pycha.bar.Rect(0.025, 0.4, 0.075, 0.6, 0, 3, 'dataset1'), 
    80             pycha.bar.Rect(0.225, 0.2, 0.075, 0.8, 1, 4, 'dataset1'), 
    81             pycha.bar.Rect(0.425, 0.6, 0.075, 0.4, 2, 2, 'dataset1'), 
    82             pycha.bar.Rect(0.625, 0.0, 0.075, 1.0, 3, 5, 'dataset1'), 
    83             pycha.bar.Rect(0.825, 0.3, 0.075, 0.7, 4, 3.5, 'dataset1'), 
    84  
    85             pycha.bar.Rect(0.100, 0.6, 0.075, 0.4, 0, 2, 'dataset2'), 
    86             pycha.bar.Rect(0.300, 0.4, 0.075, 0.6, 1, 3, 'dataset2'), 
    87             pycha.bar.Rect(0.500, 0.8, 0.075, 0.2, 2, 1, 'dataset2'), 
    88             pycha.bar.Rect(0.700, 0.0, 0.075, 1.0, 3, 5, 'dataset2'), 
    89             pycha.bar.Rect(0.900, 0.5, 0.075, 0.5, 4, 2.5, 'dataset2'), 
     85            R(0.025, 0.400, 0.075, 0.600, 0, 3, 'dataset1'), 
     86            R(0.225, 0.200, 0.075, 0.800, 1, 4, 'dataset1'), 
     87            R(0.425, 0.600, 0.075, 0.400, 2, 2, 'dataset1'), 
     88            R(0.625, 0.000, 0.075, 1.000, 3, 5, 'dataset1'), 
     89            R(0.825, 0.300, 0.075, 0.700, 4, 3.5, 'dataset1'), 
     90 
     91            R(0.100, 0.600, 0.075, 0.400, 0, 2, 'dataset2'), 
     92            R(0.300, 0.400, 0.075, 0.600, 1, 3, 'dataset2'), 
     93            R(0.500, 0.800, 0.075, 0.200, 2, 1, 'dataset2'), 
     94            R(0.700, 0.000, 0.075, 1.000, 3, 5, 'dataset2'), 
     95            R(0.900, 0.500, 0.075, 0.500, 4, 2.5, 'dataset2'), 
    9096            ) 
    9197 
     
    100106            self.assertEqual(b1.name, b2.name) 
    101107 
    102     def test_updateTicks(self): 
    103         surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
    104         dataset = ( 
    105             ('dataset1', ([0, 1], [1, 1], [2, 3])), 
    106             ('dataset2', ([0, 2], [1, 0], [3, 4])), 
     108    def test_updateChartWithNegatives(self): 
     109        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
     110        dataset = ( 
     111            ('dataset1', ([0, -3], [1, -1], [2, 3], [3, 5])), 
    107112            ) 
    108113        ch = pycha.bar.VerticalBarChart(surface) 
     
    110115        ch._updateXY() 
    111116        ch._updateChart() 
    112         ch._updateTicks() 
    113         xticks = [(0.125, 1), (0.375, 2), (0.625, 3)] 
    114         for i in range(len(xticks)): 
    115             self.assertAlmostEqual(ch.xticks[i][0], xticks[i][0], 4) 
    116             self.assertAlmostEqual(ch.xticks[i][1], xticks[i][1], 4) 
    117  
    118     def test_shadowRectangle(self): 
    119         ch = pycha.bar.VerticalBarChart(None) 
    120         shadow = ch._getShadowRectangle(10, 20, 400, 300) 
    121         self.assertEqual(shadow, (8, 18, 404, 302)) 
    122  
    123 class HorizontalBarTests(unittest.TestCase): 
    124  
    125     def test_updateChart(self): 
    126         surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
    127         dataset = ( 
    128             ('dataset1', ([0, 1], [1, 1], [2, 3])), 
    129             ('dataset2', ([0, 2], [1, 0], [3, 4])), 
    130             ) 
    131         ch = pycha.bar.HorizontalBarChart(surface) 
    132         ch.addDataset(dataset) 
    133         ch._updateXY() 
    134         ch._updateChart() 
     117        self.assertEqual(ch.minxval, 0) 
     118        self.assertEqual(ch.maxxval, 3) 
    135119        self.assertEqual(ch.xrange, 3) 
    136120        self.assertAlmostEqual(ch.xscale, 0.25, 4) 
    137         self.assertAlmostEqual(ch.yscale, 0.25, 4) 
     121        self.assertEqual(ch.minyval, -3) 
     122        self.assertEqual(ch.maxyval, 5) 
     123        self.assertEqual(ch.yrange, 8) 
     124        self.assertAlmostEqual(ch.yscale, 0.125, 4) 
     125        self.assertAlmostEqual(ch.area.origin, 0.375) 
    138126        self.assertEqual(ch.minxdelta, 1) 
    139         self.assertAlmostEqual(ch.barWidthForSet, 0.09375, 4) 
     127        self.assertAlmostEqual(ch.barWidthForSet, 0.1875, 4) 
    140128        self.assertAlmostEqual(ch.barMargin, 0.03125, 4) 
    141129 
     130        R = pycha.bar.Rect 
    142131        bars = ( 
    143             pycha.bar.Rect(0, 0.03125, 0.25, 0.09375, 0, 1, 'dataset1'), 
    144             pycha.bar.Rect(0, 0.28125, 0.25, 0.09375, 1, 1, 'dataset1'), 
    145             pycha.bar.Rect(0, 0.53125, 0.75, 0.09375, 2, 3, 'dataset1'), 
    146  
    147             pycha.bar.Rect(0, 0.125, 0.5, 0.09375, 0, 2, 'dataset2'), 
    148             pycha.bar.Rect(0, 0.375, 0.0, 0.09375, 1, 0, 'dataset2'), 
    149             pycha.bar.Rect(0, 0.875, 1.0, 0.09375, 3, 4, 'dataset2'), 
     132            R(0.03125, 0.625, 0.1875, 0.375, 0, -3, 'dataset1'), 
     133            R(0.28125, 0.625, 0.1875, 0.125, 1, -1, 'dataset1'), 
     134            R(0.53125, 0.250, 0.1875, 0.375, 2,  3, 'dataset1'), 
     135            R(0.78125, 0.000, 0.1875, 0.625, 3,  5, 'dataset1'), 
    150136            ) 
    151137 
     
    166152            ('dataset2', ([0, 2], [1, 0], [3, 4])), 
    167153            ) 
     154        ch = pycha.bar.VerticalBarChart(surface) 
     155        ch.addDataset(dataset) 
     156        ch._updateXY() 
     157        ch._updateChart() 
     158        ch._updateTicks() 
     159        xticks = [(0.125, 0), (0.375, 1), (0.625, 2)] 
     160        for i in range(len(xticks)): 
     161            self.assertAlmostEqual(ch.xticks[i][0], xticks[i][0], 4) 
     162            self.assertAlmostEqual(ch.xticks[i][1], xticks[i][1], 4) 
     163 
     164        yticks = [ 
     165            (1.0, 0.0), (0.9, 0.4), (0.8, 0.8), (0.7, 1.2), (0.6, 1.6), 
     166            (0.5, 2.0), (0.4, 2.4), (0.3, 2.8), (0.2, 3.2), (0.1, 3.6), 
     167            (0.0, 4.0) 
     168            ] 
     169        for i in range(len(yticks)): 
     170            self.assertAlmostEqual(ch.yticks[i][0], yticks[i][0], 4) 
     171            self.assertAlmostEqual(ch.yticks[i][1], yticks[i][1], 4) 
     172             
     173    def test_udpateTicksWithNegatives(self): 
     174        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
     175        dataset = ( 
     176            ('dataset1', ([0, -2], [1, 1], [2, 3])), 
     177            ) 
     178        ch = pycha.bar.VerticalBarChart(surface) 
     179        ch.addDataset(dataset) 
     180        ch._updateXY() 
     181        ch._updateChart() 
     182        ch._updateTicks() 
     183        xticks = [(0.1667, 0), (0.5000, 1), (0.8333, 2)] 
     184        for i in range(len(xticks)): 
     185            self.assertAlmostEqual(ch.xticks[i][0], xticks[i][0], 4) 
     186            self.assertAlmostEqual(ch.xticks[i][1], xticks[i][1], 4) 
     187 
     188        yticks = [ 
     189            (1.0, -2.0), (0.9, -1.5), (0.8, -1.0), (0.7, -0.5), (0.6, 0.0), 
     190            (0.5, 0.5), (0.4, 1.0), (0.3, 1.5), (0.2, 2.0), (0.1, 2.5), 
     191            (0.0, 3.0) 
     192            ] 
     193        for i in range(len(yticks)): 
     194            self.assertAlmostEqual(ch.yticks[i][0], yticks[i][0], 4) 
     195            self.assertAlmostEqual(ch.yticks[i][1], yticks[i][1], 4) 
     196 
     197    def test_shadowRectangle(self): 
     198        ch = pycha.bar.VerticalBarChart(None) 
     199        shadow = ch._getShadowRectangle(10, 20, 400, 300) 
     200        self.assertEqual(shadow, (8, 18, 404, 302)) 
     201 
     202class HorizontalBarTests(unittest.TestCase): 
     203 
     204    def test_updateChart(self): 
     205        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
     206        dataset = ( 
     207            ('dataset1', ([0, 1], [1, 1], [2, 3])), 
     208            ('dataset2', ([0, 2], [1, 0], [3, 4])), 
     209            ) 
    168210        ch = pycha.bar.HorizontalBarChart(surface) 
    169211        ch.addDataset(dataset) 
    170212        ch._updateXY() 
    171213        ch._updateChart() 
     214        self.assertEqual(ch.xrange, 3) 
     215        self.assertAlmostEqual(ch.xscale, 0.25, 4) 
     216        self.assertAlmostEqual(ch.yscale, 0.25, 4) 
     217        self.assertEqual(ch.minxdelta, 1) 
     218        self.assertAlmostEqual(ch.barWidthForSet, 0.09375, 4) 
     219        self.assertAlmostEqual(ch.barMargin, 0.03125, 4) 
     220 
     221        bars = ( 
     222            pycha.bar.Rect(0, 0.03125, 0.25, 0.09375, 0, 1, 'dataset1'), 
     223            pycha.bar.Rect(0, 0.28125, 0.25, 0.09375, 1, 1, 'dataset1'), 
     224            pycha.bar.Rect(0, 0.53125, 0.75, 0.09375, 2, 3, 'dataset1'), 
     225 
     226            pycha.bar.Rect(0, 0.125, 0.5, 0.09375, 0, 2, 'dataset2'), 
     227            pycha.bar.Rect(0, 0.375, 0.0, 0.09375, 1, 0, 'dataset2'), 
     228            pycha.bar.Rect(0, 0.875, 1.0, 0.09375, 3, 4, 'dataset2'), 
     229            ) 
     230 
     231        for i, bar in enumerate(bars): 
     232            b1, b2 = ch.bars[i], bar 
     233            self.assertAlmostEqual(b1.x, b2.x, 4) 
     234            self.assertAlmostEqual(b1.y, b2.y, 4) 
     235            self.assertAlmostEqual(b1.w, b2.w, 4) 
     236            self.assertAlmostEqual(b1.h, b2.h, 4) 
     237            self.assertEqual(b1.xval, b2.xval) 
     238            self.assertEqual(b1.yval, b2.yval) 
     239            self.assertEqual(b1.name, b2.name) 
     240 
     241    def test_updateChartWithNegatives(self): 
     242        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
     243        dataset = ( 
     244            ('dataset1', ([0, -3], [1, -1], [2, 3], [3, 5])), 
     245            ) 
     246  
     247        ch = pycha.bar.HorizontalBarChart(surface) 
     248        ch.addDataset(dataset) 
     249        ch._updateXY() 
     250        ch._updateChart() 
     251        self.assertEqual(ch.minxval, 0) 
     252        self.assertEqual(ch.maxxval, 3) 
     253        self.assertEqual(ch.xrange, 3) 
     254        self.assertAlmostEqual(ch.xscale, 0.25, 4) 
     255        self.assertEqual(ch.minyval, -3) 
     256        self.assertEqual(ch.maxyval, 5) 
     257        self.assertEqual(ch.yrange, 8) 
     258        self.assertAlmostEqual(ch.yscale, 0.125, 4) 
     259        self.assertAlmostEqual(ch.area.origin, 0.375) 
     260        self.assertEqual(ch.minxdelta, 1) 
     261        self.assertAlmostEqual(ch.barWidthForSet, 0.1875, 4) 
     262        self.assertAlmostEqual(ch.barMargin, 0.03125, 4) 
     263 
     264        R = pycha.bar.Rect 
     265        bars = ( 
     266            R(0.000, 0.03125, 0.375, 0.1875, 0, -3, 'dataset1'), 
     267            R(0.250, 0.28125, 0.125, 0.1875, 1, -1, 'dataset1'), 
     268            R(0.375, 0.53125, 0.375, 0.1875, 2, 3, 'dataset1'), 
     269            R(0.375, 0.78125, 0.625, 0.1875, 3, 5, 'dataset1'), 
     270            ) 
     271 
     272        for i, bar in enumerate(bars): 
     273            b1, b2 = ch.bars[i], bar 
     274            self.assertAlmostEqual(b1.x, b2.x, 4) 
     275            self.assertAlmostEqual(b1.y, b2.y, 4) 
     276            self.assertAlmostEqual(b1.w, b2.w, 4) 
     277            self.assertAlmostEqual(b1.h, b2.h, 4) 
     278            self.assertEqual(b1.xval, b2.xval) 
     279            self.assertEqual(b1.yval, b2.yval) 
     280            self.assertEqual(b1.name, b2.name) 
     281 
     282    def test_updateTicks(self): 
     283        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
     284        dataset = ( 
     285            ('dataset1', ([0, 1], [1, 1], [2, 3])), 
     286            ('dataset2', ([0, 2], [1, 0], [3, 4])), 
     287            ) 
     288        ch = pycha.bar.HorizontalBarChart(surface) 
     289        ch.addDataset(dataset) 
     290        ch._updateXY() 
     291        ch._updateChart() 
    172292        ch._updateTicks() 
    173         yticks = [(0.125, 1), (0.375, 2), (0.625, 3)] 
     293 
     294        xticks = [ 
     295            (0.0, 0.0), (0.1, 0.4), (0.2, 0.8), (0.3, 1.2), (0.4, 1.6), 
     296            (0.5, 2.0), (0.6, 2.4), (0.7, 2.8), (0.8, 3.2), (0.9, 3.6), 
     297            (1.0, 4.0) 
     298            ] 
     299        for i in range(len(xticks)): 
     300            self.assertAlmostEqual(ch.xticks[i][0], xticks[i][0], 4) 
     301            self.assertAlmostEqual(ch.xticks[i][1], xticks[i][1], 4) 
     302 
     303        yticks = [(0.125, 0), (0.375, 1), (0.625, 2)] 
     304        for i in range(len(yticks)): 
     305            self.assertAlmostEqual(ch.yticks[i][0], yticks[i][0], 4) 
     306            self.assertAlmostEqual(ch.yticks[i][1], yticks[i][1], 4) 
     307 
     308    def test_udpateTicksWithNegatives(self): 
     309        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500) 
     310        dataset = ( 
     311            ('dataset1', ([0, -2], [1, 1], [2, 3])), 
     312            ) 
     313        ch = pycha.bar.HorizontalBarChart(surface) 
     314        ch.addDataset(dataset) 
     315        ch._updateXY() 
     316        ch._updateChart() 
     317        ch._updateTicks() 
     318        xticks = [ 
     319            (0.0, -2.0), (0.1, -1.5), (0.2, -1.0), (0.3, -0.5), (0.4, 0.0), 
     320            (0.5, 0.5), (0.6, 1.0), (0.7, 1.5), (0.8, 2.0), (0.9, 2.5), 
     321            (1.0, 3.0) 
     322            ] 
     323        for i in range(len(xticks)): 
     324            self.assertAlmostEqual(ch.xticks[i][0], xticks[i][0], 4) 
     325            self.assertAlmostEqual(ch.xticks[i][1], xticks[i][1], 4) 
     326 
     327        yticks = [(0.1667, 0), (0.5000, 1), (0.8333, 2)] 
    174328        for i in range(len(yticks)): 
    175329            self.assertAlmostEqual(ch.yticks[i][0], yticks[i][0], 4)