blob: 0ccede1a7e875c417ac2dd6f431303855c0cdab8 [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()
36
37 def testEval(self):
38 tcl = self.interp
39 tcl.eval('set a 1')
40 self.assertEqual(tcl.eval('set a'),'1')
41
42 def testEvalException(self):
43 tcl = self.interp
44 self.assertRaises(TclError,tcl.eval,'set a')
45
46 def testEvalException2(self):
47 tcl = self.interp
48 self.assertRaises(TclError,tcl.eval,'this is wrong')
49
50 def testCall(self):
51 tcl = self.interp
52 tcl.call('set','a','1')
53 self.assertEqual(tcl.call('set','a'),'1')
54
55 def testCallException(self):
56 tcl = self.interp
57 self.assertRaises(TclError,tcl.call,'set','a')
58
59 def testCallException2(self):
60 tcl = self.interp
61 self.assertRaises(TclError,tcl.call,'this','is','wrong')
62
63 def testSetVar(self):
64 tcl = self.interp
65 tcl.setvar('a','1')
66 self.assertEqual(tcl.eval('set a'),'1')
67
68 def testSetVarArray(self):
69 tcl = self.interp
70 tcl.setvar('a(1)','1')
71 self.assertEqual(tcl.eval('set a(1)'),'1')
72
73 def testGetVar(self):
74 tcl = self.interp
75 tcl.eval('set a 1')
76 self.assertEqual(tcl.getvar('a'),'1')
77
78 def testGetVarArray(self):
79 tcl = self.interp
80 tcl.eval('set a(1) 1')
81 self.assertEqual(tcl.getvar('a(1)'),'1')
82
83 def testGetVarException(self):
84 tcl = self.interp
85 self.assertRaises(TclError,tcl.getvar,'a')
86
87 def testGetVarArrayException(self):
88 tcl = self.interp
89 self.assertRaises(TclError,tcl.getvar,'a(1)')
90
91 def testUnsetVar(self):
92 tcl = self.interp
93 tcl.setvar('a',1)
94 self.assertEqual(tcl.eval('info exists a'),'1')
95 tcl.unsetvar('a')
96 self.assertEqual(tcl.eval('info exists a'),'0')
97
98 def testUnsetVarArray(self):
99 tcl = self.interp
100 tcl.setvar('a(1)',1)
101 tcl.setvar('a(2)',2)
102 self.assertEqual(tcl.eval('info exists a(1)'),'1')
103 self.assertEqual(tcl.eval('info exists a(2)'),'1')
104 tcl.unsetvar('a(1)')
105 self.assertEqual(tcl.eval('info exists a(1)'),'0')
106 self.assertEqual(tcl.eval('info exists a(2)'),'1')
107
108 def testUnsetVarException(self):
109 tcl = self.interp
110 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000111
David Aschere2b4b322004-02-18 05:59:53 +0000112 def testEvalFile(self):
113 tcl = self.interp
114 filename = "testEvalFile.tcl"
115 fd = open(filename,'w')
116 script = """set a 1
117 set b 2
118 set c [ expr $a + $b ]
119 """
120 fd.write(script)
121 fd.close()
122 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000123 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000124 self.assertEqual(tcl.eval('set a'),'1')
125 self.assertEqual(tcl.eval('set b'),'2')
126 self.assertEqual(tcl.eval('set c'),'3')
127
128 def testEvalFileException(self):
129 tcl = self.interp
130 filename = "doesnotexists"
131 try:
132 os.remove(filename)
133 except Exception,e:
134 pass
135 self.assertRaises(TclError,tcl.evalfile,filename)
136
David Aschere2b4b322004-02-18 05:59:53 +0000137 def testPackageRequireException(self):
138 tcl = self.interp
139 self.assertRaises(TclError,tcl.eval,'package require DNE')
140
Zachary Ware57d35c62013-11-03 22:51:25 -0600141 @unittest.skipUnless(sys.platform == 'win32', "only applies to Windows")
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000142 def testLoadWithUNC(self):
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000143 # Build a UNC path from the regular path.
144 # Something like
145 # \\%COMPUTERNAME%\c$\python27\python.exe
146
147 fullname = os.path.abspath(sys.executable)
148 if fullname[1] != ':':
Zachary Ware57d35c62013-11-03 22:51:25 -0600149 self.skipTest('unusable path: %r' % fullname)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000150 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
151 fullname[0],
152 fullname[3:])
153
154 with test_support.EnvironmentVarGuard() as env:
155 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300156 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000157
Zachary Ware57d35c62013-11-03 22:51:25 -0600158 try:
159 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
160 except WindowsError as e:
161 if e.winerror == 5:
162 self.skipTest('Not permitted to start the child process')
163 else:
164 raise
165
Ezio Melotti794e5572013-05-07 09:34:49 +0300166 out_data, err_data = p.communicate()
167
168 msg = '\n\n'.join(['"Tkinter.py" not in output',
169 'Command:', cmd,
170 'stdout:', out_data,
171 'stderr:', err_data])
172
173 self.assertIn('Tkinter.py', out_data, msg)
174
175 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
176
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000177
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200178 def test_passing_values(self):
179 def passValue(value):
180 return self.interp.call('set', '_', value)
181 self.assertEqual(passValue(True), True)
182 self.assertEqual(passValue(False), False)
183 self.assertEqual(passValue('string'), 'string')
184 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
185 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)):
188 self.assertEqual(passValue(i), 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):
192 self.assertEqual(passValue(f), f)
193 for f in float('nan'), float('inf'), -float('inf'):
194 if f != f: # NaN
195 self.assertNotEqual(passValue(f), f)
196 else:
197 self.assertEqual(passValue(f), f)
198 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000199
Serhiy Storchakafab65422013-07-11 20:32:48 +0300200 def test_splitlist(self):
201 splitlist = self.interp.tk.splitlist
202 call = self.interp.tk.call
203 self.assertRaises(TypeError, splitlist)
204 self.assertRaises(TypeError, splitlist, 'a', 'b')
205 self.assertRaises(TypeError, splitlist, 2)
206 testcases = [
207 ('2', ('2',)),
208 ('', ()),
209 ('{}', ('',)),
210 ('""', ('',)),
211 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
212 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
213 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
214 (u'a \u20ac', ('a', '\xe2\x82\xac')),
215 ('a {b c}', ('a', 'b c')),
216 (r'a b\ c', ('a', 'b c')),
217 (('a', 'b c'), ('a', 'b c')),
218 ('a 2', ('a', '2')),
219 (('a', 2), ('a', 2)),
220 ('a 3.4', ('a', '3.4')),
221 (('a', 3.4), ('a', 3.4)),
222 ((), ()),
223 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
224 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300225 if tcl_version >= (8, 5):
226 testcases += [
227 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
228 (1, u'\u20ac', u'\u20ac', (3.4,))),
229 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300230 for arg, res in testcases:
231 self.assertEqual(splitlist(arg), res)
232 self.assertRaises(TclError, splitlist, '{')
233
234 def test_split(self):
235 split = self.interp.tk.split
236 call = self.interp.tk.call
237 self.assertRaises(TypeError, split)
238 self.assertRaises(TypeError, split, 'a', 'b')
239 self.assertRaises(TypeError, split, 2)
240 testcases = [
241 ('2', '2'),
242 ('', ''),
243 ('{}', ''),
244 ('""', ''),
245 ('{', '{'),
246 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
247 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
248 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
249 (u'a \u20ac', ('a', '\xe2\x82\xac')),
250 ('a {b c}', ('a', ('b', 'c'))),
251 (r'a b\ c', ('a', ('b', 'c'))),
252 (('a', 'b c'), ('a', ('b', 'c'))),
253 (('a', u'b c'), ('a', ('b', 'c'))),
254 ('a 2', ('a', '2')),
255 (('a', 2), ('a', 2)),
256 ('a 3.4', ('a', '3.4')),
257 (('a', 3.4), ('a', 3.4)),
258 (('a', (2, 3.4)), ('a', (2, 3.4))),
259 ((), ()),
260 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
261 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300262 if tcl_version >= (8, 5):
263 testcases += [
264 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
265 (12, u'\u20ac', u'\u20ac', (3.4,))),
266 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300267 for arg, res in testcases:
268 self.assertEqual(split(arg), res)
269
Neal Norwitz63dfece2004-02-19 02:37:29 +0000270
Serhiy Storchaka42035702013-08-21 21:46:12 +0300271class BigmemTclTest(unittest.TestCase):
272
273 def setUp(self):
274 self.interp = Tcl()
275
276 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
277 "needs UINT_MAX < SIZE_MAX")
278 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
279 dry_run=False)
280 def test_huge_string(self, size):
281 value = ' ' * size
282 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
283
284
Neal Norwitz63dfece2004-02-19 02:37:29 +0000285def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300286 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000287
David Aschere2b4b322004-02-18 05:59:53 +0000288if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000289 test_main()