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
14
from pygooglechart import NoDataGivenException
17
class TestBase(unittest.TestCase):
21
# All tests require warnings to be raised
22
self.raise_warnings(True)
24
self.temp_image = 'temp.png'
27
if os.path.exists(self.temp_image):
28
os.unlink(self.temp_image)
30
def raise_warnings(self, rw):
34
warnings.simplefilter('error')
36
# Don't print out warnings if we're expecting them--so we can have
37
# nicer looking tests! :)
38
warnings.simplefilter('ignore')
40
def assertChartURL(self, url, query):
41
self.assertTrue(url.endswith(query))
44
class TestDataTypes(TestBase):
46
def test_simple_data(self):
47
s = gc.SimpleData([range(0, 62), [0, 1, 60, 61]])
48
self.assertEquals(repr(s),
49
'chd=s:ABCDEFGHIJKLMNOPQRSTUVWXYZ'
50
'abcdefghijklmnopqrstuvwxyz0123456789,AB89')
52
def test_text_data(self):
53
s = gc.TextData([[0, 1, 99.9]])
54
self.assertEquals(repr(s), 'chd=t:0.0,1.0,99.9')
56
def test_ext_data(self):
57
s = gc.ExtendedData([[0, 1, 4095]])
58
self.assertEquals(repr(s), 'chd=e:AAAB..')
61
class TestScaling(TestBase):
63
def test_simple_scale(self):
64
sv = gc.SimpleData.scale_value
66
self.raise_warnings(False) # We know some of these give warnings
67
self.assertEquals(sv(-10, [0, 1]), 0)
68
self.assertEquals(sv(0, [0, 1]), 0)
69
self.assertEquals(sv(.5, [0, 1]), 31)
70
self.assertEquals(sv(30, [0, 1]), 61)
71
self.assertEquals(sv(2222, [0, 10000]), 14)
74
self.raise_warnings(True)
75
self.assertRaises(UserWarning, sv, -10, [0, 1])
76
self.assertRaises(UserWarning, sv, 30, [0, 1])
78
def test_text_scale(self):
79
sv = gc.TextData.scale_value
81
self.raise_warnings(False)
82
self.assertEquals(sv(-10, [0, 1]), 0)
83
self.assertEquals(sv(0, [0, 1]), 0)
84
self.assertEquals(sv(.5, [0, 1]), 50)
85
self.assertEquals(sv(30, [0, 1]), 100)
86
self.assertEquals(sv(2222, [0, 10000]), 22.22)
88
self.raise_warnings(True)
89
self.assertRaises(UserWarning, sv, -10, [0, 1])
90
self.assertRaises(UserWarning, sv, 30, [0, 1])
92
def test_ext_scale(self):
93
sv = gc.ExtendedData.scale_value
95
self.raise_warnings(False)
96
self.assertEquals(sv(-10, [0, 1]), 0)
97
self.assertEquals(sv(0, [0, 1]), 0)
98
self.assertEquals(sv(.5, [0, 1]), 2048)
99
self.assertEquals(sv(30, [0, 1]), 4095)
100
self.assertEquals(sv(2222, [0, 10000]), 910)
102
self.raise_warnings(True)
103
self.assertRaises(UserWarning, sv, -10, [0, 1])
104
self.assertRaises(UserWarning, sv, 30, [0, 1])
107
class TestLineChart(TestBase):
109
def test_none_data(self):
110
chart = gc.SimpleLineChart(300, 100)
111
chart.add_data([1, 2, 3, None, 5])
112
self.assertChartURL(chart.get_url(), \
113
'?cht=lc&chs=300x100&chd=e:AAMzZm__zM')
116
class TestQRChart(TestBase):
118
def assertQRImage(self, chart, text):
122
print 'PyQrCodec not installed. Can not test QR code image'
125
chart.download(self.temp_image)
126
status, string = PyQrcodec.decode(self.temp_image)
127
self.assertTrue(status)
128
self.assertEquals(text, string)
130
def test_simple(self):
132
chart = gc.QRChart(100, 150)
134
self.assertChartURL(chart.get_url(), \
135
'?cht=qr&chs=100x150&chl=Hello%20World')
137
def test_encoding(self):
138
chart = gc.QRChart(100, 100)
139
chart.add_data('Hello World')
140
self.assertChartURL(chart.get_url(), \
141
'?cht=qr&chs=100x100&chl=Hello%20World')
143
def test_no_data(self):
144
chart = gc.QRChart(100, 100)
145
self.assertRaises(NoDataGivenException, chart.get_url)
147
def test_validate_image(self):
149
chart = gc.QRChart(100, 100)
151
chart.set_ec('H', 0) # PyQrcodec seems to only work on higher EC
152
self.assertQRImage(chart, text)
154
def test_validate_utf8(self):
155
text = 'こんにちは世界' # Hello world in Japanese UTF-8
156
chart = gc.QRChart(100, 100)
159
self.assertQRImage(chart, text)
161
def test_validate_shift_jis(self):
162
# XXX: It looks like PyQrcodec doesn't do shift_jis?
163
text = unicode('こんにちは世界', 'utf-8').encode('shift_jis')
164
chart = gc.QRChart(100, 100)
167
chart.set_encoding('Shift_JIS')
168
self.assertChartURL(chart.get_url(), \
169
'?cht=qr&chs=100x100&chl=%82%B1%82%F1%82%C9' \
170
'%82%BF%82%CD%90%A2%8AE&choe=Shift_JIS&chld=H|0')
171
chart.download(self.temp_image)
174
class TestGrammar(TestBase):
176
types = ('Venn', 'GroupedHorizontalBar', 'GoogleOMeter', 'Scatter',
177
'StackedVerticalBar', 'Map', 'StackedHorizontalBar', 'SimpleLine',
178
'SparkLine', 'GroupedVerticalBar', 'SplineRadar', 'XYLine', 'Radar',
181
def test_chart_types(self):
182
ret = gc.ChartGrammar.get_possible_chart_types()
183
diff = set(ret).symmetric_difference(set(TestGrammar.types))
184
self.assert_(not diff)
186
def test_google_chart(self):
188
'type': 'GoogleOMeter',
192
'x_range': [ 0, 10 ],
197
grammar = gc.ChartGrammar()
198
chart = grammar.parse(g)
199
# print chart.get_url()
200
# chart.download('meh.png')
203
if __name__ == "__main__":