blob: ec21f077de64ef8dc4b3838ca36cdcd35dd1240b [file] [log] [blame]
David Aschere2b4b322004-02-18 05:59:53 +00001#!/usr/bin/env python
2
3import unittest
Serhiy Storchaka4a880412013-02-07 15:37:53 +02004import sys
David Aschere2b4b322004-02-18 05:59:53 +00005import os
Serhiy Storchaka42035702013-08-21 21:46:12 +03006import _testcapi
Neal Norwitz63dfece2004-02-19 02:37:29 +00007from test import test_support
Ezio Melotti794e5572013-05-07 09:34:49 +03008from subprocess import Popen, PIPE
R. David Murray597ebab2009-03-31 18:32:17 +00009
10# Skip this test if the _tkinter module wasn't built.
11_tkinter = test_support.import_module('_tkinter')
12
Guilherme Polo8e5e4382009-02-07 02:20:29 +000013from Tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000014from _tkinter import TclError
15
Serhiy Storchaka94025332013-09-08 20:32:56 +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 Petersonb3619be2009-01-30 02:24:39 +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 Storchaka5542b152013-12-25 17:28:50 +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)
134 except Exception,e:
135 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
Zachary Ware57d35c62013-11-03 22:51:25 -0600142 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000143 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +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] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600150 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000151 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
152 fullname[0],
153 fullname[3:])
154
155 with test_support.EnvironmentVarGuard() as env:
156 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300157 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000158
Zachary Ware57d35c62013-11-03 22:51:25 -0600159 try:
160 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
161 except WindowsError as e:
162 if e.winerror == 5:
163 self.skipTest('Not permitted to start the child process')
164 else:
165 raise
166
Ezio Melotti794e5572013-05-07 09:34:49 +0300167 out_data, err_data = p.communicate()
168
169 msg = '\n\n'.join(['"Tkinter.py" not in output',
170 'Command:', cmd,
171 'stdout:', out_data,
172 'stderr:', err_data])
173
174 self.assertIn('Tkinter.py', out_data, msg)
175
176 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
177
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000178
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200179 def test_passing_values(self):
180 def passValue(value):
181 return self.interp.call('set', '_', value)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200182
183 self.assertEqual(passValue(True), True if self.wantobjects else '1')
184 self.assertEqual(passValue(False), False if self.wantobjects else '0')
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200185 self.assertEqual(passValue(u'string'), u'string')
186 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
187 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200188 self.assertEqual(passValue(i), i if self.wantobjects else str(i))
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200189 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200190 sys.float_info.min, sys.float_info.max,
191 -sys.float_info.min, -sys.float_info.max):
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200192 if self.wantobjects:
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200193 self.assertEqual(passValue(f), f)
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200194 else:
195 self.assertEqual(float(passValue(f)), f)
196 if self.wantobjects:
197 f = passValue(float('nan'))
198 self.assertNotEqual(f, f)
199 self.assertEqual(passValue(float('inf')), float('inf'))
200 self.assertEqual(passValue(-float('inf')), -float('inf'))
201 else:
202 f = float(passValue(float('nan')))
203 self.assertNotEqual(f, f)
204 self.assertEqual(float(passValue(float('inf'))), float('inf'))
205 self.assertEqual(float(passValue(-float('inf'))), -float('inf'))
206 self.assertEqual(passValue((1, '2', (3.4,))),
207 (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4')
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000208
Serhiy Storchakafab65422013-07-11 20:32:48 +0300209 def test_splitlist(self):
210 splitlist = self.interp.tk.splitlist
211 call = self.interp.tk.call
212 self.assertRaises(TypeError, splitlist)
213 self.assertRaises(TypeError, splitlist, 'a', 'b')
214 self.assertRaises(TypeError, splitlist, 2)
215 testcases = [
216 ('2', ('2',)),
217 ('', ()),
218 ('{}', ('',)),
219 ('""', ('',)),
220 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
221 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
222 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
223 (u'a \u20ac', ('a', '\xe2\x82\xac')),
224 ('a {b c}', ('a', 'b c')),
225 (r'a b\ c', ('a', 'b c')),
226 (('a', 'b c'), ('a', 'b c')),
227 ('a 2', ('a', '2')),
228 (('a', 2), ('a', 2)),
229 ('a 3.4', ('a', '3.4')),
230 (('a', 3.4), ('a', 3.4)),
231 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200232 (call('list', 1, '2', (3.4,)),
233 (1, '2', (3.4,)) if self.wantobjects else
234 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300235 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300236 if tcl_version >= (8, 5):
237 testcases += [
238 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200239 (1, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
240 ('1', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300241 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300242 for arg, res in testcases:
243 self.assertEqual(splitlist(arg), res)
244 self.assertRaises(TclError, splitlist, '{')
245
246 def test_split(self):
247 split = self.interp.tk.split
248 call = self.interp.tk.call
249 self.assertRaises(TypeError, split)
250 self.assertRaises(TypeError, split, 'a', 'b')
251 self.assertRaises(TypeError, split, 2)
252 testcases = [
253 ('2', '2'),
254 ('', ''),
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', u'b c'), ('a', ('b', 'c'))),
266 ('a 2', ('a', '2')),
267 (('a', 2), ('a', 2)),
268 ('a 3.4', ('a', '3.4')),
269 (('a', 3.4), ('a', 3.4)),
270 (('a', (2, 3.4)), ('a', (2, 3.4))),
271 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200272 (call('list', 1, '2', (3.4,)),
273 (1, '2', (3.4,)) if self.wantobjects else
274 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300275 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300276 if tcl_version >= (8, 5):
277 testcases += [
278 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200279 (12, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
280 ('12', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300281 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300282 for arg, res in testcases:
283 self.assertEqual(split(arg), res)
284
Neal Norwitz63dfece2004-02-19 02:37:29 +0000285
Serhiy Storchaka42035702013-08-21 21:46:12 +0300286class BigmemTclTest(unittest.TestCase):
287
288 def setUp(self):
289 self.interp = Tcl()
290
291 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
292 "needs UINT_MAX < SIZE_MAX")
293 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
294 dry_run=False)
295 def test_huge_string(self, size):
296 value = ' ' * size
297 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
298
299
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200300def setUpModule():
301 if test_support.verbose:
302 tcl = Tcl()
303 print 'patchlevel =', tcl.call('info', 'patchlevel')
304
305
Neal Norwitz63dfece2004-02-19 02:37:29 +0000306def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300307 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000308
David Aschere2b4b322004-02-18 05:59:53 +0000309if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000310 test_main()