blob: 3b89e5c2ff3594700b5588b80f4b7aa5b02d9a30 [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
Benjamin Petersonb3619be2009-01-30 02:24:39 +000022
23class TkinterTest(unittest.TestCase):
24
25 def testFlattenLen(self):
26 # flatten(<object with no length>)
27 self.assertRaises(TypeError, _tkinter._flatten, True)
28
29
David Aschere2b4b322004-02-18 05:59:53 +000030class TclTest(unittest.TestCase):
31
32 def setUp(self):
33 self.interp = Tcl()
Serhiy Storchaka5542b152013-12-25 17:28:50 +020034 self.wantobjects = self.interp.tk.wantobjects()
David Aschere2b4b322004-02-18 05:59:53 +000035
36 def testEval(self):
37 tcl = self.interp
38 tcl.eval('set a 1')
39 self.assertEqual(tcl.eval('set a'),'1')
40
41 def testEvalException(self):
42 tcl = self.interp
43 self.assertRaises(TclError,tcl.eval,'set a')
44
45 def testEvalException2(self):
46 tcl = self.interp
47 self.assertRaises(TclError,tcl.eval,'this is wrong')
48
49 def testCall(self):
50 tcl = self.interp
51 tcl.call('set','a','1')
52 self.assertEqual(tcl.call('set','a'),'1')
53
54 def testCallException(self):
55 tcl = self.interp
56 self.assertRaises(TclError,tcl.call,'set','a')
57
58 def testCallException2(self):
59 tcl = self.interp
60 self.assertRaises(TclError,tcl.call,'this','is','wrong')
61
62 def testSetVar(self):
63 tcl = self.interp
64 tcl.setvar('a','1')
65 self.assertEqual(tcl.eval('set a'),'1')
66
67 def testSetVarArray(self):
68 tcl = self.interp
69 tcl.setvar('a(1)','1')
70 self.assertEqual(tcl.eval('set a(1)'),'1')
71
72 def testGetVar(self):
73 tcl = self.interp
74 tcl.eval('set a 1')
75 self.assertEqual(tcl.getvar('a'),'1')
76
77 def testGetVarArray(self):
78 tcl = self.interp
79 tcl.eval('set a(1) 1')
80 self.assertEqual(tcl.getvar('a(1)'),'1')
81
82 def testGetVarException(self):
83 tcl = self.interp
84 self.assertRaises(TclError,tcl.getvar,'a')
85
86 def testGetVarArrayException(self):
87 tcl = self.interp
88 self.assertRaises(TclError,tcl.getvar,'a(1)')
89
90 def testUnsetVar(self):
91 tcl = self.interp
92 tcl.setvar('a',1)
93 self.assertEqual(tcl.eval('info exists a'),'1')
94 tcl.unsetvar('a')
95 self.assertEqual(tcl.eval('info exists a'),'0')
96
97 def testUnsetVarArray(self):
98 tcl = self.interp
99 tcl.setvar('a(1)',1)
100 tcl.setvar('a(2)',2)
101 self.assertEqual(tcl.eval('info exists a(1)'),'1')
102 self.assertEqual(tcl.eval('info exists a(2)'),'1')
103 tcl.unsetvar('a(1)')
104 self.assertEqual(tcl.eval('info exists a(1)'),'0')
105 self.assertEqual(tcl.eval('info exists a(2)'),'1')
106
107 def testUnsetVarException(self):
108 tcl = self.interp
109 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000110
David Aschere2b4b322004-02-18 05:59:53 +0000111 def testEvalFile(self):
112 tcl = self.interp
113 filename = "testEvalFile.tcl"
114 fd = open(filename,'w')
115 script = """set a 1
116 set b 2
117 set c [ expr $a + $b ]
118 """
119 fd.write(script)
120 fd.close()
121 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000122 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000123 self.assertEqual(tcl.eval('set a'),'1')
124 self.assertEqual(tcl.eval('set b'),'2')
125 self.assertEqual(tcl.eval('set c'),'3')
126
127 def testEvalFileException(self):
128 tcl = self.interp
129 filename = "doesnotexists"
130 try:
131 os.remove(filename)
132 except Exception,e:
133 pass
134 self.assertRaises(TclError,tcl.evalfile,filename)
135
David Aschere2b4b322004-02-18 05:59:53 +0000136 def testPackageRequireException(self):
137 tcl = self.interp
138 self.assertRaises(TclError,tcl.eval,'package require DNE')
139
Zachary Ware57d35c62013-11-03 22:51:25 -0600140 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000141 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000142 # Build a UNC path from the regular path.
143 # Something like
144 # \\%COMPUTERNAME%\c$\python27\python.exe
145
146 fullname = os.path.abspath(sys.executable)
147 if fullname[1] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600148 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000149 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
150 fullname[0],
151 fullname[3:])
152
153 with test_support.EnvironmentVarGuard() as env:
154 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300155 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000156
Zachary Ware57d35c62013-11-03 22:51:25 -0600157 try:
158 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
159 except WindowsError as e:
160 if e.winerror == 5:
161 self.skipTest('Not permitted to start the child process')
162 else:
163 raise
164
Ezio Melotti794e5572013-05-07 09:34:49 +0300165 out_data, err_data = p.communicate()
166
167 msg = '\n\n'.join(['"Tkinter.py" not in output',
168 'Command:', cmd,
169 'stdout:', out_data,
170 'stderr:', err_data])
171
172 self.assertIn('Tkinter.py', out_data, msg)
173
174 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
175
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000176
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200177 def test_passing_values(self):
178 def passValue(value):
179 return self.interp.call('set', '_', value)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200180
181 self.assertEqual(passValue(True), True if self.wantobjects else '1')
182 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200183 self.assertEqual(passValue(u'string'), u'string')
184 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
185 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200186 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200187 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200188 sys.float_info.min, sys.float_info.max,
189 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200190 if self.wantobjects:
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200191 self.assertEqual(passValue(f), f)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200192 else:
193 self.assertEqual(float(passValue(f)), f)
194 if self.wantobjects:
195 f = passValue(float('nan'))
196 self.assertNotEqual(f, f)
197 self.assertEqual(passValue(float('inf')), float('inf'))
198 self.assertEqual(passValue(-float('inf')), -float('inf'))
199 else:
200 f = float(passValue(float('nan')))
201 self.assertNotEqual(f, f)
202 self.assertEqual(float(passValue(float('inf'))), float('inf'))
203 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
204 self.assertEqual(passValue((1, '2', (3.4,))),
205 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000206
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200207 def test_user_command(self):
208 result = []
209 def testfunc(arg):
210 result.append(arg)
211 return arg
212 self.interp.createcommand('testfunc', testfunc)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200213 def check(value, expected, eq=self.assertEqual):
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200214 del result[:]
Serhiy Storchaka83515ec2014-01-23 11:03:02 +0200215 r = self.interp.call('testfunc', value)
216 self.assertEqual(len(result), 1)
217 self.assertIsInstance(result[0], str)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200218 eq(result[0], expected)
Serhiy Storchaka83515ec2014-01-23 11:03:02 +0200219 self.assertIsInstance(r, str)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200220 eq(r, expected)
221 def float_eq(actual, expected):
Serhiy Storchakaeb7ef942014-01-23 16:08:35 +0200222 expected = float(expected)
223 self.assertAlmostEqual(float(actual), expected,
224 delta=abs(expected) * 1e-10)
Serhiy Storchakadc976672014-01-23 14:38:44 +0200225 def nan_eq(actual, expected):
226 actual = float(actual)
227 self.assertNotEqual(actual, actual)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200228
229 check(True, '1')
230 check(False, '0')
231 check('string', 'string')
232 check('string\xbd', 'string\xbd')
233 check('string\u20ac', 'string\u20ac')
234 for i in (0, 1, -1, 2**31-1, -2**31):
235 check(i, str(i))
Serhiy Storchakadc976672014-01-23 14:38:44 +0200236 for f in (0.0, 1.0, -1.0):
237 check(f, repr(f))
238 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200239 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakadc976672014-01-23 14:38:44 +0200240 check(f, f, eq=float_eq)
241 check(float('inf'), 'Inf', eq=float_eq)
242 check(-float('inf'), '-Inf', eq=float_eq)
243 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka29d8e852014-01-23 09:42:46 +0200244 check((), '')
245 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
246
Serhiy Storchakafab65422013-07-11 20:32:48 +0300247 def test_splitlist(self):
248 splitlist = self.interp.tk.splitlist
249 call = self.interp.tk.call
250 self.assertRaises(TypeError, splitlist)
251 self.assertRaises(TypeError, splitlist, 'a', 'b')
252 self.assertRaises(TypeError, splitlist, 2)
253 testcases = [
254 ('2', ('2',)),
255 ('', ()),
256 ('{}', ('',)),
257 ('""', ('',)),
258 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
259 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
260 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
261 (u'a \u20ac', ('a', '\xe2\x82\xac')),
262 ('a {b c}', ('a', 'b c')),
263 (r'a b\ c', ('a', 'b c')),
264 (('a', 'b c'), ('a', 'b c')),
265 ('a 2', ('a', '2')),
266 (('a', 2), ('a', 2)),
267 ('a 3.4', ('a', '3.4')),
268 (('a', 3.4), ('a', 3.4)),
269 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200270 (call('list', 1, '2', (3.4,)),
271 (1, '2', (3.4,)) if self.wantobjects else
272 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300273 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300274 if tcl_version >= (8, 5):
275 testcases += [
276 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200277 (1, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
278 ('1', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300279 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300280 for arg, res in testcases:
281 self.assertEqual(splitlist(arg), res)
282 self.assertRaises(TclError, splitlist, '{')
283
284 def test_split(self):
285 split = self.interp.tk.split
286 call = self.interp.tk.call
287 self.assertRaises(TypeError, split)
288 self.assertRaises(TypeError, split, 'a', 'b')
289 self.assertRaises(TypeError, split, 2)
290 testcases = [
291 ('2', '2'),
292 ('', ''),
293 ('{}', ''),
294 ('""', ''),
295 ('{', '{'),
296 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
297 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
298 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
299 (u'a \u20ac', ('a', '\xe2\x82\xac')),
300 ('a {b c}', ('a', ('b', 'c'))),
301 (r'a b\ c', ('a', ('b', 'c'))),
302 (('a', 'b c'), ('a', ('b', 'c'))),
303 (('a', u'b c'), ('a', ('b', 'c'))),
304 ('a 2', ('a', '2')),
305 (('a', 2), ('a', 2)),
306 ('a 3.4', ('a', '3.4')),
307 (('a', 3.4), ('a', 3.4)),
308 (('a', (2, 3.4)), ('a', (2, 3.4))),
309 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200310 (call('list', 1, '2', (3.4,)),
311 (1, '2', (3.4,)) if self.wantobjects else
312 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300313 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300314 if tcl_version >= (8, 5):
315 testcases += [
316 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200317 (12, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
318 ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300319 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300320 for arg, res in testcases:
321 self.assertEqual(split(arg), res)
322
Neal Norwitz63dfece2004-02-19 02:37:29 +0000323
Serhiy Storchaka42035702013-08-21 21:46:12 +0300324class BigmemTclTest(unittest.TestCase):
325
326 def setUp(self):
327 self.interp = Tcl()
328
329 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
330 "needs UINT_MAX < SIZE_MAX")
331 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
332 dry_run=False)
333 def test_huge_string(self, size):
334 value = ' ' * size
335 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
336
337
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200338def setUpModule():
339 if test_support.verbose:
340 tcl = Tcl()
341 print 'patchlevel =', tcl.call('info', 'patchlevel')
342
343
Neal Norwitz63dfece2004-02-19 02:37:29 +0000344def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300345 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000346
David Aschere2b4b322004-02-18 05:59:53 +0000347if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000348 test_main()