blob: 01b532da11415638249510c407150964948d2fcb [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:
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200409 self.assertEqual(float(passValue(float('inf'))), float('inf'))
410 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
Serhiy Storchaka6f1435c2014-07-07 14:57:08 +0300411 # XXX NaN representation can be not parsable by float()
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200412 self.assertEqual(passValue((1, '2', (3.4,))),
413 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000414
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200415 def test_user_command(self):
416 result = None
417 def testfunc(arg):
418 nonlocal result
419 result = arg
420 return arg
421 self.interp.createcommand('testfunc', testfunc)
Antoine Pitrou220cc212014-02-23 19:39:06 +0100422 self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200423 def check(value, expected, eq=self.assertEqual):
424 r = self.interp.call('testfunc', value)
425 self.assertIsInstance(result, str)
426 eq(result, expected)
427 self.assertIsInstance(r, str)
428 eq(r, expected)
429 def float_eq(actual, expected):
430 expected = float(expected)
431 self.assertAlmostEqual(float(actual), expected,
432 delta=abs(expected) * 1e-10)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200433
434 check(True, '1')
435 check(False, '0')
436 check('string', 'string')
437 check('string\xbd', 'string\xbd')
438 check('string\u20ac', 'string\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200439 check(b'string', 'string')
440 check(b'string\xe2\x82\xac', 'string\u20ac')
441 check('str\x00ing', 'str\x00ing')
442 check('str\x00ing\xbd', 'str\x00ing\xbd')
443 check('str\x00ing\u20ac', 'str\x00ing\u20ac')
444 check(b'str\xc0\x80ing', 'str\x00ing')
445 check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac')
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200446 for i in (0, 1, -1, 2**31-1, -2**31):
447 check(i, str(i))
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200448 for f in (0.0, 1.0, -1.0):
449 check(f, repr(f))
450 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200451 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200452 check(f, f, eq=float_eq)
453 check(float('inf'), 'Inf', eq=float_eq)
454 check(-float('inf'), '-Inf', eq=float_eq)
Serhiy Storchaka6f1435c2014-07-07 14:57:08 +0300455 # XXX NaN representation can be not parsable by float()
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200456 check((), '')
457 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
458
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300459 def test_splitlist(self):
460 splitlist = self.interp.tk.splitlist
461 call = self.interp.tk.call
462 self.assertRaises(TypeError, splitlist)
463 self.assertRaises(TypeError, splitlist, 'a', 'b')
464 self.assertRaises(TypeError, splitlist, 2)
465 testcases = [
466 ('2', ('2',)),
467 ('', ()),
468 ('{}', ('',)),
469 ('""', ('',)),
470 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
471 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
472 ('a \u20ac', ('a', '\u20ac')),
473 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200474 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300475 ('a {b c}', ('a', 'b c')),
476 (r'a b\ c', ('a', 'b c')),
477 (('a', 'b c'), ('a', 'b c')),
478 ('a 2', ('a', '2')),
479 (('a', 2), ('a', 2)),
480 ('a 3.4', ('a', '3.4')),
481 (('a', 3.4), ('a', 3.4)),
482 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200483 (call('list', 1, '2', (3.4,)),
484 (1, '2', (3.4,)) if self.wantobjects else
485 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300486 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300487 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200488 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
489 # Before 8.5.5 dicts were converted to lists through string
490 expected = ('12', '\u20ac', '\u20ac', '3.4')
491 else:
492 expected = (12, '\u20ac', '\u20ac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300493 testcases += [
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200494 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
495 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300496 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300497 for arg, res in testcases:
498 self.assertEqual(splitlist(arg), res, msg=arg)
499 self.assertRaises(TclError, splitlist, '{')
500
501 def test_split(self):
502 split = self.interp.tk.split
503 call = self.interp.tk.call
504 self.assertRaises(TypeError, split)
505 self.assertRaises(TypeError, split, 'a', 'b')
506 self.assertRaises(TypeError, split, 2)
507 testcases = [
508 ('2', '2'),
509 ('', ''),
510 ('{}', ''),
511 ('""', ''),
512 ('{', '{'),
513 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
514 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
515 ('a \u20ac', ('a', '\u20ac')),
516 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200517 (b'a\xc0\x80b', 'a\x00b'),
518 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
519 (b'{a\xc0\x80b c\xc0\x80d', '{a\x00b c\x00d'),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300520 ('a {b c}', ('a', ('b', 'c'))),
521 (r'a b\ c', ('a', ('b', 'c'))),
522 (('a', b'b c'), ('a', ('b', 'c'))),
523 (('a', 'b c'), ('a', ('b', 'c'))),
524 ('a 2', ('a', '2')),
525 (('a', 2), ('a', 2)),
526 ('a 3.4', ('a', '3.4')),
527 (('a', 3.4), ('a', 3.4)),
528 (('a', (2, 3.4)), ('a', (2, 3.4))),
529 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200530 (call('list', 1, '2', (3.4,)),
531 (1, '2', (3.4,)) if self.wantobjects else
532 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300533 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300534 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200535 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
536 # Before 8.5.5 dicts were converted to lists through string
537 expected = ('12', '\u20ac', '\u20ac', '3.4')
538 else:
539 expected = (12, '\u20ac', '\u20ac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300540 testcases += [
541 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200542 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300543 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300544 for arg, res in testcases:
545 self.assertEqual(split(arg), res, msg=arg)
546
Neal Norwitz63dfece2004-02-19 02:37:29 +0000547
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300548class BigmemTclTest(unittest.TestCase):
549
550 def setUp(self):
551 self.interp = Tcl()
552
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200553 @support.cpython_only
554 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
555 @support.bigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300556 def test_huge_string_call(self, size):
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300557 value = ' ' * size
558 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
559
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300560 @support.cpython_only
561 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
562 @support.bigmemtest(size=INT_MAX + 1, memuse=9, dry_run=False)
563 def test_huge_string_builtins(self, size):
564 value = '1' + ' ' * size
Serhiy Storchakaaecfa9e2014-05-30 15:54:35 +0300565 self.assertRaises(OverflowError, self.interp.tk.getint, value)
566 self.assertRaises(OverflowError, self.interp.tk.getdouble, value)
567 self.assertRaises(OverflowError, self.interp.tk.getboolean, value)
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300568 self.assertRaises(OverflowError, self.interp.eval, value)
569 self.assertRaises(OverflowError, self.interp.evalfile, value)
570 self.assertRaises(OverflowError, self.interp.record, value)
571 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
572 self.assertRaises(OverflowError, self.interp.setvar, value, 'x', 'a')
573 self.assertRaises(OverflowError, self.interp.setvar, 'x', value, 'a')
574 self.assertRaises(OverflowError, self.interp.unsetvar, value)
575 self.assertRaises(OverflowError, self.interp.unsetvar, 'x', value)
576 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
577 self.assertRaises(OverflowError, self.interp.exprstring, value)
578 self.assertRaises(OverflowError, self.interp.exprlong, value)
579 self.assertRaises(OverflowError, self.interp.exprboolean, value)
580 self.assertRaises(OverflowError, self.interp.splitlist, value)
581 self.assertRaises(OverflowError, self.interp.split, value)
582 self.assertRaises(OverflowError, self.interp.createcommand, value, max)
583 self.assertRaises(OverflowError, self.interp.deletecommand, value)
584
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300585
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200586def setUpModule():
587 if support.verbose:
588 tcl = Tcl()
589 print('patchlevel =', tcl.call('info', 'patchlevel'))
590
591
Neal Norwitz63dfece2004-02-19 02:37:29 +0000592def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300593 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000594
David Aschere2b4b322004-02-18 05:59:53 +0000595if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000596 test_main()