2
# -*- coding: utf-8 -*-
10
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
11
sys.path.insert(0, ROOT)
13
import pygooglechart as gc
16
class TestBase(unittest.TestCase):
20
# All tests require warnings to be raised
21
self.raise_warnings(True)
23
self.temp_image = 'temp.png'
26
if os.path.exists(self.temp_image):
27
os.unlink(self.temp_image)
29
def raise_warnings(self, rw):
33
warnings.simplefilter('error')
35
# Don't print out warnings if we're expecting them--so we can have
36
# nicer looking tests! :)
37
warnings.simplefilter('ignore')
39
def assertChartURL(self, url, query):
40
self.assertTrue(url.endswith(query))
43
class TestDataTypes(TestBase):
45
def test_simple_data(self):
46
s = gc.SimpleData([range(0, 62), [0, 1, 60, 61]])
47
self.assertEquals(repr(s),
48
'chd=s:ABCDEFGHIJKLMNOPQRSTUVWXYZ'
49
'abcdefghijklmnopqrstuvwxyz0123456789,AB89')
51
def test_text_data(self):
52
s = gc.TextData([[0, 1, 99.9]])
53
self.assertEquals(repr(s), 'chd=t:0.0,1.0,99.9')
55
def test_ext_data(self):
56
s = gc.ExtendedData([[0, 1, 4095]])
57
self.assertEquals(repr(s), 'chd=e:AAAB..')
60
class TestScaling(TestBase):
62
def test_simple_scale(self):
63
sv = gc.SimpleData.scale_value
65
self.raise_warnings(False) # We know some of these give warnings
66
self.assertEquals(sv(-10, [0, 1]), 0)
67
self.assertEquals(sv(0, [0, 1]), 0)
68
self.assertEquals(sv(.5, [0, 1]), 31)
69
self.assertEquals(sv(30, [0, 1]), 61)
70
self.assertEquals(sv(2222, [0, 10000]), 14)
73
self.raise_warnings(True)
74
self.assertRaises(UserWarning, sv, -10, [0, 1])
75
self.assertRaises(UserWarning, sv, 30, [0, 1])
77
def test_text_scale(self):
78
sv = gc.TextData.scale_value
80
self.raise_warnings(False)
81
self.assertEquals(sv(-10, [0, 1]), 0)
82
self.assertEquals(sv(0, [0, 1]), 0)
83
self.assertEquals(sv(.5, [0, 1]), 50)
84
self.assertEquals(sv(30, [0, 1]), 100)
85
self.assertEquals(sv(2222, [0, 10000]), 22.22)
87
self.raise_warnings(True)
88
self.assertRaises(UserWarning, sv, -10, [0, 1])
89
self.assertRaises(UserWarning, sv, 30, [0, 1])
91
def test_ext_scale(self):
92
sv = gc.ExtendedData.scale_value
94
self.raise_warnings(False)
95
self.assertEquals(sv(-10, [0, 1]), 0)
96
self.assertEquals(sv(0, [0, 1]), 0)
97
self.assertEquals(sv(.5, [0, 1]), 2048)
98
self.assertEquals(sv(30, [0, 1]), 4095)
99
self.assertEquals(sv(2222, [0, 10000]), 910)
101
self.raise_warnings(True)
102
self.assertRaises(UserWarning, sv, -10, [0, 1])
103
self.assertRaises(UserWarning, sv, 30, [0, 1])
106
class TestLineChart(TestBase):
108
def test_none_data(self):
109
chart = gc.SimpleLineChart(300, 100)
110
chart.add_data([1, 2, 3, None, 5])
111
self.assertChartURL(chart.get_url(), \
112
'?cht=lc&chs=300x100&chd=e:AAMzZm__zM')
115
class TestQRChart(TestBase):
117
def assertQRImage(self, chart, text):
121
print 'PyQrCodec not installed. Can not test QR code image'
124
chart.download(self.temp_image)
125
status, string = PyQrcodec.decode(self.temp_image)
126
self.assertTrue(status)
127
self.assertEquals(text, string)
129
def test_simple(self):
131
chart = gc.QRChart(100, 150)
133
self.assertChartURL(chart.get_url(), \
134
'?cht=qr&chs=100x150&chl=Hello%20World')
136
def test_encoding(self):
137
chart = gc.QRChart(100, 100)
138
chart.add_data('Hello World')
139
self.assertChartURL(chart.get_url(), \
140
'?cht=qr&chs=100x100&chl=Hello%20World')
142
def test_no_data(self):
143
chart = gc.QRChart(100, 100)
144
self.assertRaises(gc.NoDataGivenException, chart.get_url)
146
def test_validate_image(self):
148
chart = gc.QRChart(100, 100)
150
chart.set_ec('H', 0) # PyQrcodec seems to only work on higher EC
151
self.assertQRImage(chart, text)
153
def test_validate_utf8(self):
154
text = 'こんにちは世界' # Hello world in Japanese UTF-8
155
chart = gc.QRChart(100, 100)
158
self.assertQRImage(chart, text)
160
class TestGrammar(TestBase):
162
types = ('Venn', 'GroupedHorizontalBar', 'GoogleOMeter', 'Scatter',
163
'StackedVerticalBar', 'Map', 'StackedHorizontalBar', 'SimpleLine',
164
'SparkLine', 'GroupedVerticalBar', 'SplineRadar', 'XYLine', 'Radar',
167
def test_chart_types(self):
168
ret = gc.ChartGrammar.get_possible_chart_types()
169
diff = set(ret).symmetric_difference(set(TestGrammar.types))
170
self.assert_(not diff)
172
def test_google_chart(self):
174
'type': 'GoogleOMeter',
178
'x_range': [ 0, 10 ],
183
grammar = gc.ChartGrammar()
184
chart = grammar.parse(g)
185
# print chart.get_url()
186
# chart.download('meh.png')
189
if __name__ == "__main__":