blob: 91fb28f094bf8aeaf916240c9cdda1dfed711166 [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
Serhiy Storchakad11e8b62014-05-30 14:07:20 +0300130 def test_getint(self):
131 tcl = self.interp.tk
132 self.assertEqual(tcl.getint(' 42 '), 42)
133 self.assertEqual(tcl.getint(42), 42)
134 self.assertRaises(TypeError, tcl.getint)
135 self.assertRaises(TypeError, tcl.getint, '42', '10')
136 self.assertRaises(TypeError, tcl.getint, 42.0)
137 self.assertRaises(TclError, tcl.getint, 'a')
138 self.assertRaises((TypeError, ValueError, TclError),
139 tcl.getint, '42\0')
140 if test_support.have_unicode:
141 self.assertEqual(tcl.getint(unicode('42')), 42)
142 self.assertRaises((UnicodeEncodeError, ValueError, TclError),
143 tcl.getint, '42' + unichr(0xd800))
144
145 def test_getdouble(self):
146 tcl = self.interp.tk
147 self.assertEqual(tcl.getdouble(' 42 '), 42.0)
148 self.assertEqual(tcl.getdouble(' 42.5 '), 42.5)
149 self.assertEqual(tcl.getdouble(42.5), 42.5)
150 self.assertRaises(TypeError, tcl.getdouble)
151 self.assertRaises(TypeError, tcl.getdouble, '42.5', '10')
152 self.assertRaises(TypeError, tcl.getdouble, 42)
153 self.assertRaises(TclError, tcl.getdouble, 'a')
154 self.assertRaises((TypeError, ValueError, TclError),
155 tcl.getdouble, '42.5\0')
156 if test_support.have_unicode:
157 self.assertEqual(tcl.getdouble(unicode('42.5')), 42.5)
158 self.assertRaises((UnicodeEncodeError, ValueError, TclError),
159 tcl.getdouble, '42.5' + unichr(0xd800))
160
161 def test_getboolean(self):
162 tcl = self.interp.tk
163 self.assertIs(tcl.getboolean('on'), True)
164 self.assertIs(tcl.getboolean('1'), True)
165 self.assertEqual(tcl.getboolean(42), 42)
166 self.assertRaises(TypeError, tcl.getboolean)
167 self.assertRaises(TypeError, tcl.getboolean, 'on', '1')
168 self.assertRaises(TypeError, tcl.getboolean, 1.0)
169 self.assertRaises(TclError, tcl.getboolean, 'a')
170 self.assertRaises((TypeError, ValueError, TclError),
171 tcl.getboolean, 'on\0')
172 if test_support.have_unicode:
173 self.assertIs(tcl.getboolean(unicode('on')), True)
174 self.assertRaises((UnicodeEncodeError, ValueError, TclError),
175 tcl.getboolean, 'on' + unichr(0xd800))
176
David Aschere2b4b322004-02-18 05:59:53 +0000177 def testEvalFile(self):
178 tcl = self.interp
179 filename = "testEvalFile.tcl"
180 fd = open(filename,'w')
181 script = """set a 1
182 set b 2
183 set c [ expr $a + $b ]
184 """
185 fd.write(script)
186 fd.close()
187 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000188 os.remove(filename)
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 Storchakaccffb252014-02-03 21:23:46 +0200193 def test_evalfile_null_in_result(self):
194 tcl = self.interp
195 with open(test_support.TESTFN, 'wb') as f:
196 self.addCleanup(test_support.unlink, test_support.TESTFN)
197 f.write("""
198 set a "a\0b"
199 set b "a\\0b"
200 """)
201 tcl.evalfile(test_support.TESTFN)
202 self.assertEqual(tcl.eval('set a'), 'a\xc0\x80b')
203 self.assertEqual(tcl.eval('set b'), 'a\xc0\x80b')
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)
210 except Exception,e:
211 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
Zachary Ware57d35c62013-11-03 22:51:25 -0600218 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000219 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +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] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600226 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000227 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
228 fullname[0],
229 fullname[3:])
230
231 with test_support.EnvironmentVarGuard() as env:
232 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300233 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000234
Zachary Ware57d35c62013-11-03 22:51:25 -0600235 try:
236 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
237 except WindowsError as e:
238 if e.winerror == 5:
239 self.skipTest('Not permitted to start the child process')
240 else:
241 raise
242
Ezio Melotti794e5572013-05-07 09:34:49 +0300243 out_data, err_data = p.communicate()
244
245 msg = '\n\n'.join(['"Tkinter.py" not in output',
246 'Command:', cmd,
247 'stdout:', out_data,
248 'stderr:', err_data])
249
250 self.assertIn('Tkinter.py', out_data, msg)
251
252 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
253
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000254
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200255 def test_exprstring(self):
256 tcl = self.interp
257 tcl.call('set', 'a', 3)
258 tcl.call('set', 'b', 6)
259 def check(expr, expected):
260 result = tcl.exprstring(expr)
261 self.assertEqual(result, expected)
262 self.assertIsInstance(result, str)
263
264 self.assertRaises(TypeError, tcl.exprstring)
265 self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6')
266 self.assertRaises(TclError, tcl.exprstring, 'spam')
267 check('', '0')
268 check('8.2 + 6', '14.2')
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200269 check('3.1 + $a', '6.1')
270 check('2 + "$a.$b"', '5.6')
271 check('4*[llength "6 2"]', '8')
272 check('{word one} < "word $a"', '0')
273 check('4*2 < 7', '0')
274 check('hypot($a, 4)', '5.0')
275 check('5 / 4', '1')
276 check('5 / 4.0', '1.25')
277 check('5 / ( [string length "abcd"] + 0.0 )', '1.25')
278 check('20.0/5.0', '4.0')
279 check('"0x03" > "2"', '1')
280 check('[string length "a\xc2\xbd\xe2\x82\xac"]', '3')
281 check(r'[string length "a\xbd\u20ac"]', '3')
282 check('"abc"', 'abc')
283 check('"a\xc2\xbd\xe2\x82\xac"', 'a\xc2\xbd\xe2\x82\xac')
284 check(r'"a\xbd\u20ac"', 'a\xc2\xbd\xe2\x82\xac')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200285 check(r'"a\0b"', 'a\xc0\x80b')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200286 if tcl_version >= (8, 5):
287 check('2**64', str(2**64))
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200288
289 def test_exprdouble(self):
290 tcl = self.interp
291 tcl.call('set', 'a', 3)
292 tcl.call('set', 'b', 6)
293 def check(expr, expected):
294 result = tcl.exprdouble(expr)
295 self.assertEqual(result, expected)
296 self.assertIsInstance(result, float)
297
298 self.assertRaises(TypeError, tcl.exprdouble)
299 self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6')
300 self.assertRaises(TclError, tcl.exprdouble, 'spam')
301 check('', 0.0)
302 check('8.2 + 6', 14.2)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200303 check('3.1 + $a', 6.1)
304 check('2 + "$a.$b"', 5.6)
305 check('4*[llength "6 2"]', 8.0)
306 check('{word one} < "word $a"', 0.0)
307 check('4*2 < 7', 0.0)
308 check('hypot($a, 4)', 5.0)
309 check('5 / 4', 1.0)
310 check('5 / 4.0', 1.25)
311 check('5 / ( [string length "abcd"] + 0.0 )', 1.25)
312 check('20.0/5.0', 4.0)
313 check('"0x03" > "2"', 1.0)
314 check('[string length "a\xc2\xbd\xe2\x82\xac"]', 3.0)
315 check(r'[string length "a\xbd\u20ac"]', 3.0)
316 self.assertRaises(TclError, tcl.exprdouble, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200317 if tcl_version >= (8, 5):
318 check('2**64', float(2**64))
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200319
320 def test_exprlong(self):
321 tcl = self.interp
322 tcl.call('set', 'a', 3)
323 tcl.call('set', 'b', 6)
324 def check(expr, expected):
325 result = tcl.exprlong(expr)
326 self.assertEqual(result, expected)
327 self.assertIsInstance(result, int)
328
329 self.assertRaises(TypeError, tcl.exprlong)
330 self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6')
331 self.assertRaises(TclError, tcl.exprlong, 'spam')
332 check('', 0)
333 check('8.2 + 6', 14)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200334 check('3.1 + $a', 6)
335 check('2 + "$a.$b"', 5)
336 check('4*[llength "6 2"]', 8)
337 check('{word one} < "word $a"', 0)
338 check('4*2 < 7', 0)
339 check('hypot($a, 4)', 5)
340 check('5 / 4', 1)
341 check('5 / 4.0', 1)
342 check('5 / ( [string length "abcd"] + 0.0 )', 1)
343 check('20.0/5.0', 4)
344 check('"0x03" > "2"', 1)
345 check('[string length "a\xc2\xbd\xe2\x82\xac"]', 3)
346 check(r'[string length "a\xbd\u20ac"]', 3)
347 self.assertRaises(TclError, tcl.exprlong, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200348 if tcl_version >= (8, 5):
349 self.assertRaises(TclError, tcl.exprlong, '2**64')
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200350
351 def test_exprboolean(self):
352 tcl = self.interp
353 tcl.call('set', 'a', 3)
354 tcl.call('set', 'b', 6)
355 def check(expr, expected):
356 result = tcl.exprboolean(expr)
357 self.assertEqual(result, expected)
358 self.assertIsInstance(result, int)
359 self.assertNotIsInstance(result, bool)
360
361 self.assertRaises(TypeError, tcl.exprboolean)
362 self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6')
363 self.assertRaises(TclError, tcl.exprboolean, 'spam')
364 check('', False)
365 for value in ('0', 'false', 'no', 'off'):
366 check(value, False)
367 check('"%s"' % value, False)
368 check('{%s}' % value, False)
369 for value in ('1', 'true', 'yes', 'on'):
370 check(value, True)
371 check('"%s"' % value, True)
372 check('{%s}' % value, True)
373 check('8.2 + 6', True)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200374 check('3.1 + $a', True)
375 check('2 + "$a.$b"', True)
376 check('4*[llength "6 2"]', True)
377 check('{word one} < "word $a"', False)
378 check('4*2 < 7', False)
379 check('hypot($a, 4)', True)
380 check('5 / 4', True)
381 check('5 / 4.0', True)
382 check('5 / ( [string length "abcd"] + 0.0 )', True)
383 check('20.0/5.0', True)
384 check('"0x03" > "2"', True)
385 check('[string length "a\xc2\xbd\xe2\x82\xac"]', True)
386 check(r'[string length "a\xbd\u20ac"]', True)
387 self.assertRaises(TclError, tcl.exprboolean, '"abc"')
Serhiy Storchaka90ecc002014-02-03 22:30:22 +0200388 if tcl_version >= (8, 5):
389 check('2**64', True)
Serhiy Storchakad2eff232014-02-03 20:41:04 +0200390
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200391 def test_passing_values(self):
392 def passValue(value):
393 return self.interp.call('set', '_', value)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200394
395 self.assertEqual(passValue(True), True if self.wantobjects else '1')
396 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200397 self.assertEqual(passValue('string'), 'string')
398 self.assertEqual(passValue('string\xbd'), 'string\xbd')
399 self.assertEqual(passValue('string\xe2\x82\xac'), u'string\u20ac')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200400 self.assertEqual(passValue(u'string'), u'string')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200401 self.assertEqual(passValue(u'string\xbd'), u'string\xbd')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200402 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200403 self.assertEqual(passValue('str\x00ing'), 'str\x00ing')
404 self.assertEqual(passValue('str\xc0\x80ing'), 'str\x00ing')
405 self.assertEqual(passValue(u'str\x00ing'), u'str\x00ing')
406 self.assertEqual(passValue(u'str\x00ing\xbd'), u'str\x00ing\xbd')
407 self.assertEqual(passValue(u'str\x00ing\u20ac'), u'str\x00ing\u20ac')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200408 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200409 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200410 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200411 sys.float_info.min, sys.float_info.max,
412 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200413 if self.wantobjects:
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200414 self.assertEqual(passValue(f), f)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200415 else:
416 self.assertEqual(float(passValue(f)), f)
417 if self.wantobjects:
418 f = passValue(float('nan'))
419 self.assertNotEqual(f, f)
420 self.assertEqual(passValue(float('inf')), float('inf'))
421 self.assertEqual(passValue(-float('inf')), -float('inf'))
422 else:
423 f = float(passValue(float('nan')))
424 self.assertNotEqual(f, f)
425 self.assertEqual(float(passValue(float('inf'))), float('inf'))
426 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
427 self.assertEqual(passValue((1, '2', (3.4,))),
428 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000429
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200430 def test_user_command(self):
431 result = []
432 def testfunc(arg):
433 result.append(arg)
434 return arg
435 self.interp.createcommand('testfunc', testfunc)
Antoine Pitrouaa73ea02014-02-23 19:39:06 +0100436 self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200437 def check(value, expected, expected2=None, eq=self.assertEqual):
438 if expected2 is None:
439 expected2 = expected
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200440 del result[:]
Serhiy Storchaka83515ec2014-01-23 11:03:02 +0200441 r = self.interp.call('testfunc', value)
442 self.assertEqual(len(result), 1)
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200443 self.assertIsInstance(result[0], (str, unicode))
444 eq(result[0], expected2)
445 self.assertIsInstance(r, (str, unicode))
446 eq(r, expected2)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200447 def float_eq(actual, expected):
Serhiy Storchakaeb7ef942014-01-23 16:08:35 +0200448 expected = float(expected)
449 self.assertAlmostEqual(float(actual), expected,
450 delta=abs(expected) * 1e-10)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200451 def nan_eq(actual, expected):
452 actual = float(actual)
453 self.assertNotEqual(actual, actual)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200454
455 check(True, '1')
456 check(False, '0')
457 check('string', 'string')
458 check('string\xbd', 'string\xbd')
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200459 check('string\xe2\x82\xac', 'string\xe2\x82\xac', u'string\u20ac')
460 check(u'string', u'string')
461 check(u'string\xbd', 'string\xc2\xbd', u'string\xbd')
462 check(u'string\u20ac', 'string\xe2\x82\xac', u'string\u20ac')
463 check('str\xc0\x80ing', 'str\xc0\x80ing', u'str\x00ing')
464 check('str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
465 check(u'str\x00ing', 'str\xc0\x80ing', u'str\x00ing')
466 check(u'str\x00ing\xbd', 'str\xc0\x80ing\xc2\xbd', u'str\x00ing\xbd')
467 check(u'str\x00ing\u20ac', 'str\xc0\x80ing\xe2\x82\xac', u'str\x00ing\u20ac')
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200468 for i in (0, 1, -1, 2**31-1, -2**31):
469 check(i, str(i))
Serhiy Storchakadc976672014-01-23 14:38:44 +0200470 for f in (0.0, 1.0, -1.0):
471 check(f, repr(f))
472 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200473 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakadc976672014-01-23 14:38:44 +0200474 check(f, f, eq=float_eq)
475 check(float('inf'), 'Inf', eq=float_eq)
476 check(-float('inf'), '-Inf', eq=float_eq)
477 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200478 check((), '')
479 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
480
Serhiy Storchakafab65422013-07-11 20:32:48 +0300481 def test_splitlist(self):
482 splitlist = self.interp.tk.splitlist
483 call = self.interp.tk.call
484 self.assertRaises(TypeError, splitlist)
485 self.assertRaises(TypeError, splitlist, 'a', 'b')
486 self.assertRaises(TypeError, splitlist, 2)
487 testcases = [
488 ('2', ('2',)),
489 ('', ()),
490 ('{}', ('',)),
491 ('""', ('',)),
492 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
493 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
494 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
495 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200496 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300497 ('a {b c}', ('a', 'b c')),
498 (r'a b\ c', ('a', 'b c')),
499 (('a', '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 ((), ()),
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 += [
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200518 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
519 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(splitlist(arg), res)
523 self.assertRaises(TclError, splitlist, '{')
524
525 def test_split(self):
526 split = self.interp.tk.split
527 call = self.interp.tk.call
528 self.assertRaises(TypeError, split)
529 self.assertRaises(TypeError, split, 'a', 'b')
530 self.assertRaises(TypeError, split, 2)
531 testcases = [
532 ('2', '2'),
533 ('', ''),
534 ('{}', ''),
535 ('""', ''),
536 ('{', '{'),
537 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
538 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
539 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
540 (u'a \u20ac', ('a', '\xe2\x82\xac')),
Serhiy Storchakaccffb252014-02-03 21:23:46 +0200541 ('a\xc0\x80b', 'a\xc0\x80b'),
542 ('a\xc0\x80b c\xc0\x80d', ('a\xc0\x80b', 'c\xc0\x80d')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300543 ('a {b c}', ('a', ('b', 'c'))),
544 (r'a b\ c', ('a', ('b', 'c'))),
545 (('a', 'b c'), ('a', ('b', 'c'))),
546 (('a', u'b c'), ('a', ('b', 'c'))),
547 ('a 2', ('a', '2')),
548 (('a', 2), ('a', 2)),
549 ('a 3.4', ('a', '3.4')),
550 (('a', 3.4), ('a', 3.4)),
551 (('a', (2, 3.4)), ('a', (2, 3.4))),
552 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200553 (call('list', 1, '2', (3.4,)),
554 (1, '2', (3.4,)) if self.wantobjects else
555 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300556 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300557 if tcl_version >= (8, 5):
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200558 if not self.wantobjects:
559 expected = ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')
560 elif get_tk_patchlevel() < (8, 5, 5):
561 # Before 8.5.5 dicts were converted to lists through string
562 expected = ('12', u'\u20ac', u'\u20ac', '3.4')
563 else:
564 expected = (12, u'\u20ac', u'\u20ac', (3.4,))
Serhiy Storchaka94025332013-09-08 20:32:56 +0300565 testcases += [
566 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka15b67d72014-02-02 23:04:06 +0200567 expected),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300568 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300569 for arg, res in testcases:
570 self.assertEqual(split(arg), res)
571
Serhiy Storchaka2a0220b2014-05-30 14:23:52 +0300572character_size = 4 if sys.maxunicode > 0xFFFF else 2
Neal Norwitz63dfece2004-02-19 02:37:29 +0000573
Serhiy Storchaka42035702013-08-21 21:46:12 +0300574class BigmemTclTest(unittest.TestCase):
575
576 def setUp(self):
577 self.interp = Tcl()
578
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200579 @test_support.cpython_only
580 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
581 @test_support.precisionbigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False)
Serhiy Storchaka2a0220b2014-05-30 14:23:52 +0300582 def test_huge_string_call(self, size):
Serhiy Storchaka42035702013-08-21 21:46:12 +0300583 value = ' ' * size
584 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
585
Serhiy Storchaka2a0220b2014-05-30 14:23:52 +0300586 @test_support.cpython_only
587 @unittest.skipUnless(test_support.have_unicode, 'requires unicode support')
588 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
589 @test_support.precisionbigmemtest(size=INT_MAX + 1,
590 memuse=2*character_size + 2,
591 dry_run=False)
592 def test_huge_unicode_call(self, size):
593 value = unicode(' ') * size
594 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
595
596
597 @test_support.cpython_only
598 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
599 @test_support.precisionbigmemtest(size=INT_MAX + 1, memuse=9, dry_run=False)
600 def test_huge_string_builtins(self, size):
601 value = '1' + ' ' * size
602 self.check_huge_string_builtins(value)
603
604 @test_support.cpython_only
605 @unittest.skipUnless(test_support.have_unicode, 'requires unicode support')
606 @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX")
607 @test_support.precisionbigmemtest(size=INT_MAX + 1,
608 memuse=2*character_size + 7,
609 dry_run=False)
610 def test_huge_unicode_builtins(self, size):
611 value = unicode('1' + ' ' * size)
612 self.check_huge_string_builtins(value)
613
614 def check_huge_string_builtins(self, value):
615 self.assertRaises(OverflowError, self.interp.tk.getint, value)
616 self.assertRaises(OverflowError, self.interp.tk.getdouble, value)
617 self.assertRaises(OverflowError, self.interp.tk.getboolean, value)
618 self.assertRaises(OverflowError, self.interp.eval, value)
619 self.assertRaises(OverflowError, self.interp.evalfile, value)
620 self.assertRaises(OverflowError, self.interp.record, value)
621 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
622 self.assertRaises(OverflowError, self.interp.setvar, value, 'x', 'a')
623 self.assertRaises(OverflowError, self.interp.setvar, 'x', value, 'a')
624 self.assertRaises(OverflowError, self.interp.unsetvar, value)
625 self.assertRaises(OverflowError, self.interp.unsetvar, 'x', value)
626 self.assertRaises(OverflowError, self.interp.adderrorinfo, value)
627 self.assertRaises(OverflowError, self.interp.exprstring, value)
628 self.assertRaises(OverflowError, self.interp.exprlong, value)
629 self.assertRaises(OverflowError, self.interp.exprboolean, value)
630 self.assertRaises(OverflowError, self.interp.splitlist, value)
631 self.assertRaises(OverflowError, self.interp.split, value)
632 self.assertRaises(OverflowError, self.interp.createcommand, value, max)
633 self.assertRaises(OverflowError, self.interp.deletecommand, value)
634
Serhiy Storchaka42035702013-08-21 21:46:12 +0300635
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200636def setUpModule():
637 if test_support.verbose:
638 tcl = Tcl()
639 print 'patchlevel =', tcl.call('info', 'patchlevel')
640
641
Neal Norwitz63dfece2004-02-19 02:37:29 +0000642def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300643 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000644
David Aschere2b4b322004-02-18 05:59:53 +0000645if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000646 test_main()