blob: 6fa73d144fdf1677d7248a93bc1697eb52a293f4 [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
Neal Norwitz63dfece2004-02-19 02:37:29 +00004from test import test_support
Ezio Melotti794e5572013-05-07 09:34:49 +03005from subprocess import Popen, PIPE
R. David Murray597ebab2009-03-31 18:32:17 +00006
7# Skip this test if the _tkinter module wasn't built.
8_tkinter = test_support.import_module('_tkinter')
9
Guilherme Polo8e5e4382009-02-07 02:20:29 +000010from Tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000011from _tkinter import TclError
12
Serhiy Storchaka76249ea2014-02-07 10:06:05 +020013try:
14 from _testcapi import INT_MAX, PY_SSIZE_T_MAX
15except ImportError:
16 INT_MAX = PY_SSIZE_T_MAX = sys.maxsize
17
Serhiy Storchaka94025332013-09-08 20:32:56 +030018tcl_version = _tkinter.TCL_VERSION.split('.')
19try:
20 for i in range(len(tcl_version)):
21 tcl_version[i] = int(tcl_version[i])
22except ValueError:
23 pass
24tcl_version = tuple(tcl_version)
25
Serhiy Storchaka15b67d72014-02-02 23:04:06 +020026_tk_patchlevel = None
27def get_tk_patchlevel():
28 global _tk_patchlevel
29 if _tk_patchlevel is None:
30 tcl = Tcl()
31 patchlevel = []
32 for x in tcl.call('info', 'patchlevel').split('.'):
33 try:
34 x = int(x, 10)
35 except ValueError:
36 x = -1
37 patchlevel.append(x)
38 _tk_patchlevel = tuple(patchlevel)
39 return _tk_patchlevel
40
Benjamin Petersonb3619be2009-01-30 02:24:39 +000041
42class TkinterTest(unittest.TestCase):
43
44 def testFlattenLen(self):
45 # flatten(<object with no length>)
46 self.assertRaises(TypeError, _tkinter._flatten, True)
47
48
David Aschere2b4b322004-02-18 05:59:53 +000049class TclTest(unittest.TestCase):
50
51 def setUp(self):
52 self.interp = Tcl()
Serhiy Storchaka5542b152013-12-25 17:28:50 +020053 self.wantobjects = self.interp.tk.wantobjects()
David Aschere2b4b322004-02-18 05:59:53 +000054
55 def testEval(self):
56 tcl = self.interp
57 tcl.eval('set a 1')
58 self.assertEqual(tcl.eval('set a'),'1')
59
60 def testEvalException(self):
61 tcl = self.interp
62 self.assertRaises(TclError,tcl.eval,'set a')
63
64 def testEvalException2(self):
65 tcl = self.interp
66 self.assertRaises(TclError,tcl.eval,'this is wrong')
67
68 def testCall(self):
69 tcl = self.interp
70 tcl.call('set','a','1')
71 self.assertEqual(tcl.call('set','a'),'1')
72
73 def testCallException(self):
74 tcl = self.interp
75 self.assertRaises(TclError,tcl.call,'set','a')
76
77 def testCallException2(self):
78 tcl = self.interp
79 self.assertRaises(TclError,tcl.call,'this','is','wrong')
80
81 def testSetVar(self):
82 tcl = self.interp
83 tcl.setvar('a','1')
84 self.assertEqual(tcl.eval('set a'),'1')
85
86 def testSetVarArray(self):
87 tcl = self.interp
88 tcl.setvar('a(1)','1')
89 self.assertEqual(tcl.eval('set a(1)'),'1')
90
91 def testGetVar(self):
92 tcl = self.interp
93 tcl.eval('set a 1')
94 self.assertEqual(tcl.getvar('a'),'1')
95
96 def testGetVarArray(self):
97 tcl = self.interp
98 tcl.eval('set a(1) 1')
99 self.assertEqual(tcl.getvar('a(1)'),'1')
100
101 def testGetVarException(self):
102 tcl = self.interp
103 self.assertRaises(TclError,tcl.getvar,'a')
104
105 def testGetVarArrayException(self):
106 tcl = self.interp
107 self.assertRaises(TclError,tcl.getvar,'a(1)')
108
109 def testUnsetVar(self):
110 tcl = self.interp
111 tcl.setvar('a',1)
112 self.assertEqual(tcl.eval('info exists a'),'1')
113 tcl.unsetvar('a')
114 self.assertEqual(tcl.eval('info exists a'),'0')
115
116 def testUnsetVarArray(self):
117 tcl = self.interp
118 tcl.setvar('a(1)',1)
119 tcl.setvar('a(2)',2)
120 self.assertEqual(tcl.eval('info exists a(1)'),'1')
121 self.assertEqual(tcl.eval('info exists a(2)'),'1')
122 tcl.unsetvar('a(1)')
123 self.assertEqual(tcl.eval('info exists a(1)'),'0')
124 self.assertEqual(tcl.eval('info exists a(2)'),'1')
125
126 def testUnsetVarException(self):
127 tcl = self.interp
128 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000129
David Aschere2b4b322004-02-18 05:59:53 +0000130 def testEvalFile(self):
131 tcl = self.interp
132 filename = "testEvalFile.tcl"
133 fd = open(filename,'w')
134 script = """set a 1
135 set b 2
136 set c [ expr $a + $b ]
137 """
138 fd.write(script)
139 fd.close()
140 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000141 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000142 self.assertEqual(tcl.eval('set a'),'1')
143 self.assertEqual(tcl.eval('set b'),'2')
144 self.assertEqual(tcl.eval('set c'),'3')
145
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200146 def test_evalfile_null_in_result(self):
147 tcl = self.interp
148 with open(test_support.TESTFN, 'wb') as f:
149 self.addCleanup(test_support.unlink, test_support.TESTFN)
150 f.write("""
151 set a "a\0b"
152 set b "a\\0b"
153 """)
154 tcl.evalfile(test_support.TESTFN)
155 self.assertEqual(tcl.eval('set a'), 'a\xc0\x80b')
156 self.assertEqual(tcl.eval('set b'), 'a\xc0\x80b')
157
David Aschere2b4b322004-02-18 05:59:53 +0000158 def testEvalFileException(self):
159 tcl = self.interp
160 filename = "doesnotexists"
161 try:
162 os.remove(filename)
163 except Exception,e:
164 pass
165 self.assertRaises(TclError,tcl.evalfile,filename)
166
David Aschere2b4b322004-02-18 05:59:53 +0000167 def testPackageRequireException(self):
168 tcl = self.interp
169 self.assertRaises(TclError,tcl.eval,'package require DNE')
170
Zachary Ware57d35c62013-11-03 22:51:25 -0600171 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000172 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000173 # Build a UNC path from the regular path.
174 # Something like
175 # \\%COMPUTERNAME%\c$\python27\python.exe
176
177 fullname = os.path.abspath(sys.executable)
178 if fullname[1] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600179 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000180 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
181 fullname[0],
182 fullname[3:])
183
184 with test_support.EnvironmentVarGuard() as env:
185 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300186 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000187
Zachary Ware57d35c62013-11-03 22:51:25 -0600188 try:
189 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
190 except WindowsError as e:
191 if e.winerror == 5:
192 self.skipTest('Not permitted to start the child process')
193 else:
194 raise
195
Ezio Melotti794e5572013-05-07 09:34:49 +0300196 out_data, err_data = p.communicate()
197
198 msg = '\n\n'.join(['"Tkinter.py" not in output',
199 'Command:', cmd,
200 'stdout:', out_data,
201 'stderr:', err_data])
202
203 self.assertIn('Tkinter.py', out_data, msg)
204
205 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
206
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000207
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200208 def test_exprstring(self):
209 tcl = self.interp
210 tcl.call('set', 'a', 3)
211 tcl.call('set', 'b', 6)
212 def check(expr, expected):
213 result = tcl.exprstring(expr)
214 self.assertEqual(result, expected)
215 self.assertIsInstance(result, str)
216
217 self.assertRaises(TypeError, tcl.exprstring)
218 self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6')
219 self.assertRaises(TclError, tcl.exprstring, 'spam')
220 check('', '0')
221 check('8.2 + 6', '14.2')
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200222 check('3.1 + $a', '6.1')
223 check('2 + "$a.$b"', '5.6')
224 check('4*[llength "6 2"]', '8')
225 check('{word one} < "word $a"', '0')
226 check('4*2 < 7', '0')
227 check('hypot($a, 4)', '5.0')
228 check('5 / 4', '1')
229 check('5 / 4.0', '1.25')
230 check('5 / ( [string length "abcd"] + 0.0 )', '1.25')
231 check('20.0/5.0', '4.0')
232 check('"0x03" > "2"', '1')
233 check('[string length "a\xc2\xbd\xe2\x82\xac"]', '3')
234 check(r'[string length "a\xbd\u20ac"]', '3')
235 check('"abc"', 'abc')
236 check('"a\xc2\xbd\xe2\x82\xac"', 'a\xc2\xbd\xe2\x82\xac')
237 check(r'"a\xbd\u20ac"', 'a\xc2\xbd\xe2\x82\xac')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200238 check(r'"a\0b"', 'a\xc0\x80b')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200239 if tcl_version >= (8, 5):
240 check('2**64', str(2**64))
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200241
242 def test_exprdouble(self):
243 tcl = self.interp
244 tcl.call('set', 'a', 3)
245 tcl.call('set', 'b', 6)
246 def check(expr, expected):
247 result = tcl.exprdouble(expr)
248 self.assertEqual(result, expected)
249 self.assertIsInstance(result, float)
250
251 self.assertRaises(TypeError, tcl.exprdouble)
252 self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6')
253 self.assertRaises(TclError, tcl.exprdouble, 'spam')
254 check('', 0.0)
255 check('8.2 + 6', 14.2)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200256 check('3.1 + $a', 6.1)
257 check('2 + "$a.$b"', 5.6)
258 check('4*[llength "6 2"]', 8.0)
259 check('{word one} < "word $a"', 0.0)
260 check('4*2 < 7', 0.0)
261 check('hypot($a, 4)', 5.0)
262 check('5 / 4', 1.0)
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.0)
267 check('[string length "a\xc2\xbd\xe2\x82\xac"]', 3.0)
268 check(r'[string length "a\xbd\u20ac"]', 3.0)
269 self.assertRaises(TclError, tcl.exprdouble, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200270 if tcl_version >= (8, 5):
271 check('2**64', float(2**64))
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200272
273 def test_exprlong(self):
274 tcl = self.interp
275 tcl.call('set', 'a', 3)
276 tcl.call('set', 'b', 6)
277 def check(expr, expected):
278 result = tcl.exprlong(expr)
279 self.assertEqual(result, expected)
280 self.assertIsInstance(result, int)
281
282 self.assertRaises(TypeError, tcl.exprlong)
283 self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6')
284 self.assertRaises(TclError, tcl.exprlong, 'spam')
285 check('', 0)
286 check('8.2 + 6', 14)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200287 check('3.1 + $a', 6)
288 check('2 + "$a.$b"', 5)
289 check('4*[llength "6 2"]', 8)
290 check('{word one} < "word $a"', 0)
291 check('4*2 < 7', 0)
292 check('hypot($a, 4)', 5)
293 check('5 / 4', 1)
294 check('5 / 4.0', 1)
295 check('5 / ( [string length "abcd"] + 0.0 )', 1)
296 check('20.0/5.0', 4)
297 check('"0x03" > "2"', 1)
298 check('[string length "a\xc2\xbd\xe2\x82\xac"]', 3)
299 check(r'[string length "a\xbd\u20ac"]', 3)
300 self.assertRaises(TclError, tcl.exprlong, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200301 if tcl_version >= (8, 5):
302 self.assertRaises(TclError, tcl.exprlong, '2**64')
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200303
304 def test_exprboolean(self):
305 tcl = self.interp
306 tcl.call('set', 'a', 3)
307 tcl.call('set', 'b', 6)
308 def check(expr, expected):
309 result = tcl.exprboolean(expr)
310 self.assertEqual(result, expected)
311 self.assertIsInstance(result, int)
312 self.assertNotIsInstance(result, bool)
313
314 self.assertRaises(TypeError, tcl.exprboolean)
315 self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6')
316 self.assertRaises(TclError, tcl.exprboolean, 'spam')
317 check('', False)
318 for value in ('0', 'false', 'no', 'off'):
319 check(value, False)
320 check('"%s"' % value, False)
321 check('{%s}' % value, False)
322 for value in ('1', 'true', 'yes', 'on'):
323 check(value, True)
324 check('"%s"' % value, True)
325 check('{%s}' % value, True)
326 check('8.2 + 6', True)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200327 check('3.1 + $a', True)
328 check('2 + "$a.$b"', True)
329 check('4*[llength "6 2"]', True)
330 check('{word one} < "word $a"', False)
331 check('4*2 < 7', False)
332 check('hypot($a, 4)', True)
333 check('5 / 4', True)
334 check('5 / 4.0', True)
335 check('5 / ( [string length "abcd"] + 0.0 )', True)
336 check('20.0/5.0', True)
337 check('"0x03" > "2"', True)
338 check('[string length "a\xc2\xbd\xe2\x82\xac"]', True)
339 check(r'[string length "a\xbd\u20ac"]', True)
340 self.assertRaises(TclError, tcl.exprboolean, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200341 if tcl_version >= (8, 5):
342 check('2**64', True)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200343
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200344 def test_passing_values(self):
345 def passValue(value):
346 return self.interp.call('set', '_', value)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200347
348 self.assertEqual(passValue(True), True if self.wantobjects else '1')
349 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200350 self.assertEqual(passValue('string'), 'string')
351 self.assertEqual(passValue('string\xbd'), 'string\xbd')
352 self.assertEqual(passValue('string\xe2\x82\xac'), u'string\u20ac')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200353 self.assertEqual(passValue(u'string'), u'string')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200354 self.assertEqual(passValue(u'string\xbd'), u'string\xbd')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200355 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200356 self.assertEqual(passValue('str\x00ing'), 'str\x00ing')
357 self.assertEqual(passValue('str\xc0\x80ing'), 'str\x00ing')
358 self.assertEqual(passValue(u'str\x00ing'), u'str\x00ing')
359 self.assertEqual(passValue(u'str\x00ing\xbd'), u'str\x00ing\xbd')
360 self.assertEqual(passValue(u'str\x00ing\u20ac'), u'str\x00ing\u20ac')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200361 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200362 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200363 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200364 sys.float_info.min, sys.float_info.max,
365 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200366 if self.wantobjects:
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200367 self.assertEqual(passValue(f), f)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200368 else:
369 self.assertEqual(float(passValue(f)), f)
370 if self.wantobjects:
371 f = passValue(float('nan'))
372 self.assertNotEqual(f, f)
373 self.assertEqual(passValue(float('inf')), float('inf'))
374 self.assertEqual(passValue(-float('inf')), -float('inf'))
375 else:
376 f = float(passValue(float('nan')))
377 self.assertNotEqual(f, f)
378 self.assertEqual(float(passValue(float('inf'))), float('inf'))
379 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
380 self.assertEqual(passValue((1, '2', (3.4,))),
381 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000382
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200383 def test_user_command(self):
384 result = []
385 def testfunc(arg):
386 result.append(arg)
387 return arg
388 self.interp.createcommand('testfunc', testfunc)
Antoine Pitrouaa73ea02014-02-23 19:39:06 +0100389 self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200390 def check(value, expected, expected2=None, eq=self.assertEqual):
391 if expected2 is None:
392 expected2 = expected
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200393 del result[:]
Serhiy Storchaka83515ec2014-01-23 11:03:02 +0200394 r = self.interp.call('testfunc', value)
395 self.assertEqual(len(result), 1)
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200396 self.assertIsInstance(result[0], (str, unicode))
397 eq(result[0], expected2)
398 self.assertIsInstance(r, (str, unicode))
399 eq(r, expected2)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200400 def float_eq(actual, expected):
Serhiy Storchakaeb7ef942014-01-23 16:08:35 +0200401 expected = float(expected)
402 self.assertAlmostEqual(float(actual), expected,
403 delta=abs(expected) * 1e-10)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200404 def nan_eq(actual, expected):
405 actual = float(actual)
406 self.assertNotEqual(actual, actual)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200407
408 check(True, '1')
409 check(False, '0')
410 check('string', 'string')
411 check('string\xbd', 'string\xbd')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200412 check('string\xe2\x82\xac', 'string\xe2\x82\xac', u'string\u20ac')
413 check(u'string', u'string')
414 check(u'string\xbd', 'string\xc2\xbd', u'string\xbd')
415 check(u'string\u20ac', 'string\xe2\x82\xac', u'string\u20ac')
416 check('str\xc0\x80ing', 'str\xc0\x80ing', u'str\x00ing')
417 check('str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
418 check(u'str\x00ing', 'str\xc0\x80ing', u'str\x00ing')
419 check(u'str\x00ing\xbd', 'str\xc0\x80ing\xc2\xbd', u'str\x00ing\xbd')
420 check(u'str\x00ing\u20ac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200421 for i in (0, 1, -1, 2**31-1, -2**31):
422 check(i, str(i))
Serhiy Storchakadc976672014-01-23 14:38:44 +0200423 for f in (0.0, 1.0, -1.0):
424 check(f, repr(f))
425 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200426 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakadc976672014-01-23 14:38:44 +0200427 check(f, f, eq=float_eq)
428 check(float('inf'), 'Inf', eq=float_eq)
429 check(-float('inf'), '-Inf', eq=float_eq)
430 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200431 check((), '')
432 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
433
Serhiy Storchakafab65422013-07-11 20:32:48 +0300434 def test_splitlist(self):
435 splitlist = self.interp.tk.splitlist
436 call = self.interp.tk.call
437 self.assertRaises(TypeError, splitlist)
438 self.assertRaises(TypeError, splitlist, 'a', 'b')
439 self.assertRaises(TypeError, splitlist, 2)
440 testcases = [
441 ('2', ('2',)),
442 ('', ()),
443 ('{}', ('',)),
444 ('""', ('',)),
445 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
446 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
447 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
448 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200449 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300450 ('a {b c}', ('a', 'b c')),
451 (r'a b\ c', ('a', 'b c')),
452 (('a', 'b c'), ('a', 'b c')),
453 ('a 2', ('a', '2')),
454 (('a', 2), ('a', 2)),
455 ('a 3.4', ('a', '3.4')),
456 (('a', 3.4), ('a', 3.4)),
457 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200458 (call('list', 1, '2', (3.4,)),
459 (1, '2', (3.4,)) if self.wantobjects else
460 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300461 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300462 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200463 if not self.wantobjects:
464 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
465 elif get_tk_patchlevel() < (8, 5, 5):
466 # Before 8.5.5 dicts were converted to lists through string
467 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
468 else:
469 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300470 testcases += [
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200471 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
472 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300473 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300474 for arg, res in testcases:
475 self.assertEqual(splitlist(arg), res)
476 self.assertRaises(TclError, splitlist, '{')
477
478 def test_split(self):
479 split = self.interp.tk.split
480 call = self.interp.tk.call
481 self.assertRaises(TypeError, split)
482 self.assertRaises(TypeError, split, 'a', 'b')
483 self.assertRaises(TypeError, split, 2)
484 testcases = [
485 ('2', '2'),
486 ('', ''),
487 ('{}', ''),
488 ('""', ''),
489 ('{', '{'),
490 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
491 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
492 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
493 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200494 ('a\xc0\x80b', 'a\xc0\x80b'),
495 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300496 ('a {b c}', ('a', ('b', 'c'))),
497 (r'a b\ c', ('a', ('b', 'c'))),
498 (('a', 'b c'), ('a', ('b', 'c'))),
499 (('a', u'b c'), ('a', ('b', 'c'))),
500 ('a 2', ('a', '2')),
501 (('a', 2), ('a', 2)),
502 ('a 3.4', ('a', '3.4')),
503 (('a', 3.4), ('a', 3.4)),
504 (('a', (2, 3.4)), ('a', (2, 3.4))),
505 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200506 (call('list', 1, '2', (3.4,)),
507 (1, '2', (3.4,)) if self.wantobjects else
508 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300509 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300510 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200511 if not self.wantobjects:
512 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
513 elif get_tk_patchlevel() < (8, 5, 5):
514 # Before 8.5.5 dicts were converted to lists through string
515 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
516 else:
517 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300518 testcases += [
519 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200520 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300521 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300522 for arg, res in testcases:
523 self.assertEqual(split(arg), res)
524
Neal Norwitz63dfece2004-02-19 02:37:29 +0000525
Serhiy Storchaka42035702013-08-21 21:46:12 +0300526class BigmemTclTest(unittest.TestCase):
527
528 def setUp(self):
529 self.interp = Tcl()
530
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200531 @test_support.cpython_only
532 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
533 @test_support.precisionbigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka42035702013-08-21 21:46:12 +0300534 def test_huge_string(self, size):
535 value = ' ' * size
536 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
537
538
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200539def setUpModule():
540 if test_support.verbose:
541 tcl = Tcl()
542 print 'patchlevel =', tcl.call('info', 'patchlevel')
543
544
Neal Norwitz63dfece2004-02-19 02:37:29 +0000545def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300546 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000547
David Aschere2b4b322004-02-18 05:59:53 +0000548if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000549 test_main()