1 | #!/usr/bin/env python
|
---|
2 |
|
---|
3 | import unittest
|
---|
4 | import sys
|
---|
5 | import os
|
---|
6 | import _testcapi
|
---|
7 | from test import test_support
|
---|
8 | from subprocess import Popen, PIPE
|
---|
9 |
|
---|
10 | # Skip this test if the _tkinter module wasn't built.
|
---|
11 | _tkinter = test_support.import_module('_tkinter')
|
---|
12 |
|
---|
13 | from Tkinter import Tcl
|
---|
14 | from _tkinter import TclError
|
---|
15 |
|
---|
16 | tcl_version = _tkinter.TCL_VERSION.split('.')
|
---|
17 | try:
|
---|
18 | for i in range(len(tcl_version)):
|
---|
19 | tcl_version[i] = int(tcl_version[i])
|
---|
20 | except ValueError:
|
---|
21 | pass
|
---|
22 | tcl_version = tuple(tcl_version)
|
---|
23 |
|
---|
24 |
|
---|
25 | class TkinterTest(unittest.TestCase):
|
---|
26 |
|
---|
27 | def testFlattenLen(self):
|
---|
28 | # flatten(<object with no length>)
|
---|
29 | self.assertRaises(TypeError, _tkinter._flatten, True)
|
---|
30 |
|
---|
31 |
|
---|
32 | class TclTest(unittest.TestCase):
|
---|
33 |
|
---|
34 | def setUp(self):
|
---|
35 | self.interp = Tcl()
|
---|
36 |
|
---|
37 | def testEval(self):
|
---|
38 | tcl = self.interp
|
---|
39 | tcl.eval('set a 1')
|
---|
40 | self.assertEqual(tcl.eval('set a'),'1')
|
---|
41 |
|
---|
42 | def testEvalException(self):
|
---|
43 | tcl = self.interp
|
---|
44 | self.assertRaises(TclError,tcl.eval,'set a')
|
---|
45 |
|
---|
46 | def testEvalException2(self):
|
---|
47 | tcl = self.interp
|
---|
48 | self.assertRaises(TclError,tcl.eval,'this is wrong')
|
---|
49 |
|
---|
50 | def testCall(self):
|
---|
51 | tcl = self.interp
|
---|
52 | tcl.call('set','a','1')
|
---|
53 | self.assertEqual(tcl.call('set','a'),'1')
|
---|
54 |
|
---|
55 | def testCallException(self):
|
---|
56 | tcl = self.interp
|
---|
57 | self.assertRaises(TclError,tcl.call,'set','a')
|
---|
58 |
|
---|
59 | def testCallException2(self):
|
---|
60 | tcl = self.interp
|
---|
61 | self.assertRaises(TclError,tcl.call,'this','is','wrong')
|
---|
62 |
|
---|
63 | def testSetVar(self):
|
---|
64 | tcl = self.interp
|
---|
65 | tcl.setvar('a','1')
|
---|
66 | self.assertEqual(tcl.eval('set a'),'1')
|
---|
67 |
|
---|
68 | def testSetVarArray(self):
|
---|
69 | tcl = self.interp
|
---|
70 | tcl.setvar('a(1)','1')
|
---|
71 | self.assertEqual(tcl.eval('set a(1)'),'1')
|
---|
72 |
|
---|
73 | def testGetVar(self):
|
---|
74 | tcl = self.interp
|
---|
75 | tcl.eval('set a 1')
|
---|
76 | self.assertEqual(tcl.getvar('a'),'1')
|
---|
77 |
|
---|
78 | def testGetVarArray(self):
|
---|
79 | tcl = self.interp
|
---|
80 | tcl.eval('set a(1) 1')
|
---|
81 | self.assertEqual(tcl.getvar('a(1)'),'1')
|
---|
82 |
|
---|
83 | def testGetVarException(self):
|
---|
84 | tcl = self.interp
|
---|
85 | self.assertRaises(TclError,tcl.getvar,'a')
|
---|
86 |
|
---|
87 | def testGetVarArrayException(self):
|
---|
88 | tcl = self.interp
|
---|
89 | self.assertRaises(TclError,tcl.getvar,'a(1)')
|
---|
90 |
|
---|
91 | def testUnsetVar(self):
|
---|
92 | tcl = self.interp
|
---|
93 | tcl.setvar('a',1)
|
---|
94 | self.assertEqual(tcl.eval('info exists a'),'1')
|
---|
95 | tcl.unsetvar('a')
|
---|
96 | self.assertEqual(tcl.eval('info exists a'),'0')
|
---|
97 |
|
---|
98 | def testUnsetVarArray(self):
|
---|
99 | tcl = self.interp
|
---|
100 | tcl.setvar('a(1)',1)
|
---|
101 | tcl.setvar('a(2)',2)
|
---|
102 | self.assertEqual(tcl.eval('info exists a(1)'),'1')
|
---|
103 | self.assertEqual(tcl.eval('info exists a(2)'),'1')
|
---|
104 | tcl.unsetvar('a(1)')
|
---|
105 | self.assertEqual(tcl.eval('info exists a(1)'),'0')
|
---|
106 | self.assertEqual(tcl.eval('info exists a(2)'),'1')
|
---|
107 |
|
---|
108 | def testUnsetVarException(self):
|
---|
109 | tcl = self.interp
|
---|
110 | self.assertRaises(TclError,tcl.unsetvar,'a')
|
---|
111 |
|
---|
112 | def testEvalFile(self):
|
---|
113 | tcl = self.interp
|
---|
114 | filename = "testEvalFile.tcl"
|
---|
115 | fd = open(filename,'w')
|
---|
116 | script = """set a 1
|
---|
117 | set b 2
|
---|
118 | set c [ expr $a + $b ]
|
---|
119 | """
|
---|
120 | fd.write(script)
|
---|
121 | fd.close()
|
---|
122 | tcl.evalfile(filename)
|
---|
123 | os.remove(filename)
|
---|
124 | self.assertEqual(tcl.eval('set a'),'1')
|
---|
125 | self.assertEqual(tcl.eval('set b'),'2')
|
---|
126 | self.assertEqual(tcl.eval('set c'),'3')
|
---|
127 |
|
---|
128 | def testEvalFileException(self):
|
---|
129 | tcl = self.interp
|
---|
130 | filename = "doesnotexists"
|
---|
131 | try:
|
---|
132 | os.remove(filename)
|
---|
133 | except Exception,e:
|
---|
134 | pass
|
---|
135 | self.assertRaises(TclError,tcl.evalfile,filename)
|
---|
136 |
|
---|
137 | def testPackageRequireException(self):
|
---|
138 | tcl = self.interp
|
---|
139 | self.assertRaises(TclError,tcl.eval,'package require DNE')
|
---|
140 |
|
---|
141 | def testLoadWithUNC(self):
|
---|
142 | import sys
|
---|
143 | if sys.platform != 'win32':
|
---|
144 | return
|
---|
145 |
|
---|
146 | # Build a UNC path from the regular path.
|
---|
147 | # Something like
|
---|
148 | # \\%COMPUTERNAME%\c$\python27\python.exe
|
---|
149 |
|
---|
150 | fullname = os.path.abspath(sys.executable)
|
---|
151 | if fullname[1] != ':':
|
---|
152 | return
|
---|
153 | unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
|
---|
154 | fullname[0],
|
---|
155 | fullname[3:])
|
---|
156 |
|
---|
157 | with test_support.EnvironmentVarGuard() as env:
|
---|
158 | env.unset("TCL_LIBRARY")
|
---|
159 | cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
|
---|
160 |
|
---|
161 | p = Popen(cmd, stdout=PIPE, stderr=PIPE)
|
---|
162 | out_data, err_data = p.communicate()
|
---|
163 |
|
---|
164 | msg = '\n\n'.join(['"Tkinter.py" not in output',
|
---|
165 | 'Command:', cmd,
|
---|
166 | 'stdout:', out_data,
|
---|
167 | 'stderr:', err_data])
|
---|
168 |
|
---|
169 | self.assertIn('Tkinter.py', out_data, msg)
|
---|
170 |
|
---|
171 | self.assertEqual(p.wait(), 0, 'Non-zero exit code')
|
---|
172 |
|
---|
173 |
|
---|
174 | def test_passing_values(self):
|
---|
175 | def passValue(value):
|
---|
176 | return self.interp.call('set', '_', value)
|
---|
177 | self.assertEqual(passValue(True), True)
|
---|
178 | self.assertEqual(passValue(False), False)
|
---|
179 | self.assertEqual(passValue('string'), 'string')
|
---|
180 | self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
|
---|
181 | self.assertEqual(passValue(u'string'), u'string')
|
---|
182 | self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
|
---|
183 | for i in (0, 1, -1, int(2**31-1), int(-2**31)):
|
---|
184 | self.assertEqual(passValue(i), i)
|
---|
185 | for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
|
---|
186 | sys.float_info.min, sys.float_info.max,
|
---|
187 | -sys.float_info.min, -sys.float_info.max):
|
---|
188 | self.assertEqual(passValue(f), f)
|
---|
189 | for f in float('nan'), float('inf'), -float('inf'):
|
---|
190 | if f != f: # NaN
|
---|
191 | self.assertNotEqual(passValue(f), f)
|
---|
192 | else:
|
---|
193 | self.assertEqual(passValue(f), f)
|
---|
194 | self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
|
---|
195 |
|
---|
196 | def test_splitlist(self):
|
---|
197 | splitlist = self.interp.tk.splitlist
|
---|
198 | call = self.interp.tk.call
|
---|
199 | self.assertRaises(TypeError, splitlist)
|
---|
200 | self.assertRaises(TypeError, splitlist, 'a', 'b')
|
---|
201 | self.assertRaises(TypeError, splitlist, 2)
|
---|
202 | testcases = [
|
---|
203 | ('2', ('2',)),
|
---|
204 | ('', ()),
|
---|
205 | ('{}', ('',)),
|
---|
206 | ('""', ('',)),
|
---|
207 | ('a\n b\t\r c\n ', ('a', 'b', 'c')),
|
---|
208 | (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
|
---|
209 | ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
|
---|
210 | (u'a \u20ac', ('a', '\xe2\x82\xac')),
|
---|
211 | ('a {b c}', ('a', 'b c')),
|
---|
212 | (r'a b\ c', ('a', 'b c')),
|
---|
213 | (('a', 'b c'), ('a', 'b c')),
|
---|
214 | ('a 2', ('a', '2')),
|
---|
215 | (('a', 2), ('a', 2)),
|
---|
216 | ('a 3.4', ('a', '3.4')),
|
---|
217 | (('a', 3.4), ('a', 3.4)),
|
---|
218 | ((), ()),
|
---|
219 | (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
|
---|
220 | ]
|
---|
221 | if tcl_version >= (8, 5):
|
---|
222 | testcases += [
|
---|
223 | (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
|
---|
224 | (1, u'\u20ac', u'\u20ac', (3.4,))),
|
---|
225 | ]
|
---|
226 | for arg, res in testcases:
|
---|
227 | self.assertEqual(splitlist(arg), res)
|
---|
228 | self.assertRaises(TclError, splitlist, '{')
|
---|
229 |
|
---|
230 | def test_split(self):
|
---|
231 | split = self.interp.tk.split
|
---|
232 | call = self.interp.tk.call
|
---|
233 | self.assertRaises(TypeError, split)
|
---|
234 | self.assertRaises(TypeError, split, 'a', 'b')
|
---|
235 | self.assertRaises(TypeError, split, 2)
|
---|
236 | testcases = [
|
---|
237 | ('2', '2'),
|
---|
238 | ('', ''),
|
---|
239 | ('{}', ''),
|
---|
240 | ('""', ''),
|
---|
241 | ('{', '{'),
|
---|
242 | ('a\n b\t\r c\n ', ('a', 'b', 'c')),
|
---|
243 | (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
|
---|
244 | ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
|
---|
245 | (u'a \u20ac', ('a', '\xe2\x82\xac')),
|
---|
246 | ('a {b c}', ('a', ('b', 'c'))),
|
---|
247 | (r'a b\ c', ('a', ('b', 'c'))),
|
---|
248 | (('a', 'b c'), ('a', ('b', 'c'))),
|
---|
249 | (('a', u'b c'), ('a', ('b', 'c'))),
|
---|
250 | ('a 2', ('a', '2')),
|
---|
251 | (('a', 2), ('a', 2)),
|
---|
252 | ('a 3.4', ('a', '3.4')),
|
---|
253 | (('a', 3.4), ('a', 3.4)),
|
---|
254 | (('a', (2, 3.4)), ('a', (2, 3.4))),
|
---|
255 | ((), ()),
|
---|
256 | (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
|
---|
257 | ]
|
---|
258 | if tcl_version >= (8, 5):
|
---|
259 | testcases += [
|
---|
260 | (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
|
---|
261 | (12, u'\u20ac', u'\u20ac', (3.4,))),
|
---|
262 | ]
|
---|
263 | for arg, res in testcases:
|
---|
264 | self.assertEqual(split(arg), res)
|
---|
265 |
|
---|
266 |
|
---|
267 | class BigmemTclTest(unittest.TestCase):
|
---|
268 |
|
---|
269 | def setUp(self):
|
---|
270 | self.interp = Tcl()
|
---|
271 |
|
---|
272 | @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
|
---|
273 | "needs UINT_MAX < SIZE_MAX")
|
---|
274 | @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
|
---|
275 | dry_run=False)
|
---|
276 | def test_huge_string(self, size):
|
---|
277 | value = ' ' * size
|
---|
278 | self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
|
---|
279 |
|
---|
280 |
|
---|
281 | def test_main():
|
---|
282 | test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
|
---|
283 |
|
---|
284 | if __name__ == "__main__":
|
---|
285 | test_main()
|
---|