blob: ba61c455fd0b55eb22acaef373d1d457439e2b9b [file] [log] [blame]
David Aschere2b4b322004-02-18 05:59:53 +00001import unittest
Serhiy Storchaka4a880412013-02-07 15:37:53 +02002import sys
David Aschere2b4b322004-02-18 05:59:53 +00003import os
Serhiy Storchaka42035702013-08-21 21:46:12 +03004import _testcapi
Neal Norwitz63dfece2004-02-19 02:37:29 +00005from test import test_support
Ezio Melotti794e5572013-05-07 09:34:49 +03006from subprocess import Popen, PIPE
R. David Murray597ebab2009-03-31 18:32:17 +00007
8# Skip this test if the _tkinter module wasn't built.
9_tkinter = test_support.import_module('_tkinter')
10
Guilherme Polo8e5e4382009-02-07 02:20:29 +000011from Tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000012from _tkinter import TclError
13
Serhiy Storchaka94025332013-09-08 20:32:56 +030014tcl_version = _tkinter.TCL_VERSION.split('.')
15try:
16 for i in range(len(tcl_version)):
17 tcl_version[i] = int(tcl_version[i])
18except ValueError:
19 pass
20tcl_version = tuple(tcl_version)
21
Benjamin Petersonb3619be2009-01-30 02:24:39 +000022
23class TkinterTest(unittest.TestCase):
24
25 def testFlattenLen(self):
26 # flatten(<object with no length>)
27 self.assertRaises(TypeError, _tkinter._flatten, True)
28
29
David Aschere2b4b322004-02-18 05:59:53 +000030class TclTest(unittest.TestCase):
31
32 def setUp(self):
33 self.interp = Tcl()
Serhiy Storchaka5542b152013-12-25 17:28:50 +020034 self.wantobjects = self.interp.tk.wantobjects()
David Aschere2b4b322004-02-18 05:59:53 +000035
36 def testEval(self):
37 tcl = self.interp
38 tcl.eval('set a 1')
39 self.assertEqual(tcl.eval('set a'),'1')
40
41 def testEvalException(self):
42 tcl = self.interp
43 self.assertRaises(TclError,tcl.eval,'set a')
44
45 def testEvalException2(self):
46 tcl = self.interp
47 self.assertRaises(TclError,tcl.eval,'this is wrong')
48
49 def testCall(self):
50 tcl = self.interp
51 tcl.call('set','a','1')
52 self.assertEqual(tcl.call('set','a'),'1')
53
54 def testCallException(self):
55 tcl = self.interp
56 self.assertRaises(TclError,tcl.call,'set','a')
57
58 def testCallException2(self):
59 tcl = self.interp
60 self.assertRaises(TclError,tcl.call,'this','is','wrong')
61
62 def testSetVar(self):
63 tcl = self.interp
64 tcl.setvar('a','1')
65 self.assertEqual(tcl.eval('set a'),'1')
66
67 def testSetVarArray(self):
68 tcl = self.interp
69 tcl.setvar('a(1)','1')
70 self.assertEqual(tcl.eval('set a(1)'),'1')
71
72 def testGetVar(self):
73 tcl = self.interp
74 tcl.eval('set a 1')
75 self.assertEqual(tcl.getvar('a'),'1')
76
77 def testGetVarArray(self):
78 tcl = self.interp
79 tcl.eval('set a(1) 1')
80 self.assertEqual(tcl.getvar('a(1)'),'1')
81
82 def testGetVarException(self):
83 tcl = self.interp
84 self.assertRaises(TclError,tcl.getvar,'a')
85
86 def testGetVarArrayException(self):
87 tcl = self.interp
88 self.assertRaises(TclError,tcl.getvar,'a(1)')
89
90 def testUnsetVar(self):
91 tcl = self.interp
92 tcl.setvar('a',1)
93 self.assertEqual(tcl.eval('info exists a'),'1')
94 tcl.unsetvar('a')
95 self.assertEqual(tcl.eval('info exists a'),'0')
96
97 def testUnsetVarArray(self):
98 tcl = self.interp
99 tcl.setvar('a(1)',1)
100 tcl.setvar('a(2)',2)
101 self.assertEqual(tcl.eval('info exists a(1)'),'1')
102 self.assertEqual(tcl.eval('info exists a(2)'),'1')
103 tcl.unsetvar('a(1)')
104 self.assertEqual(tcl.eval('info exists a(1)'),'0')
105 self.assertEqual(tcl.eval('info exists a(2)'),'1')
106
107 def testUnsetVarException(self):
108 tcl = self.interp
109 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000110
David Aschere2b4b322004-02-18 05:59:53 +0000111 def testEvalFile(self):
112 tcl = self.interp
113 filename = "testEvalFile.tcl"
114 fd = open(filename,'w')
115 script = """set a 1
116 set b 2
117 set c [ expr $a + $b ]
118 """
119 fd.write(script)
120 fd.close()
121 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000122 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000123 self.assertEqual(tcl.eval('set a'),'1')
124 self.assertEqual(tcl.eval('set b'),'2')
125 self.assertEqual(tcl.eval('set c'),'3')
126
127 def testEvalFileException(self):
128 tcl = self.interp
129 filename = "doesnotexists"
130 try:
131 os.remove(filename)
132 except Exception,e:
133 pass
134 self.assertRaises(TclError,tcl.evalfile,filename)
135
David Aschere2b4b322004-02-18 05:59:53 +0000136 def testPackageRequireException(self):
137 tcl = self.interp
138 self.assertRaises(TclError,tcl.eval,'package require DNE')
139
Zachary Ware57d35c62013-11-03 22:51:25 -0600140 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000141 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000142 # Build a UNC path from the regular path.
143 # Something like
144 # \\%COMPUTERNAME%\c$\python27\python.exe
145
146 fullname = os.path.abspath(sys.executable)
147 if fullname[1] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600148 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000149 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
150 fullname[0],
151 fullname[3:])
152
153 with test_support.EnvironmentVarGuard() as env:
154 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300155 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000156
Zachary Ware57d35c62013-11-03 22:51:25 -0600157 try:
158 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
159 except WindowsError as e:
160 if e.winerror == 5:
161 self.skipTest('Not permitted to start the child process')
162 else:
163 raise
164
Ezio Melotti794e5572013-05-07 09:34:49 +0300165 out_data, err_data = p.communicate()
166
167 msg = '\n\n'.join(['"Tkinter.py" not in output',
168 'Command:', cmd,
169 'stdout:', out_data,
170 'stderr:', err_data])
171
172 self.assertIn('Tkinter.py', out_data, msg)
173
174 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
175
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000176
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200177 def test_passing_values(self):
178 def passValue(value):
179 return self.interp.call('set', '_', value)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200180
181 self.assertEqual(passValue(True), True if self.wantobjects else '1')
182 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200183 self.assertEqual(passValue(u'string'), u'string')
184 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
185 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200186 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200187 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200188 sys.float_info.min, sys.float_info.max,
189 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200190 if self.wantobjects:
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200191 self.assertEqual(passValue(f), f)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200192 else:
193 self.assertEqual(float(passValue(f)), f)
194 if self.wantobjects:
195 f = passValue(float('nan'))
196 self.assertNotEqual(f, f)
197 self.assertEqual(passValue(float('inf')), float('inf'))
198 self.assertEqual(passValue(-float('inf')), -float('inf'))
199 else:
200 f = float(passValue(float('nan')))
201 self.assertNotEqual(f, f)
202 self.assertEqual(float(passValue(float('inf'))), float('inf'))
203 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
204 self.assertEqual(passValue((1, '2', (3.4,))),
205 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000206
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200207 def test_user_command(self):
208 result = []
209 def testfunc(arg):
210 result.append(arg)
211 return arg
212 self.interp.createcommand('testfunc', testfunc)
213 def check(value, expected):
214 del result[:]
215 self.assertEqual(self.interp.call('testfunc', value), expected)
216 self.assertEqual(result, [expected])
217
218 check(True, '1')
219 check(False, '0')
220 check('string', 'string')
221 check('string\xbd', 'string\xbd')
222 check('string\u20ac', 'string\u20ac')
223 for i in (0, 1, -1, 2**31-1, -2**31):
224 check(i, str(i))
225 for f in (0.0, 1.0, -1.0, 1/3,
226 sys.float_info.min, sys.float_info.max,
227 -sys.float_info.min, -sys.float_info.max):
228 check(f, repr(f))
229 check(float('nan'), 'NaN')
230 check(float('inf'), 'Inf')
231 check(-float('inf'), '-Inf')
232 check((), '')
233 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
234
Serhiy Storchakafab65422013-07-11 20:32:48 +0300235 def test_splitlist(self):
236 splitlist = self.interp.tk.splitlist
237 call = self.interp.tk.call
238 self.assertRaises(TypeError, splitlist)
239 self.assertRaises(TypeError, splitlist, 'a', 'b')
240 self.assertRaises(TypeError, splitlist, 2)
241 testcases = [
242 ('2', ('2',)),
243 ('', ()),
244 ('{}', ('',)),
245 ('""', ('',)),
246 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
247 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
248 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
249 (u'a \u20ac', ('a', '\xe2\x82\xac')),
250 ('a {b c}', ('a', 'b c')),
251 (r'a b\ c', ('a', 'b c')),
252 (('a', 'b c'), ('a', 'b c')),
253 ('a 2', ('a', '2')),
254 (('a', 2), ('a', 2)),
255 ('a 3.4', ('a', '3.4')),
256 (('a', 3.4), ('a', 3.4)),
257 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200258 (call('list', 1, '2', (3.4,)),
259 (1, '2', (3.4,)) if self.wantobjects else
260 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300261 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300262 if tcl_version >= (8, 5):
263 testcases += [
264 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200265 (1, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
266 ('1', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300267 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300268 for arg, res in testcases:
269 self.assertEqual(splitlist(arg), res)
270 self.assertRaises(TclError, splitlist, '{')
271
272 def test_split(self):
273 split = self.interp.tk.split
274 call = self.interp.tk.call
275 self.assertRaises(TypeError, split)
276 self.assertRaises(TypeError, split, 'a', 'b')
277 self.assertRaises(TypeError, split, 2)
278 testcases = [
279 ('2', '2'),
280 ('', ''),
281 ('{}', ''),
282 ('""', ''),
283 ('{', '{'),
284 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
285 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
286 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
287 (u'a \u20ac', ('a', '\xe2\x82\xac')),
288 ('a {b c}', ('a', ('b', 'c'))),
289 (r'a b\ c', ('a', ('b', 'c'))),
290 (('a', 'b c'), ('a', ('b', 'c'))),
291 (('a', u'b c'), ('a', ('b', 'c'))),
292 ('a 2', ('a', '2')),
293 (('a', 2), ('a', 2)),
294 ('a 3.4', ('a', '3.4')),
295 (('a', 3.4), ('a', 3.4)),
296 (('a', (2, 3.4)), ('a', (2, 3.4))),
297 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200298 (call('list', 1, '2', (3.4,)),
299 (1, '2', (3.4,)) if self.wantobjects else
300 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300301 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300302 if tcl_version >= (8, 5):
303 testcases += [
304 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200305 (12, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
306 ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300307 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300308 for arg, res in testcases:
309 self.assertEqual(split(arg), res)
310
Neal Norwitz63dfece2004-02-19 02:37:29 +0000311
Serhiy Storchaka42035702013-08-21 21:46:12 +0300312class BigmemTclTest(unittest.TestCase):
313
314 def setUp(self):
315 self.interp = Tcl()
316
317 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
318 "needs UINT_MAX < SIZE_MAX")
319 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
320 dry_run=False)
321 def test_huge_string(self, size):
322 value = ' ' * size
323 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
324
325
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200326def setUpModule():
327 if test_support.verbose:
328 tcl = Tcl()
329 print 'patchlevel =', tcl.call('info', 'patchlevel')
330
331
Neal Norwitz63dfece2004-02-19 02:37:29 +0000332def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300333 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000334
David Aschere2b4b322004-02-18 05:59:53 +0000335if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000336 test_main()