blob: a6e95e5718f2b29b0d4d6bbacfcd0fe510d44e8d [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)
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200389 def check(value, expected, expected2=None, eq=self.assertEqual):
390 if expected2 is None:
391 expected2 = expected
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200392 del result[:]
Serhiy Storchaka83515ec2014-01-23 11:03:02 +0200393 r = self.interp.call('testfunc', value)
394 self.assertEqual(len(result), 1)
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200395 self.assertIsInstance(result[0], (str, unicode))
396 eq(result[0], expected2)
397 self.assertIsInstance(r, (str, unicode))
398 eq(r, expected2)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200399 def float_eq(actual, expected):
Serhiy Storchakaeb7ef942014-01-23 16:08:35 +0200400 expected = float(expected)
401 self.assertAlmostEqual(float(actual), expected,
402 delta=abs(expected) * 1e-10)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200403 def nan_eq(actual, expected):
404 actual = float(actual)
405 self.assertNotEqual(actual, actual)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200406
407 check(True, '1')
408 check(False, '0')
409 check('string', 'string')
410 check('string\xbd', 'string\xbd')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200411 check('string\xe2\x82\xac', 'string\xe2\x82\xac', u'string\u20ac')
412 check(u'string', u'string')
413 check(u'string\xbd', 'string\xc2\xbd', u'string\xbd')
414 check(u'string\u20ac', 'string\xe2\x82\xac', u'string\u20ac')
415 check('str\xc0\x80ing', 'str\xc0\x80ing', u'str\x00ing')
416 check('str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
417 check(u'str\x00ing', 'str\xc0\x80ing', u'str\x00ing')
418 check(u'str\x00ing\xbd', 'str\xc0\x80ing\xc2\xbd', u'str\x00ing\xbd')
419 check(u'str\x00ing\u20ac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200420 for i in (0, 1, -1, 2**31-1, -2**31):
421 check(i, str(i))
Serhiy Storchakadc976672014-01-23 14:38:44 +0200422 for f in (0.0, 1.0, -1.0):
423 check(f, repr(f))
424 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200425 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakadc976672014-01-23 14:38:44 +0200426 check(f, f, eq=float_eq)
427 check(float('inf'), 'Inf', eq=float_eq)
428 check(-float('inf'), '-Inf', eq=float_eq)
429 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200430 check((), '')
431 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
432
Serhiy Storchakafab65422013-07-11 20:32:48 +0300433 def test_splitlist(self):
434 splitlist = self.interp.tk.splitlist
435 call = self.interp.tk.call
436 self.assertRaises(TypeError, splitlist)
437 self.assertRaises(TypeError, splitlist, 'a', 'b')
438 self.assertRaises(TypeError, splitlist, 2)
439 testcases = [
440 ('2', ('2',)),
441 ('', ()),
442 ('{}', ('',)),
443 ('""', ('',)),
444 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
445 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
446 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
447 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200448 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300449 ('a {b c}', ('a', 'b c')),
450 (r'a b\ c', ('a', 'b c')),
451 (('a', 'b c'), ('a', 'b c')),
452 ('a 2', ('a', '2')),
453 (('a', 2), ('a', 2)),
454 ('a 3.4', ('a', '3.4')),
455 (('a', 3.4), ('a', 3.4)),
456 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200457 (call('list', 1, '2', (3.4,)),
458 (1, '2', (3.4,)) if self.wantobjects else
459 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300460 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300461 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200462 if not self.wantobjects:
463 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
464 elif get_tk_patchlevel() < (8, 5, 5):
465 # Before 8.5.5 dicts were converted to lists through string
466 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
467 else:
468 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300469 testcases += [
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200470 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
471 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300472 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300473 for arg, res in testcases:
474 self.assertEqual(splitlist(arg), res)
475 self.assertRaises(TclError, splitlist, '{')
476
477 def test_split(self):
478 split = self.interp.tk.split
479 call = self.interp.tk.call
480 self.assertRaises(TypeError, split)
481 self.assertRaises(TypeError, split, 'a', 'b')
482 self.assertRaises(TypeError, split, 2)
483 testcases = [
484 ('2', '2'),
485 ('', ''),
486 ('{}', ''),
487 ('""', ''),
488 ('{', '{'),
489 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
490 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
491 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
492 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200493 ('a\xc0\x80b', 'a\xc0\x80b'),
494 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300495 ('a {b c}', ('a', ('b', 'c'))),
496 (r'a b\ c', ('a', ('b', 'c'))),
497 (('a', 'b c'), ('a', ('b', 'c'))),
498 (('a', u'b c'), ('a', ('b', 'c'))),
499 ('a 2', ('a', '2')),
500 (('a', 2), ('a', 2)),
501 ('a 3.4', ('a', '3.4')),
502 (('a', 3.4), ('a', 3.4)),
503 (('a', (2, 3.4)), ('a', (2, 3.4))),
504 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200505 (call('list', 1, '2', (3.4,)),
506 (1, '2', (3.4,)) if self.wantobjects else
507 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300508 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300509 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200510 if not self.wantobjects:
511 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
512 elif get_tk_patchlevel() < (8, 5, 5):
513 # Before 8.5.5 dicts were converted to lists through string
514 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
515 else:
516 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300517 testcases += [
518 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200519 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300520 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300521 for arg, res in testcases:
522 self.assertEqual(split(arg), res)
523
Neal Norwitz63dfece2004-02-19 02:37:29 +0000524
Serhiy Storchaka42035702013-08-21 21:46:12 +0300525class BigmemTclTest(unittest.TestCase):
526
527 def setUp(self):
528 self.interp = Tcl()
529
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200530 @test_support.cpython_only
531 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
532 @test_support.precisionbigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka42035702013-08-21 21:46:12 +0300533 def test_huge_string(self, size):
534 value = ' ' * size
535 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
536
537
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200538def setUpModule():
539 if test_support.verbose:
540 tcl = Tcl()
541 print 'patchlevel =', tcl.call('info', 'patchlevel')
542
543
Neal Norwitz63dfece2004-02-19 02:37:29 +0000544def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300545 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000546
David Aschere2b4b322004-02-18 05:59:53 +0000547if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000548 test_main()