blob: da8f6299d6bc093f2778cc5efa45a644f9ec2191 [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
Serhiy Storchaka8f0a1d02014-09-06 22:47:58 +030010tkinter = support.import_fresh_module('tkinter')
Terry Jan Reedy743c85a2013-03-16 02:37:06 -040011
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')
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300392 self.assertEqual(passValue(b'str\x00ing'),
393 b'str\x00ing' if self.wantobjects else 'str\x00ing')
394 self.assertEqual(passValue(b'str\xc0\x80ing'),
395 b'str\xc0\x80ing' if self.wantobjects else 'str\xc0\x80ing')
396 self.assertEqual(passValue(b'str\xbding'),
397 b'str\xbding' if self.wantobjects else 'str\xbding')
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200398 for i in (0, 1, -1, 2**31-1, -2**31):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200399 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200400 for f in (0.0, 1.0, -1.0, 1/3,
401 sys.float_info.min, sys.float_info.max,
402 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200403 if self.wantobjects:
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200404 self.assertEqual(passValue(f), f)
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200405 else:
406 self.assertEqual(float(passValue(f)), f)
407 if self.wantobjects:
408 f = passValue(float('nan'))
409 self.assertNotEqual(f, f)
410 self.assertEqual(passValue(float('inf')), float('inf'))
411 self.assertEqual(passValue(-float('inf')), -float('inf'))
412 else:
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200413 self.assertEqual(float(passValue(float('inf'))), float('inf'))
414 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
Serhiy Storchaka6f1435c2014-07-07 14:57:08 +0300415 # XXX NaN representation can be not parsable by float()
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200416 self.assertEqual(passValue((1, '2', (3.4,))),
417 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000418
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200419 def test_user_command(self):
420 result = None
421 def testfunc(arg):
422 nonlocal result
423 result = arg
424 return arg
425 self.interp.createcommand('testfunc', testfunc)
Antoine Pitrou220cc212014-02-23 19:39:06 +0100426 self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
Serhiy Storchakad6ec3092014-08-18 17:47:29 +0300427 def check(value, expected=None, *, eq=self.assertEqual):
428 if expected is None:
429 expected = value
430 nonlocal result
431 result = None
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200432 r = self.interp.call('testfunc', value)
433 self.assertIsInstance(result, str)
434 eq(result, expected)
435 self.assertIsInstance(r, str)
436 eq(r, expected)
437 def float_eq(actual, expected):
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200438 self.assertAlmostEqual(float(actual), expected,
439 delta=abs(expected) * 1e-10)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200440
441 check(True, '1')
442 check(False, '0')
Serhiy Storchakad6ec3092014-08-18 17:47:29 +0300443 check('string')
444 check('string\xbd')
445 check('string\u20ac')
Serhiy Storchakaabf68ce2014-09-11 10:57:13 +0300446 check('')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200447 check(b'string', 'string')
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300448 check(b'string\xe2\x82\xac', 'string\xe2\x82\xac')
449 check(b'string\xbd', 'string\xbd')
Serhiy Storchakaabf68ce2014-09-11 10:57:13 +0300450 check(b'', '')
Serhiy Storchakad6ec3092014-08-18 17:47:29 +0300451 check('str\x00ing')
452 check('str\x00ing\xbd')
453 check('str\x00ing\u20ac')
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300454 check(b'str\x00ing', 'str\x00ing')
455 check(b'str\xc0\x80ing', 'str\xc0\x80ing')
456 check(b'str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac')
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200457 for i in (0, 1, -1, 2**31-1, -2**31):
458 check(i, str(i))
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200459 for f in (0.0, 1.0, -1.0):
460 check(f, repr(f))
461 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200462 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakad6ec3092014-08-18 17:47:29 +0300463 check(f, eq=float_eq)
464 check(float('inf'), eq=float_eq)
465 check(-float('inf'), eq=float_eq)
Serhiy Storchaka6f1435c2014-07-07 14:57:08 +0300466 # XXX NaN representation can be not parsable by float()
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200467 check((), '')
468 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
469
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300470 def test_splitlist(self):
471 splitlist = self.interp.tk.splitlist
472 call = self.interp.tk.call
473 self.assertRaises(TypeError, splitlist)
474 self.assertRaises(TypeError, splitlist, 'a', 'b')
475 self.assertRaises(TypeError, splitlist, 2)
476 testcases = [
477 ('2', ('2',)),
478 ('', ()),
479 ('{}', ('',)),
480 ('""', ('',)),
481 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
482 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
483 ('a \u20ac', ('a', '\u20ac')),
484 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200485 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300486 ('a {b c}', ('a', 'b c')),
487 (r'a b\ c', ('a', 'b c')),
488 (('a', 'b c'), ('a', 'b c')),
489 ('a 2', ('a', '2')),
490 (('a', 2), ('a', 2)),
491 ('a 3.4', ('a', '3.4')),
492 (('a', 3.4), ('a', 3.4)),
493 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200494 (call('list', 1, '2', (3.4,)),
495 (1, '2', (3.4,)) if self.wantobjects else
496 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300497 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300498 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200499 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
500 # Before 8.5.5 dicts were converted to lists through string
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300501 expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4')
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200502 else:
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300503 expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300504 testcases += [
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200505 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
506 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300507 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300508 for arg, res in testcases:
509 self.assertEqual(splitlist(arg), res, msg=arg)
510 self.assertRaises(TclError, splitlist, '{')
511
512 def test_split(self):
513 split = self.interp.tk.split
514 call = self.interp.tk.call
515 self.assertRaises(TypeError, split)
516 self.assertRaises(TypeError, split, 'a', 'b')
517 self.assertRaises(TypeError, split, 2)
518 testcases = [
519 ('2', '2'),
520 ('', ''),
521 ('{}', ''),
522 ('""', ''),
523 ('{', '{'),
524 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
525 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
526 ('a \u20ac', ('a', '\u20ac')),
527 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200528 (b'a\xc0\x80b', 'a\x00b'),
529 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
530 (b'{a\xc0\x80b c\xc0\x80d', '{a\x00b c\x00d'),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300531 ('a {b c}', ('a', ('b', 'c'))),
532 (r'a b\ c', ('a', ('b', 'c'))),
533 (('a', b'b c'), ('a', ('b', 'c'))),
534 (('a', 'b c'), ('a', ('b', 'c'))),
535 ('a 2', ('a', '2')),
536 (('a', 2), ('a', 2)),
537 ('a 3.4', ('a', '3.4')),
538 (('a', 3.4), ('a', 3.4)),
539 (('a', (2, 3.4)), ('a', (2, 3.4))),
540 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200541 (call('list', 1, '2', (3.4,)),
542 (1, '2', (3.4,)) if self.wantobjects else
543 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300544 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300545 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200546 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
547 # Before 8.5.5 dicts were converted to lists through string
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300548 expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4')
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200549 else:
Serhiy Storchaka74596a82014-07-30 18:33:13 +0300550 expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300551 testcases += [
552 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200553 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300554 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300555 for arg, res in testcases:
556 self.assertEqual(split(arg), res, msg=arg)
557
Serhiy Storchaka8f0a1d02014-09-06 22:47:58 +0300558 def test_splitdict(self):
559 splitdict = tkinter._splitdict
560 tcl = self.interp.tk
561
562 arg = '-a {1 2 3} -something foo status {}'
563 self.assertEqual(splitdict(tcl, arg, False),
564 {'-a': '1 2 3', '-something': 'foo', 'status': ''})
565 self.assertEqual(splitdict(tcl, arg),
566 {'a': '1 2 3', 'something': 'foo', 'status': ''})
567
568 arg = ('-a', (1, 2, 3), '-something', 'foo', 'status', '{}')
569 self.assertEqual(splitdict(tcl, arg, False),
570 {'-a': (1, 2, 3), '-something': 'foo', 'status': '{}'})
571 self.assertEqual(splitdict(tcl, arg),
572 {'a': (1, 2, 3), 'something': 'foo', 'status': '{}'})
573
574 self.assertRaises(RuntimeError, splitdict, tcl, '-a b -c ')
575 self.assertRaises(RuntimeError, splitdict, tcl, ('-a', 'b', '-c'))
576
577 arg = tcl.call('list',
578 '-a', (1, 2, 3), '-something', 'foo', 'status', ())
579 self.assertEqual(splitdict(tcl, arg),
580 {'a': (1, 2, 3) if self.wantobjects else '1 2 3',
581 'something': 'foo', 'status': ''})
582
583 if tcl_version >= (8, 5):
584 arg = tcl.call('dict', 'create',
585 '-a', (1, 2, 3), '-something', 'foo', 'status', ())
586 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
587 # Before 8.5.5 dicts were converted to lists through string
588 expected = {'a': '1 2 3', 'something': 'foo', 'status': ''}
589 else:
590 expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''}
591 self.assertEqual(splitdict(tcl, arg), expected)
592
Neal Norwitz63dfece2004-02-19 02:37:29 +0000593
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300594class BigmemTclTest(unittest.TestCase):
595
596 def setUp(self):
597 self.interp = Tcl()
598
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200599 @support.cpython_only
600 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
601 @support.bigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300602 def test_huge_string_call(self, size):
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300603 value = ' ' * size
604 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
605
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300606 @support.cpython_only
607 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
608 @support.bigmemtest(size=INT_MAX + 1, memuse=9, dry_run=False)
609 def test_huge_string_builtins(self, size):
610 value = '1' + ' ' * size
Serhiy Storchakaaecfa9e2014-05-30 15:54:35 +0300611 self.assertRaises(OverflowError, self.interp.tk.getint, value)
612 self.assertRaises(OverflowError, self.interp.tk.getdouble, value)
613 self.assertRaises(OverflowError, self.interp.tk.getboolean, value)
Serhiy Storchaka79851d72014-05-30 14:24:03 +0300614 self.assertRaises(OverflowError, self.interp.eval, value)
615 self.assertRaises(OverflowError, self.interp.evalfile, value)
616 self.assertRaises(OverflowError, self.interp.record, value)
617 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
618 self.assertRaises(OverflowError, self.interp.setvar, value, 'x', 'a')
619 self.assertRaises(OverflowError, self.interp.setvar, 'x', value, 'a')
620 self.assertRaises(OverflowError, self.interp.unsetvar, value)
621 self.assertRaises(OverflowError, self.interp.unsetvar, 'x', value)
622 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
623 self.assertRaises(OverflowError, self.interp.exprstring, value)
624 self.assertRaises(OverflowError, self.interp.exprlong, value)
625 self.assertRaises(OverflowError, self.interp.exprboolean, value)
626 self.assertRaises(OverflowError, self.interp.splitlist, value)
627 self.assertRaises(OverflowError, self.interp.split, value)
628 self.assertRaises(OverflowError, self.interp.createcommand, value, max)
629 self.assertRaises(OverflowError, self.interp.deletecommand, value)
630
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300631
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200632def setUpModule():
633 if support.verbose:
634 tcl = Tcl()
635 print('patchlevel =', tcl.call('info', 'patchlevel'))
636
637
Neal Norwitz63dfece2004-02-19 02:37:29 +0000638def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300639 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000640
David Aschere2b4b322004-02-18 05:59:53 +0000641if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000642 test_main()