blob: d804f0f382fb114a992a0b21c448a81c5f255a4d [file] [log] [blame]
David Aschere2b4b322004-02-18 05:59:53 +00001import unittest
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +00002import sys
David Aschere2b4b322004-02-18 05:59:53 +00003import os
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +03004import _testcapi
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
R. David Murraya21e4ca2009-03-31 23:16:50 +00006
7# Skip this test if the _tkinter module wasn't built.
8_tkinter = support.import_module('_tkinter')
9
Terry Jan Reedy743c85a2013-03-16 02:37:06 -040010# Make sure tkinter._fix runs to set up the environment
11support.import_fresh_module('tkinter')
12
Guilherme Polofa8fba92009-02-07 02:33:47 +000013from tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000014from _tkinter import TclError
15
Serhiy Storchakadfa689b2013-09-08 20:29:37 +030016tcl_version = _tkinter.TCL_VERSION.split('.')
17try:
18 for i in range(len(tcl_version)):
19 tcl_version[i] = int(tcl_version[i])
20except ValueError:
21 pass
22tcl_version = tuple(tcl_version)
23
Benjamin Petersonc4bbc8d2009-01-30 03:39:35 +000024
25class TkinterTest(unittest.TestCase):
26
27 def testFlattenLen(self):
28 # flatten(<object with no length>)
29 self.assertRaises(TypeError, _tkinter._flatten, True)
30
31
David Aschere2b4b322004-02-18 05:59:53 +000032class TclTest(unittest.TestCase):
33
34 def setUp(self):
35 self.interp = Tcl()
Serhiy Storchakacc4290b2013-12-25 17:29:01 +020036 self.wantobjects = self.interp.tk.wantobjects()
David Aschere2b4b322004-02-18 05:59:53 +000037
38 def testEval(self):
39 tcl = self.interp
40 tcl.eval('set a 1')
41 self.assertEqual(tcl.eval('set a'),'1')
42
43 def testEvalException(self):
44 tcl = self.interp
45 self.assertRaises(TclError,tcl.eval,'set a')
46
47 def testEvalException2(self):
48 tcl = self.interp
49 self.assertRaises(TclError,tcl.eval,'this is wrong')
50
51 def testCall(self):
52 tcl = self.interp
53 tcl.call('set','a','1')
54 self.assertEqual(tcl.call('set','a'),'1')
55
56 def testCallException(self):
57 tcl = self.interp
58 self.assertRaises(TclError,tcl.call,'set','a')
59
60 def testCallException2(self):
61 tcl = self.interp
62 self.assertRaises(TclError,tcl.call,'this','is','wrong')
63
64 def testSetVar(self):
65 tcl = self.interp
66 tcl.setvar('a','1')
67 self.assertEqual(tcl.eval('set a'),'1')
68
69 def testSetVarArray(self):
70 tcl = self.interp
71 tcl.setvar('a(1)','1')
72 self.assertEqual(tcl.eval('set a(1)'),'1')
73
74 def testGetVar(self):
75 tcl = self.interp
76 tcl.eval('set a 1')
77 self.assertEqual(tcl.getvar('a'),'1')
78
79 def testGetVarArray(self):
80 tcl = self.interp
81 tcl.eval('set a(1) 1')
82 self.assertEqual(tcl.getvar('a(1)'),'1')
83
84 def testGetVarException(self):
85 tcl = self.interp
86 self.assertRaises(TclError,tcl.getvar,'a')
87
88 def testGetVarArrayException(self):
89 tcl = self.interp
90 self.assertRaises(TclError,tcl.getvar,'a(1)')
91
92 def testUnsetVar(self):
93 tcl = self.interp
94 tcl.setvar('a',1)
95 self.assertEqual(tcl.eval('info exists a'),'1')
96 tcl.unsetvar('a')
97 self.assertEqual(tcl.eval('info exists a'),'0')
98
99 def testUnsetVarArray(self):
100 tcl = self.interp
101 tcl.setvar('a(1)',1)
102 tcl.setvar('a(2)',2)
103 self.assertEqual(tcl.eval('info exists a(1)'),'1')
104 self.assertEqual(tcl.eval('info exists a(2)'),'1')
105 tcl.unsetvar('a(1)')
106 self.assertEqual(tcl.eval('info exists a(1)'),'0')
107 self.assertEqual(tcl.eval('info exists a(2)'),'1')
108
109 def testUnsetVarException(self):
110 tcl = self.interp
111 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000112
David Aschere2b4b322004-02-18 05:59:53 +0000113 def testEvalFile(self):
114 tcl = self.interp
115 filename = "testEvalFile.tcl"
116 fd = open(filename,'w')
117 script = """set a 1
118 set b 2
119 set c [ expr $a + $b ]
120 """
121 fd.write(script)
122 fd.close()
123 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000124 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000125 self.assertEqual(tcl.eval('set a'),'1')
126 self.assertEqual(tcl.eval('set b'),'2')
127 self.assertEqual(tcl.eval('set c'),'3')
128
129 def testEvalFileException(self):
130 tcl = self.interp
131 filename = "doesnotexists"
132 try:
133 os.remove(filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000134 except Exception as e:
David Aschere2b4b322004-02-18 05:59:53 +0000135 pass
136 self.assertRaises(TclError,tcl.evalfile,filename)
137
David Aschere2b4b322004-02-18 05:59:53 +0000138 def testPackageRequireException(self):
139 tcl = self.interp
140 self.assertRaises(TclError,tcl.eval,'package require DNE')
141
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000142 @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000143 def testLoadWithUNC(self):
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000144 # Build a UNC path from the regular path.
145 # Something like
146 # \\%COMPUTERNAME%\c$\python27\python.exe
147
148 fullname = os.path.abspath(sys.executable)
149 if fullname[1] != ':':
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000150 raise unittest.SkipTest('Absolute path should have drive part')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000151 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
152 fullname[0],
153 fullname[3:])
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000154 if not os.path.exists(unc_name):
155 raise unittest.SkipTest('Cannot connect to UNC Path')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000156
Georg Brandlec5ae3b2010-07-31 19:17:11 +0000157 with support.EnvironmentVarGuard() as env:
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000158 env.unset("TCL_LIBRARY")
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000159 f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000160
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000161 self.assertIn('tkinter', f.read())
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000162 # exit code must be zero
163 self.assertEqual(f.close(), None)
164
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200165 def test_passing_values(self):
166 def passValue(value):
167 return self.interp.call('set', '_', value)
168
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200169 self.assertEqual(passValue(True), True if self.wantobjects else '1')
170 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200171 self.assertEqual(passValue('string'), 'string')
172 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
173 for i in (0, 1, -1, 2**31-1, -2**31):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200174 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200175 for f in (0.0, 1.0, -1.0, 1/3,
176 sys.float_info.min, sys.float_info.max,
177 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200178 if self.wantobjects:
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200179 self.assertEqual(passValue(f), f)
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200180 else:
181 self.assertEqual(float(passValue(f)), f)
182 if self.wantobjects:
183 f = passValue(float('nan'))
184 self.assertNotEqual(f, f)
185 self.assertEqual(passValue(float('inf')), float('inf'))
186 self.assertEqual(passValue(-float('inf')), -float('inf'))
187 else:
188 f = float(passValue(float('nan')))
189 self.assertNotEqual(f, f)
190 self.assertEqual(float(passValue(float('inf'))), float('inf'))
191 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
192 self.assertEqual(passValue((1, '2', (3.4,))),
193 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000194
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200195 def test_user_command(self):
196 result = None
197 def testfunc(arg):
198 nonlocal result
199 result = arg
200 return arg
201 self.interp.createcommand('testfunc', testfunc)
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200202 def check(value, expected, eq=self.assertEqual):
203 r = self.interp.call('testfunc', value)
204 self.assertIsInstance(result, str)
205 eq(result, expected)
206 self.assertIsInstance(r, str)
207 eq(r, expected)
208 def float_eq(actual, expected):
209 expected = float(expected)
210 self.assertAlmostEqual(float(actual), expected,
211 delta=abs(expected) * 1e-10)
212 def nan_eq(actual, expected):
213 actual = float(actual)
214 self.assertNotEqual(actual, actual)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200215
216 check(True, '1')
217 check(False, '0')
218 check('string', 'string')
219 check('string\xbd', 'string\xbd')
220 check('string\u20ac', 'string\u20ac')
221 for i in (0, 1, -1, 2**31-1, -2**31):
222 check(i, str(i))
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200223 for f in (0.0, 1.0, -1.0):
224 check(f, repr(f))
225 for f in (1/3.0, sys.float_info.min, sys.float_info.max,
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200226 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchakabdf0cb52014-01-23 16:48:44 +0200227 check(f, f, eq=float_eq)
228 check(float('inf'), 'Inf', eq=float_eq)
229 check(-float('inf'), '-Inf', eq=float_eq)
230 check(float('nan'), 'NaN', eq=nan_eq)
Serhiy Storchaka4b730162014-01-23 09:44:05 +0200231 check((), '')
232 check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}')
233
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300234 def test_splitlist(self):
235 splitlist = self.interp.tk.splitlist
236 call = self.interp.tk.call
237 self.assertRaises(TypeError, splitlist)
238 self.assertRaises(TypeError, splitlist, 'a', 'b')
239 self.assertRaises(TypeError, splitlist, 2)
240 testcases = [
241 ('2', ('2',)),
242 ('', ()),
243 ('{}', ('',)),
244 ('""', ('',)),
245 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
246 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
247 ('a \u20ac', ('a', '\u20ac')),
248 (b'a \xe2\x82\xac', ('a', '\u20ac')),
249 ('a {b c}', ('a', 'b c')),
250 (r'a b\ c', ('a', 'b c')),
251 (('a', 'b c'), ('a', 'b c')),
252 ('a 2', ('a', '2')),
253 (('a', 2), ('a', 2)),
254 ('a 3.4', ('a', '3.4')),
255 (('a', 3.4), ('a', 3.4)),
256 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200257 (call('list', 1, '2', (3.4,)),
258 (1, '2', (3.4,)) if self.wantobjects else
259 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300260 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300261 if tcl_version >= (8, 5):
262 testcases += [
263 (call('dict', 'create', 1, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200264 (1, '\u20ac', '\u20ac', (3.4,)) if self.wantobjects else
265 ('1', '\u20ac', '\u20ac', '3.4')),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300266 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300267 for arg, res in testcases:
268 self.assertEqual(splitlist(arg), res, msg=arg)
269 self.assertRaises(TclError, splitlist, '{')
270
271 def test_split(self):
272 split = self.interp.tk.split
273 call = self.interp.tk.call
274 self.assertRaises(TypeError, split)
275 self.assertRaises(TypeError, split, 'a', 'b')
276 self.assertRaises(TypeError, split, 2)
277 testcases = [
278 ('2', '2'),
279 ('', ''),
280 ('{}', ''),
281 ('""', ''),
282 ('{', '{'),
283 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
284 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
285 ('a \u20ac', ('a', '\u20ac')),
286 (b'a \xe2\x82\xac', ('a', '\u20ac')),
287 ('a {b c}', ('a', ('b', 'c'))),
288 (r'a b\ c', ('a', ('b', 'c'))),
289 (('a', b'b c'), ('a', ('b', 'c'))),
290 (('a', 'b c'), ('a', ('b', 'c'))),
291 ('a 2', ('a', '2')),
292 (('a', 2), ('a', 2)),
293 ('a 3.4', ('a', '3.4')),
294 (('a', 3.4), ('a', 3.4)),
295 (('a', (2, 3.4)), ('a', (2, 3.4))),
296 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200297 (call('list', 1, '2', (3.4,)),
298 (1, '2', (3.4,)) if self.wantobjects else
299 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300300 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300301 if tcl_version >= (8, 5):
302 testcases += [
303 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200304 (12, '\u20ac', '\u20ac', (3.4,)) if self.wantobjects else
305 ('12', '\u20ac', '\u20ac', '3.4')),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300306 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300307 for arg, res in testcases:
308 self.assertEqual(split(arg), res, msg=arg)
309
Neal Norwitz63dfece2004-02-19 02:37:29 +0000310
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300311class BigmemTclTest(unittest.TestCase):
312
313 def setUp(self):
314 self.interp = Tcl()
315
316 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
317 "needs UINT_MAX < SIZE_MAX")
318 @support.bigmemtest(size=_testcapi.INT_MAX + 1, memuse=5, dry_run=False)
319 def test_huge_string(self, size):
320 value = ' ' * size
321 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
322
323
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200324def setUpModule():
325 if support.verbose:
326 tcl = Tcl()
327 print('patchlevel =', tcl.call('info', 'patchlevel'))
328
329
Neal Norwitz63dfece2004-02-19 02:37:29 +0000330def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300331 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000332
David Aschere2b4b322004-02-18 05:59:53 +0000333if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000334 test_main()