blob: 66c49ffedcb5901bdcbff5938490c161d8ca8ec2 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
David Aschere2b4b322004-02-18 05:59:53 +00002
3import unittest
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +00004import sys
David Aschere2b4b322004-02-18 05:59:53 +00005import os
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +03006import _testcapi
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
R. David Murraya21e4ca2009-03-31 23:16:50 +00008
9# Skip this test if the _tkinter module wasn't built.
10_tkinter = support.import_module('_tkinter')
11
Terry Jan Reedy743c85a2013-03-16 02:37:06 -040012# Make sure tkinter._fix runs to set up the environment
13support.import_fresh_module('tkinter')
14
Guilherme Polofa8fba92009-02-07 02:33:47 +000015from tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000016from _tkinter import TclError
17
Serhiy Storchakadfa689b2013-09-08 20:29:37 +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
Benjamin Petersonc4bbc8d2009-01-30 03:39:35 +000026
27class TkinterTest(unittest.TestCase):
28
29 def testFlattenLen(self):
30 # flatten(<object with no length>)
31 self.assertRaises(TypeError, _tkinter._flatten, True)
32
33
David Aschere2b4b322004-02-18 05:59:53 +000034class TclTest(unittest.TestCase):
35
36 def setUp(self):
37 self.interp = Tcl()
38
39 def testEval(self):
40 tcl = self.interp
41 tcl.eval('set a 1')
42 self.assertEqual(tcl.eval('set a'),'1')
43
44 def testEvalException(self):
45 tcl = self.interp
46 self.assertRaises(TclError,tcl.eval,'set a')
47
48 def testEvalException2(self):
49 tcl = self.interp
50 self.assertRaises(TclError,tcl.eval,'this is wrong')
51
52 def testCall(self):
53 tcl = self.interp
54 tcl.call('set','a','1')
55 self.assertEqual(tcl.call('set','a'),'1')
56
57 def testCallException(self):
58 tcl = self.interp
59 self.assertRaises(TclError,tcl.call,'set','a')
60
61 def testCallException2(self):
62 tcl = self.interp
63 self.assertRaises(TclError,tcl.call,'this','is','wrong')
64
65 def testSetVar(self):
66 tcl = self.interp
67 tcl.setvar('a','1')
68 self.assertEqual(tcl.eval('set a'),'1')
69
70 def testSetVarArray(self):
71 tcl = self.interp
72 tcl.setvar('a(1)','1')
73 self.assertEqual(tcl.eval('set a(1)'),'1')
74
75 def testGetVar(self):
76 tcl = self.interp
77 tcl.eval('set a 1')
78 self.assertEqual(tcl.getvar('a'),'1')
79
80 def testGetVarArray(self):
81 tcl = self.interp
82 tcl.eval('set a(1) 1')
83 self.assertEqual(tcl.getvar('a(1)'),'1')
84
85 def testGetVarException(self):
86 tcl = self.interp
87 self.assertRaises(TclError,tcl.getvar,'a')
88
89 def testGetVarArrayException(self):
90 tcl = self.interp
91 self.assertRaises(TclError,tcl.getvar,'a(1)')
92
93 def testUnsetVar(self):
94 tcl = self.interp
95 tcl.setvar('a',1)
96 self.assertEqual(tcl.eval('info exists a'),'1')
97 tcl.unsetvar('a')
98 self.assertEqual(tcl.eval('info exists a'),'0')
99
100 def testUnsetVarArray(self):
101 tcl = self.interp
102 tcl.setvar('a(1)',1)
103 tcl.setvar('a(2)',2)
104 self.assertEqual(tcl.eval('info exists a(1)'),'1')
105 self.assertEqual(tcl.eval('info exists a(2)'),'1')
106 tcl.unsetvar('a(1)')
107 self.assertEqual(tcl.eval('info exists a(1)'),'0')
108 self.assertEqual(tcl.eval('info exists a(2)'),'1')
109
110 def testUnsetVarException(self):
111 tcl = self.interp
112 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000113
David Aschere2b4b322004-02-18 05:59:53 +0000114 def testEvalFile(self):
115 tcl = self.interp
116 filename = "testEvalFile.tcl"
117 fd = open(filename,'w')
118 script = """set a 1
119 set b 2
120 set c [ expr $a + $b ]
121 """
122 fd.write(script)
123 fd.close()
124 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000125 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000126 self.assertEqual(tcl.eval('set a'),'1')
127 self.assertEqual(tcl.eval('set b'),'2')
128 self.assertEqual(tcl.eval('set c'),'3')
129
130 def testEvalFileException(self):
131 tcl = self.interp
132 filename = "doesnotexists"
133 try:
134 os.remove(filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000135 except Exception as e:
David Aschere2b4b322004-02-18 05:59:53 +0000136 pass
137 self.assertRaises(TclError,tcl.evalfile,filename)
138
David Aschere2b4b322004-02-18 05:59:53 +0000139 def testPackageRequireException(self):
140 tcl = self.interp
141 self.assertRaises(TclError,tcl.eval,'package require DNE')
142
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000143 @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000144 def testLoadWithUNC(self):
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000145 # Build a UNC path from the regular path.
146 # Something like
147 # \\%COMPUTERNAME%\c$\python27\python.exe
148
149 fullname = os.path.abspath(sys.executable)
150 if fullname[1] != ':':
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000151 raise unittest.SkipTest('Absolute path should have drive part')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000152 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
153 fullname[0],
154 fullname[3:])
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000155 if not os.path.exists(unc_name):
156 raise unittest.SkipTest('Cannot connect to UNC Path')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000157
Georg Brandlec5ae3b2010-07-31 19:17:11 +0000158 with support.EnvironmentVarGuard() as env:
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000159 env.unset("TCL_LIBRARY")
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000160 f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000161
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000162 self.assertIn('tkinter', f.read())
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000163 # exit code must be zero
164 self.assertEqual(f.close(), None)
165
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200166 def test_passing_values(self):
167 def passValue(value):
168 return self.interp.call('set', '_', value)
169
170 self.assertEqual(passValue(True), True)
171 self.assertEqual(passValue(False), False)
172 self.assertEqual(passValue('string'), 'string')
173 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
174 for i in (0, 1, -1, 2**31-1, -2**31):
175 self.assertEqual(passValue(i), i)
176 for f in (0.0, 1.0, -1.0, 1/3,
177 sys.float_info.min, sys.float_info.max,
178 -sys.float_info.min, -sys.float_info.max):
179 self.assertEqual(passValue(f), f)
180 for f in float('nan'), float('inf'), -float('inf'):
181 if f != f: # NaN
182 self.assertNotEqual(passValue(f), f)
183 else:
184 self.assertEqual(passValue(f), f)
185 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000186
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300187 def test_splitlist(self):
188 splitlist = self.interp.tk.splitlist
189 call = self.interp.tk.call
190 self.assertRaises(TypeError, splitlist)
191 self.assertRaises(TypeError, splitlist, 'a', 'b')
192 self.assertRaises(TypeError, splitlist, 2)
193 testcases = [
194 ('2', ('2',)),
195 ('', ()),
196 ('{}', ('',)),
197 ('""', ('',)),
198 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
199 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
200 ('a \u20ac', ('a', '\u20ac')),
201 (b'a \xe2\x82\xac', ('a', '\u20ac')),
202 ('a {b c}', ('a', 'b c')),
203 (r'a b\ c', ('a', 'b c')),
204 (('a', 'b c'), ('a', 'b c')),
205 ('a 2', ('a', '2')),
206 (('a', 2), ('a', 2)),
207 ('a 3.4', ('a', '3.4')),
208 (('a', 3.4), ('a', 3.4)),
209 ((), ()),
210 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
211 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300212 if tcl_version >= (8, 5):
213 testcases += [
214 (call('dict', 'create', 1, '\u20ac', b'\xe2\x82\xac', (3.4,)),
215 (1, '\u20ac', '\u20ac', (3.4,))),
216 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300217 for arg, res in testcases:
218 self.assertEqual(splitlist(arg), res, msg=arg)
219 self.assertRaises(TclError, splitlist, '{')
220
221 def test_split(self):
222 split = self.interp.tk.split
223 call = self.interp.tk.call
224 self.assertRaises(TypeError, split)
225 self.assertRaises(TypeError, split, 'a', 'b')
226 self.assertRaises(TypeError, split, 2)
227 testcases = [
228 ('2', '2'),
229 ('', ''),
230 ('{}', ''),
231 ('""', ''),
232 ('{', '{'),
233 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
234 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
235 ('a \u20ac', ('a', '\u20ac')),
236 (b'a \xe2\x82\xac', ('a', '\u20ac')),
237 ('a {b c}', ('a', ('b', 'c'))),
238 (r'a b\ c', ('a', ('b', 'c'))),
239 (('a', b'b c'), ('a', ('b', 'c'))),
240 (('a', 'b c'), ('a', ('b', 'c'))),
241 ('a 2', ('a', '2')),
242 (('a', 2), ('a', 2)),
243 ('a 3.4', ('a', '3.4')),
244 (('a', 3.4), ('a', 3.4)),
245 (('a', (2, 3.4)), ('a', (2, 3.4))),
246 ((), ()),
247 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
248 ]
Serhiy Storchakadfa689b2013-09-08 20:29:37 +0300249 if tcl_version >= (8, 5):
250 testcases += [
251 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
252 (12, '\u20ac', '\u20ac', (3.4,))),
253 ]
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300254 for arg, res in testcases:
255 self.assertEqual(split(arg), res, msg=arg)
256
Neal Norwitz63dfece2004-02-19 02:37:29 +0000257
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300258class BigmemTclTest(unittest.TestCase):
259
260 def setUp(self):
261 self.interp = Tcl()
262
263 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
264 "needs UINT_MAX < SIZE_MAX")
265 @support.bigmemtest(size=_testcapi.INT_MAX + 1, memuse=5, dry_run=False)
266 def test_huge_string(self, size):
267 value = ' ' * size
268 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
269
270
Serhiy Storchaka8db18232013-11-20 17:43:49 +0200271def setUpModule():
272 if support.verbose:
273 tcl = Tcl()
274 print('patchlevel =', tcl.call('info', 'patchlevel'))
275
276
Neal Norwitz63dfece2004-02-19 02:37:29 +0000277def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300278 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000279
David Aschere2b4b322004-02-18 05:59:53 +0000280if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000281 test_main()