blob: d02b4394114fc386f9204be5342625041db35e32 [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 Storchakafab65422013-07-11 20:32:48 +0300207 def test_splitlist(self):
208 splitlist = self.interp.tk.splitlist
209 call = self.interp.tk.call
210 self.assertRaises(TypeError, splitlist)
211 self.assertRaises(TypeError, splitlist, 'a', 'b')
212 self.assertRaises(TypeError, splitlist, 2)
213 testcases = [
214 ('2', ('2',)),
215 ('', ()),
216 ('{}', ('',)),
217 ('""', ('',)),
218 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
219 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
220 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
221 (u'a \u20ac', ('a', '\xe2\x82\xac')),
222 ('a {b c}', ('a', 'b c')),
223 (r'a b\ c', ('a', 'b c')),
224 (('a', 'b c'), ('a', 'b c')),
225 ('a 2', ('a', '2')),
226 (('a', 2), ('a', 2)),
227 ('a 3.4', ('a', '3.4')),
228 (('a', 3.4), ('a', 3.4)),
229 ((), ()),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200230 (call('list', 1, '2', (3.4,)),
231 (1, '2', (3.4,)) if self.wantobjects else
232 ('1', '2', '3.4')),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300233 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300234 if tcl_version >= (8, 5):
235 testcases += [
236 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200237 (1, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
238 ('1', '\xe2\x82\xac', '\xe2\x82\xac', '3.4')),
Serhiy Storchaka94025332013-09-08 20:32:56 +0300239 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300240 for arg, res in testcases:
241 self.assertEqual(splitlist(arg), res)
242 self.assertRaises(TclError, splitlist, '{')
243
244 def test_split(self):
245 split = self.interp.tk.split
246 call = self.interp.tk.call
247 self.assertRaises(TypeError, split)
248 self.assertRaises(TypeError, split, 'a', 'b')
249 self.assertRaises(TypeError, split, 2)
250 testcases = [
251 ('2', '2'),
252 ('', ''),
253 ('{}', ''),
254 ('""', ''),
255 ('{', '{'),
256 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
257 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
258 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
259 (u'a \u20ac', ('a', '\xe2\x82\xac')),
260 ('a {b c}', ('a', ('b', 'c'))),
261 (r'a b\ c', ('a', ('b', 'c'))),
262 (('a', 'b c'), ('a', ('b', 'c'))),
263 (('a', u'b c'), ('a', ('b', 'c'))),
264 ('a 2', ('a', '2')),
265 (('a', 2), ('a', 2)),
266 ('a 3.4', ('a', '3.4')),
267 (('a', 3.4), ('a', 3.4)),
268 (('a', (2, 3.4)), ('a', (2, 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', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
Serhiy Storchaka5542b152013-12-25 17:28:50 +0200277 (12, u'\u20ac', u'\u20ac', (3.4,)) if self.wantobjects else
278 ('12', '\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(split(arg), res)
282
Neal Norwitz63dfece2004-02-19 02:37:29 +0000283
Serhiy Storchaka42035702013-08-21 21:46:12 +0300284class BigmemTclTest(unittest.TestCase):
285
286 def setUp(self):
287 self.interp = Tcl()
288
289 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
290 "needs UINT_MAX < SIZE_MAX")
291 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
292 dry_run=False)
293 def test_huge_string(self, size):
294 value = ' ' * size
295 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
296
297
Serhiy Storchaka78ecaba2013-11-20 17:44:38 +0200298def setUpModule():
299 if test_support.verbose:
300 tcl = Tcl()
301 print 'patchlevel =', tcl.call('info', 'patchlevel')
302
303
Neal Norwitz63dfece2004-02-19 02:37:29 +0000304def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300305 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000306
David Aschere2b4b322004-02-18 05:59:53 +0000307if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000308 test_main()