blob: 5226ee676e9d01bae8768ab0d6c856b43f5b0480 [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
David Aschere2b4b322004-02-18 05:59:53 +0000136 def testEvalFile(self):
137 tcl = self.interp
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200138 with open(support.TESTFN, 'w') as f:
139 self.addCleanup(support.unlink, support.TESTFN)
140 f.write("""set a 1
141 set b 2
142 set c [ expr $a + $b ]
143 """)
144 tcl.evalfile(support.TESTFN)
David Aschere2b4b322004-02-18 05:59:53 +0000145 self.assertEqual(tcl.eval('set a'),'1')
146 self.assertEqual(tcl.eval('set b'),'2')
147 self.assertEqual(tcl.eval('set c'),'3')
148
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200149 def test_evalfile_null_in_result(self):
150 tcl = self.interp
151 with open(support.TESTFN, 'w') as f:
152 self.addCleanup(support.unlink, support.TESTFN)
153 f.write("""
154 set a "a\0b"
155 set b "a\\0b"
156 """)
157 tcl.evalfile(support.TESTFN)
158 self.assertEqual(tcl.eval('set a'), 'a\x00b')
159 self.assertEqual(tcl.eval('set b'), 'a\x00b')
160
David Aschere2b4b322004-02-18 05:59:53 +0000161 def testEvalFileException(self):
162 tcl = self.interp
163 filename = "doesnotexists"
164 try:
165 os.remove(filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000166 except Exception as e:
David Aschere2b4b322004-02-18 05:59:53 +0000167 pass
168 self.assertRaises(TclError,tcl.evalfile,filename)
169
David Aschere2b4b322004-02-18 05:59:53 +0000170 def testPackageRequireException(self):
171 tcl = self.interp
172 self.assertRaises(TclError,tcl.eval,'package require DNE')
173
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000174 @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000175 def testLoadWithUNC(self):
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000176 # Build a UNC path from the regular path.
177 # Something like
178 # \\%COMPUTERNAME%\c$\python27\python.exe
179
180 fullname = os.path.abspath(sys.executable)
181 if fullname[1] != ':':
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000182 raise unittest.SkipTest('Absolute path should have drive part')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000183 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
184 fullname[0],
185 fullname[3:])
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000186 if not os.path.exists(unc_name):
187 raise unittest.SkipTest('Cannot connect to UNC Path')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000188
Georg Brandlec5ae3b2010-07-31 19:17:11 +0000189 with support.EnvironmentVarGuard() as env:
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000190 env.unset("TCL_LIBRARY")
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000191 f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000192
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000193 self.assertIn('tkinter', f.read())
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000194 # exit code must be zero
195 self.assertEqual(f.close(), None)
196
Serhiy Storchakafc055252014-02-03 20:41:34 +0200197 def test_exprstring(self):
198 tcl = self.interp
199 tcl.call('set', 'a', 3)
200 tcl.call('set', 'b', 6)
201 def check(expr, expected):
202 result = tcl.exprstring(expr)
203 self.assertEqual(result, expected)
204 self.assertIsInstance(result, str)
205
206 self.assertRaises(TypeError, tcl.exprstring)
207 self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6')
208 self.assertRaises(TypeError, tcl.exprstring, b'8.2 + 6')
209 self.assertRaises(TclError, tcl.exprstring, 'spam')
210 check('', '0')
211 check('8.2 + 6', '14.2')
Serhiy Storchakafc055252014-02-03 20:41:34 +0200212 check('3.1 + $a', '6.1')
213 check('2 + "$a.$b"', '5.6')
214 check('4*[llength "6 2"]', '8')
215 check('{word one} < "word $a"', '0')
216 check('4*2 < 7', '0')
217 check('hypot($a, 4)', '5.0')
218 check('5 / 4', '1')
219 check('5 / 4.0', '1.25')
220 check('5 / ( [string length "abcd"] + 0.0 )', '1.25')
221 check('20.0/5.0', '4.0')
222 check('"0x03" > "2"', '1')
223 check('[string length "a\xbd\u20ac"]', '3')
224 check(r'[string length "a\xbd\u20ac"]', '3')
225 check('"abc"', 'abc')
226 check('"a\xbd\u20ac"', 'a\xbd\u20ac')
227 check(r'"a\xbd\u20ac"', 'a\xbd\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200228 check(r'"a\0b"', 'a\x00b')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200229 if tcl_version >= (8, 5):
230 check('2**64', str(2**64))
Serhiy Storchakafc055252014-02-03 20:41:34 +0200231
232 def test_exprdouble(self):
233 tcl = self.interp
234 tcl.call('set', 'a', 3)
235 tcl.call('set', 'b', 6)
236 def check(expr, expected):
237 result = tcl.exprdouble(expr)
238 self.assertEqual(result, expected)
239 self.assertIsInstance(result, float)
240
241 self.assertRaises(TypeError, tcl.exprdouble)
242 self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6')
243 self.assertRaises(TypeError, tcl.exprdouble, b'8.2 + 6')
244 self.assertRaises(TclError, tcl.exprdouble, 'spam')
245 check('', 0.0)
246 check('8.2 + 6', 14.2)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200247 check('3.1 + $a', 6.1)
248 check('2 + "$a.$b"', 5.6)
249 check('4*[llength "6 2"]', 8.0)
250 check('{word one} < "word $a"', 0.0)
251 check('4*2 < 7', 0.0)
252 check('hypot($a, 4)', 5.0)
253 check('5 / 4', 1.0)
254 check('5 / 4.0', 1.25)
255 check('5 / ( [string length "abcd"] + 0.0 )', 1.25)
256 check('20.0/5.0', 4.0)
257 check('"0x03" > "2"', 1.0)
258 check('[string length "a\xbd\u20ac"]', 3.0)
259 check(r'[string length "a\xbd\u20ac"]', 3.0)
260 self.assertRaises(TclError, tcl.exprdouble, '"abc"')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200261 if tcl_version >= (8, 5):
262 check('2**64', float(2**64))
Serhiy Storchakafc055252014-02-03 20:41:34 +0200263
264 def test_exprlong(self):
265 tcl = self.interp
266 tcl.call('set', 'a', 3)
267 tcl.call('set', 'b', 6)
268 def check(expr, expected):
269 result = tcl.exprlong(expr)
270 self.assertEqual(result, expected)
271 self.assertIsInstance(result, int)
272
273 self.assertRaises(TypeError, tcl.exprlong)
274 self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6')
275 self.assertRaises(TypeError, tcl.exprlong, b'8.2 + 6')
276 self.assertRaises(TclError, tcl.exprlong, 'spam')
277 check('', 0)
278 check('8.2 + 6', 14)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200279 check('3.1 + $a', 6)
280 check('2 + "$a.$b"', 5)
281 check('4*[llength "6 2"]', 8)
282 check('{word one} < "word $a"', 0)
283 check('4*2 < 7', 0)
284 check('hypot($a, 4)', 5)
285 check('5 / 4', 1)
286 check('5 / 4.0', 1)
287 check('5 / ( [string length "abcd"] + 0.0 )', 1)
288 check('20.0/5.0', 4)
289 check('"0x03" > "2"', 1)
290 check('[string length "a\xbd\u20ac"]', 3)
291 check(r'[string length "a\xbd\u20ac"]', 3)
292 self.assertRaises(TclError, tcl.exprlong, '"abc"')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200293 if tcl_version >= (8, 5):
294 self.assertRaises(TclError, tcl.exprlong, '2**64')
Serhiy Storchakafc055252014-02-03 20:41:34 +0200295
296 def test_exprboolean(self):
297 tcl = self.interp
298 tcl.call('set', 'a', 3)
299 tcl.call('set', 'b', 6)
300 def check(expr, expected):
301 result = tcl.exprboolean(expr)
302 self.assertEqual(result, expected)
303 self.assertIsInstance(result, int)
304 self.assertNotIsInstance(result, bool)
305
306 self.assertRaises(TypeError, tcl.exprboolean)
307 self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6')
308 self.assertRaises(TypeError, tcl.exprboolean, b'8.2 + 6')
309 self.assertRaises(TclError, tcl.exprboolean, 'spam')
310 check('', False)
311 for value in ('0', 'false', 'no', 'off'):
312 check(value, False)
313 check('"%s"' % value, False)
314 check('{%s}' % value, False)
315 for value in ('1', 'true', 'yes', 'on'):
316 check(value, True)
317 check('"%s"' % value, True)
318 check('{%s}' % value, True)
319 check('8.2 + 6', True)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200320 check('3.1 + $a', True)
321 check('2 + "$a.$b"', True)
322 check('4*[llength "6 2"]', True)
323 check('{word one} < "word $a"', False)
324 check('4*2 < 7', False)
325 check('hypot($a, 4)', True)
326 check('5 / 4', True)
327 check('5 / 4.0', True)
328 check('5 / ( [string length "abcd"] + 0.0 )', True)
329 check('20.0/5.0', True)
330 check('"0x03" > "2"', True)
331 check('[string length "a\xbd\u20ac"]', True)
332 check(r'[string length "a\xbd\u20ac"]', True)
333 self.assertRaises(TclError, tcl.exprboolean, '"abc"')
Serhiy Storchaka160f8922014-02-03 22:31:09 +0200334 if tcl_version >= (8, 5):
335 check('2**64', True)
Serhiy Storchakafc055252014-02-03 20:41:34 +0200336
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200337 def test_passing_values(self):
338 def passValue(value):
339 return self.interp.call('set', '_', value)
340
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200341 self.assertEqual(passValue(True), True if self.wantobjects else '1')
342 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200343 self.assertEqual(passValue('string'), 'string')
344 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200345 self.assertEqual(passValue('str\x00ing'), 'str\x00ing')
346 self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd')
347 self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac')
348 self.assertEqual(passValue(b'str\x00ing'), 'str\x00ing')
349 self.assertEqual(passValue(b'str\xc0\x80ing'), 'str\x00ing')
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200350 for i in (0, 1, -1, 2**31-1, -2**31):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200351 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200352 for f in (0.0, 1.0, -1.0, 1/3,
353 sys.float_info.min, sys.float_info.max,
354 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200355 if self.wantobjects:
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200356 self.assertEqual(passValue(f), f)
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200357 else:
358 self.assertEqual(float(passValue(f)), f)
359 if self.wantobjects:
360 f = passValue(float('nan'))
361 self.assertNotEqual(f, f)
362 self.assertEqual(passValue(float('inf')), float('inf'))
363 self.assertEqual(passValue(-float('inf')), -float('inf'))
364 else:
365 f = float(passValue(float('nan')))
366 self.assertNotEqual(f, f)
367 self.assertEqual(float(passValue(float('inf'))), float('inf'))
368 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
369 self.assertEqual(passValue((1, '2', (3.4,))),
370 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000371
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200372 def test_user_command(self):
373 result = None
374 def testfunc(arg):
375 nonlocal result
376 result = arg
377 return arg
378 self.interp.createcommand('testfunc', testfunc)
Antoine Pitrou220cc212014-02-23 19:39:06 +0100379 self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200380 def check(value, expected, eq=self.assertEqual):
381 r = self.interp.call('testfunc', value)
382 self.assertIsInstance(result, str)
383 eq(result, expected)
384 self.assertIsInstance(r, str)
385 eq(r, expected)
386 def float_eq(actual, expected):
387 expected = float(expected)
388 self.assertAlmostEqual(float(actual), expected,
389 delta=abs(expected) * 1e-10)
390 def nan_eq(actual, expected):
391 actual = float(actual)
392 self.assertNotEqual(actual, actual)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200393
394 check(True, '1')
395 check(False, '0')
396 check('string', 'string')
397 check('string\xbd', 'string\xbd')
398 check('string\u20ac', 'string\u20ac')
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200399 check(b'string', 'string')
400 check(b'string\xe2\x82\xac', 'string\u20ac')
401 check('str\x00ing', 'str\x00ing')
402 check('str\x00ing\xbd', 'str\x00ing\xbd')
403 check('str\x00ing\u20ac', 'str\x00ing\u20ac')
404 check(b'str\xc0\x80ing', 'str\x00ing')
405 check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac')
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200406 for i in (0, 1, -1, 2**31-1, -2**31):
407 check(i, str(i))
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200408 for f in (0.0, 1.0, -1.0):
409 check(f, repr(f))
410 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200411 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200412 check(f, f, eq=float_eq)
413 check(float('inf'), 'Inf', eq=float_eq)
414 check(-float('inf'), '-Inf', eq=float_eq)
415 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200416 check((), '')
417 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
418
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300419 def test_splitlist(self):
420 splitlist = self.interp.tk.splitlist
421 call = self.interp.tk.call
422 self.assertRaises(TypeError, splitlist)
423 self.assertRaises(TypeError, splitlist, 'a', 'b')
424 self.assertRaises(TypeError, splitlist, 2)
425 testcases = [
426 ('2', ('2',)),
427 ('', ()),
428 ('{}', ('',)),
429 ('""', ('',)),
430 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
431 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
432 ('a \u20ac', ('a', '\u20ac')),
433 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200434 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300435 ('a {b c}', ('a', 'b c')),
436 (r'a b\ c', ('a', 'b c')),
437 (('a', 'b c'), ('a', 'b c')),
438 ('a 2', ('a', '2')),
439 (('a', 2), ('a', 2)),
440 ('a 3.4', ('a', '3.4')),
441 (('a', 3.4), ('a', 3.4)),
442 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200443 (call('list', 1, '2', (3.4,)),
444 (1, '2', (3.4,)) if self.wantobjects else
445 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300446 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300447 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200448 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
449 # Before 8.5.5 dicts were converted to lists through string
450 expected = ('12', '\u20ac', '\u20ac', '3.4')
451 else:
452 expected = (12, '\u20ac', '\u20ac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300453 testcases += [
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200454 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
455 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300456 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300457 for arg, res in testcases:
458 self.assertEqual(splitlist(arg), res, msg=arg)
459 self.assertRaises(TclError, splitlist, '{')
460
461 def test_split(self):
462 split = self.interp.tk.split
463 call = self.interp.tk.call
464 self.assertRaises(TypeError, split)
465 self.assertRaises(TypeError, split, 'a', 'b')
466 self.assertRaises(TypeError, split, 2)
467 testcases = [
468 ('2', '2'),
469 ('', ''),
470 ('{}', ''),
471 ('""', ''),
472 ('{', '{'),
473 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
474 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
475 ('a \u20ac', ('a', '\u20ac')),
476 (b'a \xe2\x82\xac', ('a', '\u20ac')),
Serhiy Storchaka1317e142014-02-03 21:24:07 +0200477 (b'a\xc0\x80b', 'a\x00b'),
478 (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
479 (b'{a\xc0\x80b c\xc0\x80d', '{a\x00b c\x00d'),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300480 ('a {b c}', ('a', ('b', 'c'))),
481 (r'a b\ c', ('a', ('b', 'c'))),
482 (('a', b'b c'), ('a', ('b', 'c'))),
483 (('a', 'b c'), ('a', ('b', 'c'))),
484 ('a 2', ('a', '2')),
485 (('a', 2), ('a', 2)),
486 ('a 3.4', ('a', '3.4')),
487 (('a', 3.4), ('a', 3.4)),
488 (('a', (2, 3.4)), ('a', (2, 3.4))),
489 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200490 (call('list', 1, '2', (3.4,)),
491 (1, '2', (3.4,)) if self.wantobjects else
492 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300493 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300494 if tcl_version >= (8, 5):
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200495 if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5):
496 # Before 8.5.5 dicts were converted to lists through string
497 expected = ('12', '\u20ac', '\u20ac', '3.4')
498 else:
499 expected = (12, '\u20ac', '\u20ac', (3.4,))
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300500 testcases += [
501 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchaka92af06b2014-02-02 23:04:24 +0200502 expected),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300503 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300504 for arg, res in testcases:
505 self.assertEqual(split(arg), res, msg=arg)
506
Serhiy Storchaka369606d2013-09-23 23:20:07 +0300507 def test_merge(self):
508 with support.check_warnings(('merge is deprecated',
509 DeprecationWarning)):
510 merge = self.interp.tk.merge
511 call = self.interp.tk.call
512 testcases = [
513 ((), ''),
514 (('a',), 'a'),
515 ((2,), '2'),
516 (('',), '{}'),
517 ('{', '\\{'),
518 (('a', 'b', 'c'), 'a b c'),
519 ((' ', '\t', '\r', '\n'), '{ } {\t} {\r} {\n}'),
520 (('a', ' ', 'c'), 'a { } c'),
521 (('a', '€'), 'a €'),
522 (('a', '\U000104a2'), 'a \U000104a2'),
523 (('a', b'\xe2\x82\xac'), 'a €'),
524 (('a', ('b', 'c')), 'a {b c}'),
525 (('a', 2), 'a 2'),
526 (('a', 3.4), 'a 3.4'),
527 (('a', (2, 3.4)), 'a {2 3.4}'),
528 ((), ''),
529 ((call('list', 1, '2', (3.4,)),), '{1 2 3.4}'),
Serhiy Storchaka369606d2013-09-23 23:20:07 +0300530 ]
Serhiy Storchaka8797dcd2013-10-27 12:38:01 +0200531 if tcl_version >= (8, 5):
532 testcases += [
533 ((call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),),
534 '{12 € € 3.4}'),
535 ]
Serhiy Storchaka369606d2013-09-23 23:20:07 +0300536 for args, res in testcases:
537 self.assertEqual(merge(*args), res, msg=args)
538 self.assertRaises(UnicodeDecodeError, merge, b'\x80')
539 self.assertRaises(UnicodeEncodeError, merge, '\udc80')
540
Neal Norwitz63dfece2004-02-19 02:37:29 +0000541
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300542class BigmemTclTest(unittest.TestCase):
543
544 def setUp(self):
545 self.interp = Tcl()
546
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200547 @support.cpython_only
548 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
549 @support.bigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300550 def test_huge_string(self, size):
551 value = ' ' * size
552 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
553
554
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200555def setUpModule():
556 if support.verbose:
557 tcl = Tcl()
558 print('patchlevel =', tcl.call('info', 'patchlevel'))
559
560
Neal Norwitz63dfece2004-02-19 02:37:29 +0000561def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300562 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000563
David Aschere2b4b322004-02-18 05:59:53 +0000564if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000565 test_main()