root/tags/0.4.1/tests/bar.py

Revision 112, 13.1 kB (checked in by lgs, 4 years ago)

Remove whitespace

Line 
1# Copyright (c) 2007-2008 by Lorenzo Gil Sanchez <lorenzo.gil.sanchez@gmail.com>
2#
3# This file is part of PyCha.
4#
5# PyCha is free software: you can redistribute it and/or modify
6# it under the terms of the GNU Lesser General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# PyCha is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU Lesser General Public License for more details.
14#
15# You should have received a copy of the GNU Lesser General Public License
16# along with PyCha.  If not, see <http://www.gnu.org/licenses/>.
17
18import unittest
19
20import cairo
21
22import pycha.bar
23
24class RectTests(unittest.TestCase):
25
26    def test_rect(self):
27        r = pycha.bar.Rect(2, 3, 20, 40, 2.5, 3.4, 'test')
28        self.assertEqual(r.x, 2)
29        self.assertEqual(r.y, 3)
30        self.assertEqual(r.w, 20)
31        self.assertEqual(r.h, 40)
32        self.assertEqual(r.xval, 2.5)
33        self.assertEqual(r.yval, 3.4)
34        self.assertEqual(r.name, 'test')
35
36class BarTests(unittest.TestCase):
37
38    def test_init(self):
39        ch = pycha.bar.BarChart(None)
40        self.assertEqual(ch.bars, [])
41        self.assertEqual(ch.minxdelta, 0)
42
43    def test_updateChart(self):
44        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500)
45        # An evil dataset with just one point. See bug #9
46        dataset = (
47            ('dataset1', ([0, 0],)),
48        )
49        ch = pycha.bar.BarChart(surface)
50        ch.addDataset(dataset)
51        ch._updateXY()
52        ch._updateChart()
53
54        self.assertEqual(ch.xscale, 1.0)
55        self.assertEqual(ch.minxval, 0)
56        self.assertAlmostEqual(ch.barWidthForSet, 0.75, 4)
57        self.assertAlmostEqual(ch.barMargin, 0.125, 4)
58
59class VerticalBarTests(unittest.TestCase):
60
61    def test_updateChart(self):
62        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500)
63        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])),
66            )
67        ch = pycha.bar.VerticalBarChart(surface)
68        ch.addDataset(dataset)
69        ch._updateXY()
70        ch._updateChart()
71        self.assertEqual(ch.minxval, 0)
72        self.assertEqual(ch.maxxval, 4)
73        self.assertEqual(ch.xrange, 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)
79        self.assertEqual(ch.minxdelta, 1)
80        self.assertAlmostEqual(ch.barWidthForSet, 0.075, 4)
81        self.assertAlmostEqual(ch.barMargin, 0.025, 4)
82
83        R = pycha.bar.Rect
84        bars = (
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'),
96            )
97
98        for i, bar in enumerate(bars):
99            b1, b2 = ch.bars[i], bar
100            self.assertAlmostEqual(b1.x, b2.x, 4)
101            self.assertAlmostEqual(b1.y, b2.y, 4)
102            self.assertAlmostEqual(b1.w, b2.w, 4)
103            self.assertAlmostEqual(b1.h, b2.h, 4)
104            self.assertEqual(b1.xval, b2.xval)
105            self.assertEqual(b1.yval, b2.yval)
106            self.assertEqual(b1.name, b2.name)
107
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])),
112            )
113        ch = pycha.bar.VerticalBarChart(surface)
114        ch.addDataset(dataset)
115        ch._updateXY()
116        ch._updateChart()
117        self.assertEqual(ch.minxval, 0)
118        self.assertEqual(ch.maxxval, 3)
119        self.assertEqual(ch.xrange, 3)
120        self.assertAlmostEqual(ch.xscale, 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)
126        self.assertEqual(ch.minxdelta, 1)
127        self.assertAlmostEqual(ch.barWidthForSet, 0.1875, 4)
128        self.assertAlmostEqual(ch.barMargin, 0.03125, 4)
129
130        R = pycha.bar.Rect
131        bars = (
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'),
136            )
137
138        for i, bar in enumerate(bars):
139            b1, b2 = ch.bars[i], bar
140            self.assertAlmostEqual(b1.x, b2.x, 4)
141            self.assertAlmostEqual(b1.y, b2.y, 4)
142            self.assertAlmostEqual(b1.w, b2.w, 4)
143            self.assertAlmostEqual(b1.h, b2.h, 4)
144            self.assertEqual(b1.xval, b2.xval)
145            self.assertEqual(b1.yval, b2.yval)
146            self.assertEqual(b1.name, b2.name)
147
148    def test_updateTicks(self):
149        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500)
150        dataset = (
151            ('dataset1', ([0, 1], [1, 1], [2, 3])),
152            ('dataset2', ([0, 2], [1, 0], [3, 4])),
153            )
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            )
210        ch = pycha.bar.HorizontalBarChart(surface)
211        ch.addDataset(dataset)
212        ch._updateXY()
213        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()
292        ch._updateTicks()
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)]
328        for i in range(len(yticks)):
329            self.assertAlmostEqual(ch.yticks[i][0], yticks[i][0], 4)
330            self.assertAlmostEqual(ch.yticks[i][1], yticks[i][1], 4)
331
332    def test_shadowRectangle(self):
333        ch = pycha.bar.HorizontalBarChart(None)
334        shadow = ch._getShadowRectangle(10, 20, 400, 300)
335        self.assertEqual(shadow, (10, 18, 402, 304))
336
337def test_suite():
338    return unittest.TestSuite((
339        unittest.makeSuite(RectTests),
340        unittest.makeSuite(BarTests),
341        unittest.makeSuite(VerticalBarTests),
342        unittest.makeSuite(HorizontalBarTests),
343    ))
344
345if __name__ == '__main__':
346    unittest.main(defaultTest='test_suite')
Note: See TracBrowser for help on using the browser.