blob: e5b17a1da6285c3b5989b0afe015ccc443e401ad [file] [log] [blame]
David Aschere2b4b322004-02-18 05:59:53 +00001import unittest
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +00002import sys
David Aschere2b4b322004-02-18 05:59:53 +00003import os
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
R. David Murraya21e4ca2009-03-31 23:16:50 +00005
6# Skip this test if the _tkinter module wasn't built.
7_tkinter = support.import_module('_tkinter')
8
Terry Jan Reedy743c85a2013-03-16 02:37:06 -04009# Make sure tkinter._fix runs to set up the environment
10support.import_fresh_module('tkinter')
11
Guilherme Polofa8fba92009-02-07 02:33:47 +000012from tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000013from _tkinter import TclError
14
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +020015try:
16 from _testcapi import INT_MAX, PY_SSIZE_T_MAX
17except ImportError:
18 INT_MAX = PY_SSIZE_T_MAX = sys.maxsize
19
Serhiy Storchakadfa689b2013-09-08 20:29:37 +030020tcl_version = _tkinter.TCL_VERSION.split('.')
21try:
22 for i in range(len(tcl_version)):
23 tcl_version[i] = int(tcl_version[i])
24except ValueError:
25 pass
26tcl_version = tuple(tcl_version)
27
Serhiy Storchaka92af06b2014-02-02 23:04:24 +020028_tk_patchlevel = None
29def get_tk_patchlevel():
30 global _tk_patchlevel
31 if _tk_patchlevel is None:
32 tcl = Tcl()
33 patchlevel = []
34 for x in tcl.call('info', 'patchlevel').split('.'):
35 try:
36 x = int(x, 10)
37 except ValueError:
38 x = -1
39 patchlevel.append(x)
40 _tk_patchlevel = tuple(patchlevel)
41 return _tk_patchlevel
42
Benjamin Petersonc4bbc8d2009-01-30 03:39:35 +000043
44class TkinterTest(unittest.TestCase):
45
46 def testFlattenLen(self):
47 # flatten(<object with no length>)
48 self.assertRaises(TypeError, _tkinter._flatten, True)
49
50
David Aschere2b4b322004-02-18 05:59:53 +000051class TclTest(unittest.TestCase):
52
53 def setUp(self):
54 self.interp = Tcl()
Serhiy Storchakacc4290b2013-12-25 17:29:01 +020055 self.wantobjects = self.interp.tk.wantobjects()
David Aschere2b4b322004-02-18 05:59:53 +000056
57 def testEval(self):
58 tcl = self.interp
59 tcl.eval('set a 1')
60 self.assertEqual(tcl.eval('set a'),'1')
61
Serhiy Storchaka1317e142014-02-03 21:24:07 +020062 def test_eval_null_in_result(self):
63 tcl = self.interp
64 self.assertEqual(tcl.eval('set a "a\\0b"'), 'a\x00b')
65
David Aschere2b4b322004-02-18 05:59:53 +000066 def testEvalException(self):
67 tcl = self.interp
68 self.assertRaises(TclError,tcl.eval,'set a')
69
70 def testEvalException2(self):
71 tcl = self.interp
72 self.assertRaises(TclError,tcl.eval,'this is wrong')
73
74 def testCall(self):
75 tcl = self.interp
76 tcl.call('set','a','1')
77 self.assertEqual(tcl.call('set','a'),'1')
78
79 def testCallException(self):
80 tcl = self.interp
81 self.assertRaises(TclError,tcl.call,'set','a')
82
83 def testCallException2(self):
84 tcl = self.interp
85 self.assertRaises(TclError,tcl.call,'this','is','wrong')
86
87 def testSetVar(self):
88 tcl = self.interp
89 tcl.setvar('a','1')
90 self.assertEqual(tcl.eval('set a'),'1')
91
92 def testSetVarArray(self):
93 tcl = self.interp
94 tcl.setvar('a(1)','1')
95 self.assertEqual(tcl.eval('set a(1)'),'1')
96
97 def testGetVar(self):
98 tcl = self.interp
99 tcl.eval('set a 1')
100 self.assertEqual(tcl.getvar('a'),'1')
101
102 def testGetVarArray(self):
103 tcl = self.interp
104 tcl.eval('set a(1) 1')
105 self.assertEqual(tcl.getvar('a(1)'),'1')
106
107 def testGetVarException(self):
108 tcl = self.interp
109 self.assertRaises(TclError,tcl.getvar,'a')
110
111 def testGetVarArrayException(self):
112 tcl = self.interp
113 self.assertRaises(TclError,tcl.getvar,'a(1)')
114
115 def testUnsetVar(self):
116 tcl = self.interp
117 tcl.setvar('a',1)
118 self.assertEqual(tcl.eval('info exists a'),'1')
119 tcl.unsetvar('a')
120 self.assertEqual(tcl.eval('info exists a'),'0')
121
122 def testUnsetVarArray(self):
123 tcl = self.interp
124 tcl.setvar('a(1)',1)
125 tcl.setvar('a(2)',2)
126 self.assertEqual(tcl.eval('info exists a(1)'),'1')
127 self.assertEqual(tcl.eval('info exists a(2)'),'1')
128 tcl.unsetvar('a(1)')
129 self.assertEqual(tcl.eval('info exists a(1)'),'0')
130 self.assertEqual(tcl.eval('info exists a(2)'),'1')
131
132 def testUnsetVarException(self):
133 tcl = self.interp
134 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000135
Serhiy Storchaka9f1f4f42014-05-30 14:07:38 +0300136 def test_getint(self):
137 tcl = self.interp.tk
138 self.assertEqual(tcl.getint(' 42 '), 42)
139 self.assertEqual(tcl.getint(42), 42)
140 self.assertRaises(TypeError, tcl.getint)
141 self.assertRaises(TypeError, tcl.getint, '42', '10')
142 self.assertRaises(TypeError, tcl.getint, b'42')
143 self.assertRaises(TypeError, tcl.getint, 42.0)
144 self.assertRaises(TclError, tcl.getint, 'a')
145 self.assertRaises((TypeError, ValueError, TclError),
146 tcl.getint, '42\0')
147 self.assertRaises((UnicodeEncodeError, ValueError, TclError),
148 tcl.getint, '42\ud800')
149
150 def test_getdouble(self):
151 tcl = self.interp.tk
152 self.assertEqual(tcl.getdouble(' 42 '), 42.0)
153 self.assertEqual(tcl.getdouble(' 42.5 '), 42.5)
154 self.assertEqual(tcl.getdouble(42.5), 42.5)
155 self.assertRaises(TypeError, tcl.getdouble)
156 self.assertRaises(TypeError, tcl.getdouble, '42.5', '10')
157 self.assertRaises(TypeError, tcl.getdouble, b'42.5')
158 self.assertRaises(TypeError, tcl.getdouble, 42)
159 self.assertRaises(TclError, tcl.getdouble, 'a')
160 self.assertRaises((TypeError, ValueError, TclError),
161 tcl.getdouble, '42.5\0')
162 self.assertRaises((UnicodeEncodeError, ValueError, TclError),
163 tcl.getdouble, '42.5\ud800')
164
165 def test_getboolean(self):
166 tcl = self.interp.tk
167 self.assertIs(tcl.getboolean('on'), True)
168 self.assertIs(tcl.getboolean('1'), True)
169 self.assertEqual(tcl.getboolean(42), 42)
170 self.assertRaises(TypeError, tcl.getboolean)
171 self.assertRaises(TypeError, tcl.getboolean, 'on', '1')
172 self.assertRaises(TypeError, tcl.getboolean, b'on')
173 self.assertRaises(TypeError, tcl.getboolean, 1.0)
174 self.assertRaises(TclError, tcl.getboolean, 'a')
175 self.assertRaises((TypeError, ValueError, TclError),
176 tcl.getboolean, 'on\0')
177 self.assertRaises((UnicodeEncodeError, ValueError, TclError),
178 tcl.getboolean, 'on\ud800')
179
David Aschere2b4b322004-02-18 05:59:53 +0000180 def testEvalFile(self):
181 tcl = self.interp
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200182 with open(support.TESTFN, 'w') as f:
183 self.addCleanup(support.unlink, support.TESTFN)
184 f.write("""set a 1
185 set b 2
186 set c [ expr $a + $b ]
187 """)
188 tcl.evalfile(support.TESTFN)
David Aschere2b4b322004-02-18 05:59:53 +0000189 self.assertEqual(tcl.eval('set a'),'1')
190 self.assertEqual(tcl.eval('set b'),'2')
191 self.assertEqual(tcl.eval('set c'),'3')
192
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200193 def test_evalfile_null_in_result(self):
194 tcl = self.interp
195 with open(support.TESTFN, 'w') as f:
196 self.addCleanup(support.unlink, support.TESTFN)
197 f.write("""
198 set a "a\0b"
199 set b "a\\0b"
200 """)
201 tcl.evalfile(support.TESTFN)
202 self.assertEqual(tcl.eval('set a'), 'a\x00b')
203 self.assertEqual(tcl.eval('set b'), 'a\x00b')
204
David Aschere2b4b322004-02-18 05:59:53 +0000205 def testEvalFileException(self):
206 tcl = self.interp
207 filename = "doesnotexists"
208 try:
209 os.remove(filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000210 except Exception as e:
David Aschere2b4b322004-02-18 05:59:53 +0000211 pass
212 self.assertRaises(TclError,tcl.evalfile,filename)
213
David Aschere2b4b322004-02-18 05:59:53 +0000214 def testPackageRequireException(self):
215 tcl = self.interp
216 self.assertRaises(TclError,tcl.eval,'package require DNE')
217
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000218 @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000219 def testLoadWithUNC(self):
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000220 # Build a UNC path from the regular path.
221 # Something like
222 # \\%COMPUTERNAME%\c$\python27\python.exe
223
224 fullname = os.path.abspath(sys.executable)
225 if fullname[1] != ':':
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000226 raise unittest.SkipTest('Absolute path should have drive part')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000227 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
228 fullname[0],
229 fullname[3:])
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000230 if not os.path.exists(unc_name):
231 raise unittest.SkipTest('Cannot connect to UNC Path')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000232
Georg Brandlec5ae3b2010-07-31 19:17:11 +0000233 with support.EnvironmentVarGuard() as env:
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000234 env.unset("TCL_LIBRARY")
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000235 f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000236
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000237 self.assertIn('tkinter', f.read())
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000238 # exit code must be zero
239 self.assertEqual(f.close(), None)
240
Serhiy Storchakafc055252014-02-03 20:41:34 +0200241 def test_exprstring(self):
242 tcl = self.interp
243 tcl.call('set', 'a', 3)
244 tcl.call('set', 'b', 6)
245 def check(expr, expected):
246 result = tcl.exprstring(expr)
247 self.assertEqual(result, expected)
248 self.assertIsInstance(result, str)
249
250 self.assertRaises(TypeError, tcl.exprstring)
251 self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6')
252 self.assertRaises(TypeError, tcl.exprstring, b'8.2 + 6')
253 self.assertRaises(TclError, tcl.exprstring, 'spam')
254 check('', '0')
255 check('8.2 + 6', '14.2')
Serhiy Storchakafc055252014-02-03 20:41:34 +0200256 check('3.1 + $a', '6.1')
257 check('2 + "$a.$b"', '5.6')
258 check('4*[llength "6 2"]', '8')
259 check('{word one} < "word $a"', '0')
260 check('4*2 < 7', '0')
261 check('hypot($a, 4)', '5.0')
262 check('5 / 4', '1')
263 check('5 / 4.0', '1.25')
264 check('5 / ( [string length "abcd"] + 0.0 )', '1.25')
265 check('20.0/5.0', '4.0')
266 check('"0x03" > "2"', '1')
267 check('[string length "a\xbd\u20ac"]', '3')
268 check(r'[string length "a\xbd\u20ac"]', '3')
269 check('"abc"', 'abc')
270 check('"a\xbd\u20ac"', 'a\xbd\u20ac')
271 check(r'"a\xbd\u20ac"', 'a\xbd\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200272 check(r'"a\0b"', 'a\x00b')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200273 if tcl_version >= (8, 5):
274 check('2**64', str(2**64))
Serhiy Storchakafc055252014-02-03 20:41:34 +0200275
276 def test_exprdouble(self):
277 tcl = self.interp
278 tcl.call('set', 'a', 3)
279 tcl.call('set', 'b', 6)
280 def check(expr, expected):
281 result = tcl.exprdouble(expr)
282 self.assertEqual(result, expected)
283 self.assertIsInstance(result, float)
284
285 self.assertRaises(TypeError, tcl.exprdouble)
286 self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6')
287 self.assertRaises(TypeError, tcl.exprdouble, b'8.2 + 6')
288 self.assertRaises(TclError, tcl.exprdouble, 'spam')
289 check('', 0.0)
290 check('8.2 + 6', 14.2)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200291 check('3.1 + $a', 6.1)
292 check('2 + "$a.$b"', 5.6)
293 check('4*[llength "6 2"]', 8.0)
294 check('{word one} < "word $a"', 0.0)
295 check('4*2 < 7', 0.0)
296 check('hypot($a, 4)', 5.0)
297 check('5 / 4', 1.0)
298 check('5 / 4.0', 1.25)
299 check('5 / ( [string length "abcd"] + 0.0 )', 1.25)
300 check('20.0/5.0', 4.0)
301 check('"0x03" > "2"', 1.0)
302 check('[string length "a\xbd\u20ac"]', 3.0)
303 check(r'[string length "a\xbd\u20ac"]', 3.0)
304 self.assertRaises(TclError, tcl.exprdouble, '"abc"')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200305 if tcl_version >= (8, 5):
306 check('2**64', float(2**64))
Serhiy Storchakafc055252014-02-03 20:41:34 +0200307
308 def test_exprlong(self):
309 tcl = self.interp
310 tcl.call('set', 'a', 3)
311 tcl.call('set', 'b', 6)
312 def check(expr, expected):
313 result = tcl.exprlong(expr)
314 self.assertEqual(result, expected)
315 self.assertIsInstance(result, int)
316
317 self.assertRaises(TypeError, tcl.exprlong)
318 self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6')
319 self.assertRaises(TypeError, tcl.exprlong, b'8.2 + 6')
320 self.assertRaises(TclError, tcl.exprlong, 'spam')
321 check('', 0)
322 check('8.2 + 6', 14)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200323 check('3.1 + $a', 6)
324 check('2 + "$a.$b"', 5)
325 check('4*[llength "6 2"]', 8)
326 check('{word one} < "word $a"', 0)
327 check('4*2 < 7', 0)
328 check('hypot($a, 4)', 5)
329 check('5 / 4', 1)
330 check('5 / 4.0', 1)
331 check('5 / ( [string length "abcd"] + 0.0 )', 1)
332 check('20.0/5.0', 4)
333 check('"0x03" > "2"', 1)
334 check('[string length "a\xbd\u20ac"]', 3)
335 check(r'[string length "a\xbd\u20ac"]', 3)
336 self.assertRaises(TclError, tcl.exprlong, '"abc"')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200337 if tcl_version >= (8, 5):
338 self.assertRaises(TclError, tcl.exprlong, '2**64')
Serhiy Storchakafc055252014-02-03 20:41:34 +0200339
340 def test_exprboolean(self):
341 tcl = self.interp
342 tcl.call('set', 'a', 3)
343 tcl.call('set', 'b', 6)
344 def check(expr, expected):
345 result = tcl.exprboolean(expr)
346 self.assertEqual(result, expected)
347 self.assertIsInstance(result, int)
348 self.assertNotIsInstance(result, bool)
349
350 self.assertRaises(TypeError, tcl.exprboolean)
351 self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6')
352 self.assertRaises(TypeError, tcl.exprboolean, b'8.2 + 6')
353 self.assertRaises(TclError, tcl.exprboolean, 'spam')
354 check('', False)
355 for value in ('0', 'false', 'no', 'off'):
356 check(value, False)
357 check('"%s"' % value, False)
358 check('{%s}' % value, False)
359 for value in ('1', 'true', 'yes', 'on'):
360 check(value, True)
361 check('"%s"' % value, True)
362 check('{%s}' % value, True)
363 check('8.2 + 6', True)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200364 check('3.1 + $a', True)
365 check('2 + "$a.$b"', True)
366 check('4*[llength "6 2"]', True)
367 check('{word one} < "word $a"', False)
368 check('4*2 < 7', False)
369 check('hypot($a, 4)', True)
370 check('5 / 4', True)
371 check('5 / 4.0', True)
372 check('5 / ( [string length "abcd"] + 0.0 )', True)
373 check('20.0/5.0', True)
374 check('"0x03" > "2"', True)
375 check('[string length "a\xbd\u20ac"]', True)
376 check(r'[string length "a\xbd\u20ac"]', True)
377 self.assertRaises(TclError, tcl.exprboolean, '"abc"')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200378 if tcl_version >= (8, 5):
379 check('2**64', True)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200380
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200381 def test_passing_values(self):
382 def passValue(value):
383 return self.interp.call('set', '_', value)
384
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200385 self.assertEqual(passValue(True), True if self.wantobjects else '1')
386 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200387 self.assertEqual(passValue('string'), 'string')
388 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200389 self.assertEqual(passValue('str\x00ing'), 'str\x00ing')
390 self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd')
391 self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac')
392 self.assertEqual(passValue(b'str\x00ing'), 'str\x00ing')
393 self.assertEqual(passValue(b'str\xc0\x80ing'), 'str\x00ing')
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200394 for i in (0, 1, -1, 2**31-1, -2**31):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200395 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200396 for f in (0.0, 1.0, -1.0, 1/3,
397 sys.float_info.min, sys.float_info.max,
398 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200399 if self.wantobjects:
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200400 self.assertEqual(passValue(f), f)
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200401 else:
402 self.assertEqual(float(passValue(f)), f)
403 if self.wantobjects:
404 f = passValue(float('nan'))
405 self.assertNotEqual(f, f)
406 self.assertEqual(passValue(float('inf')), float('inf'))
407 self.assertEqual(passValue(-float('inf')), -float('inf'))
408 else:
409 f = float(passValue(float('nan')))
410 self.assertNotEqual(f, f)
411 self.assertEqual(float(passValue(float('inf'))), float('inf'))
412 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
413 self.assertEqual(passValue((1, '2', (3.4,))),
414 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Serhiy Storchaka2b00c492014-05-21 17:12:21 +0300415 self.assertEqual(passValue(['a', ['b', 'c']]),
416 ('a', ('b', 'c')) if self.wantobjects else 'a {b c}')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000417
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200418 def test_user_command(self):
419 result = None
420 def testfunc(arg):
421 nonlocal result
422 result = arg
423 return arg
424 self.interp.createcommand('testfunc', testfunc)
Antoine Pitrou220cc212014-02-23 19:39:06 +0100425 self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200426 def check(value, expected, eq=self.assertEqual):
427 r = self.interp.call('testfunc', value)
428 self.assertIsInstance(result, str)
429 eq(result, expected)
430 self.assertIsInstance(r, str)
431 eq(r, expected)
432 def float_eq(actual, expected):
433 expected = float(expected)
434 self.assertAlmostEqual(float(actual), expected,
435 delta=abs(expected) * 1e-10)
436 def nan_eq(actual, expected):
437 actual = float(actual)
438 self.assertNotEqual(actual, actual)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200439
440 check(True, '1')
441 check(False, '0')
442 check('string', 'string')
443 check('string\xbd', 'string\xbd')
444 check('string\u20ac', 'string\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200445 check(b'string', 'string')
446 check(b'string\xe2\x82\xac', 'string\u20ac')
447 check('str\x00ing', 'str\x00ing')
448 check('str\x00ing\xbd', 'str\x00ing\xbd')
449 check('str\x00ing\u20ac', 'str\x00ing\u20ac')
450 check(b'str\xc0\x80ing', 'str\x00ing')
451 check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac')
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200452 for i in (0, 1, -1, 2**31-1, -2**31):
453 check(i, str(i))
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200454 for f in (0.0, 1.0, -1.0):
455 check(f, repr(f))
456 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200457 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200458 check(f, f, eq=float_eq)
459 check(float('inf'), 'Inf', eq=float_eq)
460 check(-float('inf'), '-Inf', eq=float_eq)
461 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200462 check((), '')
463 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
Serhiy Storchaka2b00c492014-05-21 17:12:21 +0300464 check([1, [2,], [3, 4], '5 6', []], '1 2 {3 4} {5 6} {}')
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200465
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300466 def test_splitlist(self):
467 splitlist = self.interp.tk.splitlist
468 call = self.interp.tk.call
469 self.assertRaises(TypeError, splitlist)
470 self.assertRaises(TypeError, splitlist, 'a', 'b')
471 self.assertRaises(TypeError, splitlist, 2)
472 testcases = [
473 ('2', ('2',)),
474 ('', ()),
475 ('{}', ('',)),
476 ('""', ('',)),
477 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
478 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
479 ('a \u20ac', ('a', '\u20ac')),
480 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200481 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300482 ('a {b c}', ('a', 'b c')),
483 (r'a b\ c', ('a', 'b c')),
484 (('a', 'b c'), ('a', 'b c')),
485 ('a 2', ('a', '2')),
486 (('a', 2), ('a', 2)),
487 ('a 3.4', ('a', '3.4')),
488 (('a', 3.4), ('a', 3.4)),
489 ((), ()),
Serhiy Storchaka2b00c492014-05-21 17:12:21 +0300490 ([], ()),
491 (['a', ['b', 'c']], ('a', ['b', 'c'])),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200492 (call('list', 1, '2', (3.4,)),
493 (1, '2', (3.4,)) if self.wantobjects else
494 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300495 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300496 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200497 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
498 # Before 8.5.5 dicts were converted to lists through string
499 expected = ('12', '\u20ac', '\u20ac', '3.4')
500 else:
501 expected = (12, '\u20ac', '\u20ac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300502 testcases += [
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200503 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
504 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300505 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300506 for arg, res in testcases:
507 self.assertEqual(splitlist(arg), res, msg=arg)
508 self.assertRaises(TclError, splitlist, '{')
509
510 def test_split(self):
511 split = self.interp.tk.split
512 call = self.interp.tk.call
513 self.assertRaises(TypeError, split)
514 self.assertRaises(TypeError, split, 'a', 'b')
515 self.assertRaises(TypeError, split, 2)
516 testcases = [
517 ('2', '2'),
518 ('', ''),
519 ('{}', ''),
520 ('""', ''),
521 ('{', '{'),
522 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
523 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
524 ('a \u20ac', ('a', '\u20ac')),
525 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200526 (b'a\xc0\x80b', 'a\x00b'),
527 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
528 (b'{a\xc0\x80b c\xc0\x80d', '{a\x00b c\x00d'),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300529 ('a {b c}', ('a', ('b', 'c'))),
530 (r'a b\ c', ('a', ('b', 'c'))),
531 (('a', b'b c'), ('a', ('b', 'c'))),
532 (('a', 'b c'), ('a', ('b', 'c'))),
533 ('a 2', ('a', '2')),
534 (('a', 2), ('a', 2)),
535 ('a 3.4', ('a', '3.4')),
536 (('a', 3.4), ('a', 3.4)),
537 (('a', (2, 3.4)), ('a', (2, 3.4))),
538 ((), ()),
Serhiy Storchaka2b00c492014-05-21 17:12:21 +0300539 ([], ()),
540 (['a', 'b c'], ('a', ('b', 'c'))),
541 (['a', ['b', 'c']], ('a', ('b', 'c'))),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200542 (call('list', 1, '2', (3.4,)),
543 (1, '2', (3.4,)) if self.wantobjects else
544 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300545 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300546 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200547 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
548 # Before 8.5.5 dicts were converted to lists through string
549 expected = ('12', '\u20ac', '\u20ac', '3.4')
550 else:
551 expected = (12, '\u20ac', '\u20ac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300552 testcases += [
553 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200554 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300555 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300556 for arg, res in testcases:
557 self.assertEqual(split(arg), res, msg=arg)
558
Neal Norwitz63dfece2004-02-19 02:37:29 +0000559
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300560class BigmemTclTest(unittest.TestCase):
561
562 def setUp(self):
563 self.interp = Tcl()
564
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200565 @support.cpython_only
566 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
567 @support.bigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300568 def test_huge_string_call(self, size):
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300569 value = ' ' * size
570 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
571
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300572 @support.cpython_only
573 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
574 @support.bigmemtest(size=INT_MAX + 1, memuse=9, dry_run=False)
575 def test_huge_string_builtins(self, size):
576 value = '1' + ' ' * size
Serhiy Storchakaaecfa9e2014-05-30 15:54:35 +0300577 self.assertRaises(OverflowError, self.interp.tk.getint, value)
578 self.assertRaises(OverflowError, self.interp.tk.getdouble, value)
579 self.assertRaises(OverflowError, self.interp.tk.getboolean, value)
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300580 self.assertRaises(OverflowError, self.interp.eval, value)
581 self.assertRaises(OverflowError, self.interp.evalfile, value)
582 self.assertRaises(OverflowError, self.interp.record, value)
583 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
584 self.assertRaises(OverflowError, self.interp.setvar, value, 'x', 'a')
585 self.assertRaises(OverflowError, self.interp.setvar, 'x', value, 'a')
586 self.assertRaises(OverflowError, self.interp.unsetvar, value)
587 self.assertRaises(OverflowError, self.interp.unsetvar, 'x', value)
588 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
589 self.assertRaises(OverflowError, self.interp.exprstring, value)
590 self.assertRaises(OverflowError, self.interp.exprlong, value)
591 self.assertRaises(OverflowError, self.interp.exprboolean, value)
592 self.assertRaises(OverflowError, self.interp.splitlist, value)
593 self.assertRaises(OverflowError, self.interp.split, value)
594 self.assertRaises(OverflowError, self.interp.createcommand, value, max)
595 self.assertRaises(OverflowError, self.interp.deletecommand, value)
596
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300597
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200598def setUpModule():
599 if support.verbose:
600 tcl = Tcl()
601 print('patchlevel =', tcl.call('info', 'patchlevel'))
602
603
Neal Norwitz63dfece2004-02-19 02:37:29 +0000604def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300605 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000606
David Aschere2b4b322004-02-18 05:59:53 +0000607if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000608 test_main()