blob: ad17ee95d3cc82bc5abf2972ea492f72d7257947 [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 Storchaka275d5fd2013-07-11 20:34:47 +0300195 def test_splitlist(self):
196 splitlist = self.interp.tk.splitlist
197 call = self.interp.tk.call
198 self.assertRaises(TypeError, splitlist)
199 self.assertRaises(TypeError, splitlist, 'a', 'b')
200 self.assertRaises(TypeError, splitlist, 2)
201 testcases = [
202 ('2', ('2',)),
203 ('', ()),
204 ('{}', ('',)),
205 ('""', ('',)),
206 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
207 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
208 ('a \u20ac', ('a', '\u20ac')),
209 (b'a \xe2\x82\xac', ('a', '\u20ac')),
210 ('a {b c}', ('a', 'b c')),
211 (r'a b\ c', ('a', 'b c')),
212 (('a', 'b c'), ('a', 'b c')),
213 ('a 2', ('a', '2')),
214 (('a', 2), ('a', 2)),
215 ('a 3.4', ('a', '3.4')),
216 (('a', 3.4), ('a', 3.4)),
217 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200218 (call('list', 1, '2', (3.4,)),
219 (1, '2', (3.4,)) if self.wantobjects else
220 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300221 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300222 if tcl_version >= (8, 5):
223 testcases += [
224 (call('dict', 'create', 1, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200225 (1, '\u20ac', '\u20ac', (3.4,)) if self.wantobjects else
226 ('1', '\u20ac', '\u20ac', '3.4')),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300227 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300228 for arg, res in testcases:
229 self.assertEqual(splitlist(arg), res, msg=arg)
230 self.assertRaises(TclError, splitlist, '{')
231
232 def test_split(self):
233 split = self.interp.tk.split
234 call = self.interp.tk.call
235 self.assertRaises(TypeError, split)
236 self.assertRaises(TypeError, split, 'a', 'b')
237 self.assertRaises(TypeError, split, 2)
238 testcases = [
239 ('2', '2'),
240 ('', ''),
241 ('{}', ''),
242 ('""', ''),
243 ('{', '{'),
244 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
245 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
246 ('a \u20ac', ('a', '\u20ac')),
247 (b'a \xe2\x82\xac', ('a', '\u20ac')),
248 ('a {b c}', ('a', ('b', 'c'))),
249 (r'a b\ c', ('a', ('b', 'c'))),
250 (('a', b'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 (('a', (2, 3.4)), ('a', (2, 3.4))),
257 ((), ()),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200258 (call('list', 1, '2', (3.4,)),
259 (1, '2', (3.4,)) if self.wantobjects else
260 ('1', '2', '3.4')),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300261 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300262 if tcl_version >= (8, 5):
263 testcases += [
264 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
Serhiy Storchakacc4290b2013-12-25 17:29:01 +0200265 (12, '\u20ac', '\u20ac', (3.4,)) if self.wantobjects else
266 ('12', '\u20ac', '\u20ac', '3.4')),
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300267 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300268 for arg, res in testcases:
269 self.assertEqual(split(arg), res, msg=arg)
270
Serhiy Storchaka369606d2013-09-23 23:20:07 +0300271 def test_merge(self):
272 with support.check_warnings(('merge is deprecated',
273 DeprecationWarning)):
274 merge = self.interp.tk.merge
275 call = self.interp.tk.call
276 testcases = [
277 ((), ''),
278 (('a',), 'a'),
279 ((2,), '2'),
280 (('',), '{}'),
281 ('{', '\\{'),
282 (('a', 'b', 'c'), 'a b c'),
283 ((' ', '\t', '\r', '\n'), '{ } {\t} {\r} {\n}'),
284 (('a', ' ', 'c'), 'a { } c'),
285 (('a', '€'), 'a €'),
286 (('a', '\U000104a2'), 'a \U000104a2'),
287 (('a', b'\xe2\x82\xac'), 'a €'),
288 (('a', ('b', 'c')), 'a {b c}'),
289 (('a', 2), 'a 2'),
290 (('a', 3.4), 'a 3.4'),
291 (('a', (2, 3.4)), 'a {2 3.4}'),
292 ((), ''),
293 ((call('list', 1, '2', (3.4,)),), '{1 2 3.4}'),
Serhiy Storchaka369606d2013-09-23 23:20:07 +0300294 ]
Serhiy Storchaka8797dcd2013-10-27 12:38:01 +0200295 if tcl_version >= (8, 5):
296 testcases += [
297 ((call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),),
298 '{12 € € 3.4}'),
299 ]
Serhiy Storchaka369606d2013-09-23 23:20:07 +0300300 for args, res in testcases:
301 self.assertEqual(merge(*args), res, msg=args)
302 self.assertRaises(UnicodeDecodeError, merge, b'\x80')
303 self.assertRaises(UnicodeEncodeError, merge, '\udc80')
304
Neal Norwitz63dfece2004-02-19 02:37:29 +0000305
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300306class BigmemTclTest(unittest.TestCase):
307
308 def setUp(self):
309 self.interp = Tcl()
310
311 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
312 "needs UINT_MAX < SIZE_MAX")
313 @support.bigmemtest(size=_testcapi.INT_MAX + 1, memuse=5, dry_run=False)
314 def test_huge_string(self, size):
315 value = ' ' * size
316 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
317
318
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200319def setUpModule():
320 if support.verbose:
321 tcl = Tcl()
322 print('patchlevel =', tcl.call('info', 'patchlevel'))
323
324
Neal Norwitz63dfece2004-02-19 02:37:29 +0000325def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300326 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000327
David Aschere2b4b322004-02-18 05:59:53 +0000328if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000329 test_main()