blob: 49bca96174b8bdee618df41fdec3303be2061af2 [file] [log] [blame]
David Aschere2b4b322004-02-18 05:59:53 +00001import unittest
Serhiy Storchaka4a880412013-02-07 15:37:53 +02002import sys
David Aschere2b4b322004-02-18 05:59:53 +00003import os
Serhiy Storchaka42035702013-08-21 21:46:12 +03004import _testcapi
Neal Norwitz63dfece2004-02-19 02:37:29 +00005from test import test_support
Ezio Melotti794e5572013-05-07 09:34:49 +03006from subprocess import Popen, PIPE
R. David Murray597ebab2009-03-31 18:32:17 +00007
8# Skip this test if the _tkinter module wasn't built.
9_tkinter = test_support.import_module('_tkinter')
10
Guilherme Polo8e5e4382009-02-07 02:20:29 +000011from Tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000012from _tkinter import TclError
13
Serhiy Storchaka94025332013-09-08 20:32:56 +030014tcl_version = _tkinter.TCL_VERSION.split('.')
15try:
16 for i in range(len(tcl_version)):
17 tcl_version[i] = int(tcl_version[i])
18except ValueError:
19 pass
20tcl_version = tuple(tcl_version)
21
Serhiy Storchaka15b67d72014-02-02 23:04:06 +020022_tk_patchlevel = None
23def get_tk_patchlevel():
24 global _tk_patchlevel
25 if _tk_patchlevel is None:
26 tcl = Tcl()
27 patchlevel = []
28 for x in tcl.call('info', 'patchlevel').split('.'):
29 try:
30 x = int(x, 10)
31 except ValueError:
32 x = -1
33 patchlevel.append(x)
34 _tk_patchlevel = tuple(patchlevel)
35 return _tk_patchlevel
36
Benjamin Petersonb3619be2009-01-30 02:24:39 +000037
38class TkinterTest(unittest.TestCase):
39
40 def testFlattenLen(self):
41 # flatten(<object with no length>)
42 self.assertRaises(TypeError, _tkinter._flatten, True)
43
44
David Aschere2b4b322004-02-18 05:59:53 +000045class TclTest(unittest.TestCase):
46
47 def setUp(self):
48 self.interp = Tcl()
Serhiy Storchaka5542b152013-12-25 17:28:50 +020049 self.wantobjects = self.interp.tk.wantobjects()
David Aschere2b4b322004-02-18 05:59:53 +000050
51 def testEval(self):
52 tcl = self.interp
53 tcl.eval('set a 1')
54 self.assertEqual(tcl.eval('set a'),'1')
55
56 def testEvalException(self):
57 tcl = self.interp
58 self.assertRaises(TclError,tcl.eval,'set a')
59
60 def testEvalException2(self):
61 tcl = self.interp
62 self.assertRaises(TclError,tcl.eval,'this is wrong')
63
64 def testCall(self):
65 tcl = self.interp
66 tcl.call('set','a','1')
67 self.assertEqual(tcl.call('set','a'),'1')
68
69 def testCallException(self):
70 tcl = self.interp
71 self.assertRaises(TclError,tcl.call,'set','a')
72
73 def testCallException2(self):
74 tcl = self.interp
75 self.assertRaises(TclError,tcl.call,'this','is','wrong')
76
77 def testSetVar(self):
78 tcl = self.interp
79 tcl.setvar('a','1')
80 self.assertEqual(tcl.eval('set a'),'1')
81
82 def testSetVarArray(self):
83 tcl = self.interp
84 tcl.setvar('a(1)','1')
85 self.assertEqual(tcl.eval('set a(1)'),'1')
86
87 def testGetVar(self):
88 tcl = self.interp
89 tcl.eval('set a 1')
90 self.assertEqual(tcl.getvar('a'),'1')
91
92 def testGetVarArray(self):
93 tcl = self.interp
94 tcl.eval('set a(1) 1')
95 self.assertEqual(tcl.getvar('a(1)'),'1')
96
97 def testGetVarException(self):
98 tcl = self.interp
99 self.assertRaises(TclError,tcl.getvar,'a')
100
101 def testGetVarArrayException(self):
102 tcl = self.interp
103 self.assertRaises(TclError,tcl.getvar,'a(1)')
104
105 def testUnsetVar(self):
106 tcl = self.interp
107 tcl.setvar('a',1)
108 self.assertEqual(tcl.eval('info exists a'),'1')
109 tcl.unsetvar('a')
110 self.assertEqual(tcl.eval('info exists a'),'0')
111
112 def testUnsetVarArray(self):
113 tcl = self.interp
114 tcl.setvar('a(1)',1)
115 tcl.setvar('a(2)',2)
116 self.assertEqual(tcl.eval('info exists a(1)'),'1')
117 self.assertEqual(tcl.eval('info exists a(2)'),'1')
118 tcl.unsetvar('a(1)')
119 self.assertEqual(tcl.eval('info exists a(1)'),'0')
120 self.assertEqual(tcl.eval('info exists a(2)'),'1')
121
122 def testUnsetVarException(self):
123 tcl = self.interp
124 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000125
David Aschere2b4b322004-02-18 05:59:53 +0000126 def testEvalFile(self):
127 tcl = self.interp
128 filename = "testEvalFile.tcl"
129 fd = open(filename,'w')
130 script = """set a 1
131 set b 2
132 set c [ expr $a + $b ]
133 """
134 fd.write(script)
135 fd.close()
136 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000137 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000138 self.assertEqual(tcl.eval('set a'),'1')
139 self.assertEqual(tcl.eval('set b'),'2')
140 self.assertEqual(tcl.eval('set c'),'3')
141
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200142 def test_evalfile_null_in_result(self):
143 tcl = self.interp
144 with open(test_support.TESTFN, 'wb') as f:
145 self.addCleanup(test_support.unlink, test_support.TESTFN)
146 f.write("""
147 set a "a\0b"
148 set b "a\\0b"
149 """)
150 tcl.evalfile(test_support.TESTFN)
151 self.assertEqual(tcl.eval('set a'), 'a\xc0\x80b')
152 self.assertEqual(tcl.eval('set b'), 'a\xc0\x80b')
153
David Aschere2b4b322004-02-18 05:59:53 +0000154 def testEvalFileException(self):
155 tcl = self.interp
156 filename = "doesnotexists"
157 try:
158 os.remove(filename)
159 except Exception,e:
160 pass
161 self.assertRaises(TclError,tcl.evalfile,filename)
162
David Aschere2b4b322004-02-18 05:59:53 +0000163 def testPackageRequireException(self):
164 tcl = self.interp
165 self.assertRaises(TclError,tcl.eval,'package require DNE')
166
Zachary Ware57d35c62013-11-03 22:51:25 -0600167 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000168 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000169 # Build a UNC path from the regular path.
170 # Something like
171 # \\%COMPUTERNAME%\c$\python27\python.exe
172
173 fullname = os.path.abspath(sys.executable)
174 if fullname[1] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600175 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000176 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
177 fullname[0],
178 fullname[3:])
179
180 with test_support.EnvironmentVarGuard() as env:
181 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300182 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000183
Zachary Ware57d35c62013-11-03 22:51:25 -0600184 try:
185 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
186 except WindowsError as e:
187 if e.winerror == 5:
188 self.skipTest('Not permitted to start the child process')
189 else:
190 raise
191
Ezio Melotti794e5572013-05-07 09:34:49 +0300192 out_data, err_data = p.communicate()
193
194 msg = '\n\n'.join(['"Tkinter.py" not in output',
195 'Command:', cmd,
196 'stdout:', out_data,
197 'stderr:', err_data])
198
199 self.assertIn('Tkinter.py', out_data, msg)
200
201 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
202
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000203
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200204 def test_exprstring(self):
205 tcl = self.interp
206 tcl.call('set', 'a', 3)
207 tcl.call('set', 'b', 6)
208 def check(expr, expected):
209 result = tcl.exprstring(expr)
210 self.assertEqual(result, expected)
211 self.assertIsInstance(result, str)
212
213 self.assertRaises(TypeError, tcl.exprstring)
214 self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6')
215 self.assertRaises(TclError, tcl.exprstring, 'spam')
216 check('', '0')
217 check('8.2 + 6', '14.2')
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200218 check('3.1 + $a', '6.1')
219 check('2 + "$a.$b"', '5.6')
220 check('4*[llength "6 2"]', '8')
221 check('{word one} < "word $a"', '0')
222 check('4*2 < 7', '0')
223 check('hypot($a, 4)', '5.0')
224 check('5 / 4', '1')
225 check('5 / 4.0', '1.25')
226 check('5 / ( [string length "abcd"] + 0.0 )', '1.25')
227 check('20.0/5.0', '4.0')
228 check('"0x03" > "2"', '1')
229 check('[string length "a\xc2\xbd\xe2\x82\xac"]', '3')
230 check(r'[string length "a\xbd\u20ac"]', '3')
231 check('"abc"', 'abc')
232 check('"a\xc2\xbd\xe2\x82\xac"', 'a\xc2\xbd\xe2\x82\xac')
233 check(r'"a\xbd\u20ac"', 'a\xc2\xbd\xe2\x82\xac')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200234 check(r'"a\0b"', 'a\xc0\x80b')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200235 if tcl_version >= (8, 5):
236 check('2**64', str(2**64))
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200237
238 def test_exprdouble(self):
239 tcl = self.interp
240 tcl.call('set', 'a', 3)
241 tcl.call('set', 'b', 6)
242 def check(expr, expected):
243 result = tcl.exprdouble(expr)
244 self.assertEqual(result, expected)
245 self.assertIsInstance(result, float)
246
247 self.assertRaises(TypeError, tcl.exprdouble)
248 self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6')
249 self.assertRaises(TclError, tcl.exprdouble, 'spam')
250 check('', 0.0)
251 check('8.2 + 6', 14.2)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200252 check('3.1 + $a', 6.1)
253 check('2 + "$a.$b"', 5.6)
254 check('4*[llength "6 2"]', 8.0)
255 check('{word one} < "word $a"', 0.0)
256 check('4*2 < 7', 0.0)
257 check('hypot($a, 4)', 5.0)
258 check('5 / 4', 1.0)
259 check('5 / 4.0', 1.25)
260 check('5 / ( [string length "abcd"] + 0.0 )', 1.25)
261 check('20.0/5.0', 4.0)
262 check('"0x03" > "2"', 1.0)
263 check('[string length "a\xc2\xbd\xe2\x82\xac"]', 3.0)
264 check(r'[string length "a\xbd\u20ac"]', 3.0)
265 self.assertRaises(TclError, tcl.exprdouble, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200266 if tcl_version >= (8, 5):
267 check('2**64', float(2**64))
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200268
269 def test_exprlong(self):
270 tcl = self.interp
271 tcl.call('set', 'a', 3)
272 tcl.call('set', 'b', 6)
273 def check(expr, expected):
274 result = tcl.exprlong(expr)
275 self.assertEqual(result, expected)
276 self.assertIsInstance(result, int)
277
278 self.assertRaises(TypeError, tcl.exprlong)
279 self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6')
280 self.assertRaises(TclError, tcl.exprlong, 'spam')
281 check('', 0)
282 check('8.2 + 6', 14)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200283 check('3.1 + $a', 6)
284 check('2 + "$a.$b"', 5)
285 check('4*[llength "6 2"]', 8)
286 check('{word one} < "word $a"', 0)
287 check('4*2 < 7', 0)
288 check('hypot($a, 4)', 5)
289 check('5 / 4', 1)
290 check('5 / 4.0', 1)
291 check('5 / ( [string length "abcd"] + 0.0 )', 1)
292 check('20.0/5.0', 4)
293 check('"0x03" > "2"', 1)
294 check('[string length "a\xc2\xbd\xe2\x82\xac"]', 3)
295 check(r'[string length "a\xbd\u20ac"]', 3)
296 self.assertRaises(TclError, tcl.exprlong, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200297 if tcl_version >= (8, 5):
298 self.assertRaises(TclError, tcl.exprlong, '2**64')
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200299
300 def test_exprboolean(self):
301 tcl = self.interp
302 tcl.call('set', 'a', 3)
303 tcl.call('set', 'b', 6)
304 def check(expr, expected):
305 result = tcl.exprboolean(expr)
306 self.assertEqual(result, expected)
307 self.assertIsInstance(result, int)
308 self.assertNotIsInstance(result, bool)
309
310 self.assertRaises(TypeError, tcl.exprboolean)
311 self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6')
312 self.assertRaises(TclError, tcl.exprboolean, 'spam')
313 check('', False)
314 for value in ('0', 'false', 'no', 'off'):
315 check(value, False)
316 check('"%s"' % value, False)
317 check('{%s}' % value, False)
318 for value in ('1', 'true', 'yes', 'on'):
319 check(value, True)
320 check('"%s"' % value, True)
321 check('{%s}' % value, True)
322 check('8.2 + 6', True)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200323 check('3.1 + $a', True)
324 check('2 + "$a.$b"', True)
325 check('4*[llength "6 2"]', True)
326 check('{word one} < "word $a"', False)
327 check('4*2 < 7', False)
328 check('hypot($a, 4)', True)
329 check('5 / 4', True)
330 check('5 / 4.0', True)
331 check('5 / ( [string length "abcd"] + 0.0 )', True)
332 check('20.0/5.0', True)
333 check('"0x03" > "2"', True)
334 check('[string length "a\xc2\xbd\xe2\x82\xac"]', True)
335 check(r'[string length "a\xbd\u20ac"]', True)
336 self.assertRaises(TclError, tcl.exprboolean, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200337 if tcl_version >= (8, 5):
338 check('2**64', True)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200339
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200340 def test_passing_values(self):
341 def passValue(value):
342 return self.interp.call('set', '_', value)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200343
344 self.assertEqual(passValue(True), True if self.wantobjects else '1')
345 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200346 self.assertEqual(passValue('string'), 'string')
347 self.assertEqual(passValue('string\xbd'), 'string\xbd')
348 self.assertEqual(passValue('string\xe2\x82\xac'), u'string\u20ac')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200349 self.assertEqual(passValue(u'string'), u'string')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200350 self.assertEqual(passValue(u'string\xbd'), u'string\xbd')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200351 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200352 self.assertEqual(passValue('str\x00ing'), 'str\x00ing')
353 self.assertEqual(passValue('str\xc0\x80ing'), 'str\x00ing')
354 self.assertEqual(passValue(u'str\x00ing'), u'str\x00ing')
355 self.assertEqual(passValue(u'str\x00ing\xbd'), u'str\x00ing\xbd')
356 self.assertEqual(passValue(u'str\x00ing\u20ac'), u'str\x00ing\u20ac')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200357 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200358 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200359 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200360 sys.float_info.min, sys.float_info.max,
361 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200362 if self.wantobjects:
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200363 self.assertEqual(passValue(f), f)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200364 else:
365 self.assertEqual(float(passValue(f)), f)
366 if self.wantobjects:
367 f = passValue(float('nan'))
368 self.assertNotEqual(f, f)
369 self.assertEqual(passValue(float('inf')), float('inf'))
370 self.assertEqual(passValue(-float('inf')), -float('inf'))
371 else:
372 f = float(passValue(float('nan')))
373 self.assertNotEqual(f, f)
374 self.assertEqual(float(passValue(float('inf'))), float('inf'))
375 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
376 self.assertEqual(passValue((1, '2', (3.4,))),
377 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000378
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200379 def test_user_command(self):
380 result = []
381 def testfunc(arg):
382 result.append(arg)
383 return arg
384 self.interp.createcommand('testfunc', testfunc)
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200385 def check(value, expected, expected2=None, eq=self.assertEqual):
386 if expected2 is None:
387 expected2 = expected
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200388 del result[:]
Serhiy Storchaka83515ec2014-01-23 11:03:02 +0200389 r = self.interp.call('testfunc', value)
390 self.assertEqual(len(result), 1)
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200391 self.assertIsInstance(result[0], (str, unicode))
392 eq(result[0], expected2)
393 self.assertIsInstance(r, (str, unicode))
394 eq(r, expected2)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200395 def float_eq(actual, expected):
Serhiy Storchakaeb7ef942014-01-23 16:08:35 +0200396 expected = float(expected)
397 self.assertAlmostEqual(float(actual), expected,
398 delta=abs(expected) * 1e-10)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200399 def nan_eq(actual, expected):
400 actual = float(actual)
401 self.assertNotEqual(actual, actual)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200402
403 check(True, '1')
404 check(False, '0')
405 check('string', 'string')
406 check('string\xbd', 'string\xbd')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200407 check('string\xe2\x82\xac', 'string\xe2\x82\xac', u'string\u20ac')
408 check(u'string', u'string')
409 check(u'string\xbd', 'string\xc2\xbd', u'string\xbd')
410 check(u'string\u20ac', 'string\xe2\x82\xac', u'string\u20ac')
411 check('str\xc0\x80ing', 'str\xc0\x80ing', u'str\x00ing')
412 check('str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
413 check(u'str\x00ing', 'str\xc0\x80ing', u'str\x00ing')
414 check(u'str\x00ing\xbd', 'str\xc0\x80ing\xc2\xbd', u'str\x00ing\xbd')
415 check(u'str\x00ing\u20ac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200416 for i in (0, 1, -1, 2**31-1, -2**31):
417 check(i, str(i))
Serhiy Storchakadc976672014-01-23 14:38:44 +0200418 for f in (0.0, 1.0, -1.0):
419 check(f, repr(f))
420 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200421 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakadc976672014-01-23 14:38:44 +0200422 check(f, f, eq=float_eq)
423 check(float('inf'), 'Inf', eq=float_eq)
424 check(-float('inf'), '-Inf', eq=float_eq)
425 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200426 check((), '')
427 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
428
Serhiy Storchakafab65422013-07-11 20:32:48 +0300429 def test_splitlist(self):
430 splitlist = self.interp.tk.splitlist
431 call = self.interp.tk.call
432 self.assertRaises(TypeError, splitlist)
433 self.assertRaises(TypeError, splitlist, 'a', 'b')
434 self.assertRaises(TypeError, splitlist, 2)
435 testcases = [
436 ('2', ('2',)),
437 ('', ()),
438 ('{}', ('',)),
439 ('""', ('',)),
440 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
441 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
442 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
443 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200444 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300445 ('a {b c}', ('a', 'b c')),
446 (r'a b\ c', ('a', 'b c')),
447 (('a', 'b c'), ('a', 'b c')),
448 ('a 2', ('a', '2')),
449 (('a', 2), ('a', 2)),
450 ('a 3.4', ('a', '3.4')),
451 (('a', 3.4), ('a', 3.4)),
452 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200453 (call('list', 1, '2', (3.4,)),
454 (1, '2', (3.4,)) if self.wantobjects else
455 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300456 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300457 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200458 if not self.wantobjects:
459 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
460 elif get_tk_patchlevel() < (8, 5, 5):
461 # Before 8.5.5 dicts were converted to lists through string
462 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
463 else:
464 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300465 testcases += [
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200466 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
467 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300468 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300469 for arg, res in testcases:
470 self.assertEqual(splitlist(arg), res)
471 self.assertRaises(TclError, splitlist, '{')
472
473 def test_split(self):
474 split = self.interp.tk.split
475 call = self.interp.tk.call
476 self.assertRaises(TypeError, split)
477 self.assertRaises(TypeError, split, 'a', 'b')
478 self.assertRaises(TypeError, split, 2)
479 testcases = [
480 ('2', '2'),
481 ('', ''),
482 ('{}', ''),
483 ('""', ''),
484 ('{', '{'),
485 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
486 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
487 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
488 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200489 ('a\xc0\x80b', 'a\xc0\x80b'),
490 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300491 ('a {b c}', ('a', ('b', 'c'))),
492 (r'a b\ c', ('a', ('b', 'c'))),
493 (('a', 'b c'), ('a', ('b', 'c'))),
494 (('a', u'b c'), ('a', ('b', 'c'))),
495 ('a 2', ('a', '2')),
496 (('a', 2), ('a', 2)),
497 ('a 3.4', ('a', '3.4')),
498 (('a', 3.4), ('a', 3.4)),
499 (('a', (2, 3.4)), ('a', (2, 3.4))),
500 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200501 (call('list', 1, '2', (3.4,)),
502 (1, '2', (3.4,)) if self.wantobjects else
503 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300504 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300505 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200506 if not self.wantobjects:
507 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
508 elif get_tk_patchlevel() < (8, 5, 5):
509 # Before 8.5.5 dicts were converted to lists through string
510 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
511 else:
512 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300513 testcases += [
514 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200515 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300516 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300517 for arg, res in testcases:
518 self.assertEqual(split(arg), res)
519
Neal Norwitz63dfece2004-02-19 02:37:29 +0000520
Serhiy Storchaka42035702013-08-21 21:46:12 +0300521class BigmemTclTest(unittest.TestCase):
522
523 def setUp(self):
524 self.interp = Tcl()
525
526 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
527 "needs UINT_MAX < SIZE_MAX")
528 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
529 dry_run=False)
530 def test_huge_string(self, size):
531 value = ' ' * size
532 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
533
534
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200535def setUpModule():
536 if test_support.verbose:
537 tcl = Tcl()
538 print 'patchlevel =', tcl.call('info', 'patchlevel')
539
540
Neal Norwitz63dfece2004-02-19 02:37:29 +0000541def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300542 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000543
David Aschere2b4b322004-02-18 05:59:53 +0000544if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000545 test_main()