blob: 50e1ac40acf9a1ec8b6d78761b9df80a62e55348 [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
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000141 def testLoadWithUNC(self):
142 import sys
143 if sys.platform != 'win32':
144 return
145
146 # Build a UNC path from the regular path.
147 # Something like
148 # \\%COMPUTERNAME%\c$\python27\python.exe
149
150 fullname = os.path.abspath(sys.executable)
151 if fullname[1] != ':':
152 return
153 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
154 fullname[0],
155 fullname[3:])
156
157 with test_support.EnvironmentVarGuard() as env:
158 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300159 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000160
Ezio Melotti794e5572013-05-07 09:34:49 +0300161 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
162 out_data, err_data = p.communicate()
163
164 msg = '\n\n'.join(['"Tkinter.py" not in output',
165 'Command:', cmd,
166 'stdout:', out_data,
167 'stderr:', err_data])
168
169 self.assertIn('Tkinter.py', out_data, msg)
170
171 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
172
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000173
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200174 def test_passing_values(self):
175 def passValue(value):
176 return self.interp.call('set', '_', value)
177 self.assertEqual(passValue(True), True)
178 self.assertEqual(passValue(False), False)
179 self.assertEqual(passValue('string'), 'string')
180 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
181 self.assertEqual(passValue(u'string'), u'string')
182 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
183 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
184 self.assertEqual(passValue(i), i)
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200185 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200186 sys.float_info.min, sys.float_info.max,
187 -sys.float_info.min, -sys.float_info.max):
188 self.assertEqual(passValue(f), f)
189 for f in float('nan'), float('inf'), -float('inf'):
190 if f != f: # NaN
191 self.assertNotEqual(passValue(f), f)
192 else:
193 self.assertEqual(passValue(f), f)
194 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000195
Serhiy Storchakafab65422013-07-11 20:32:48 +0300196 def test_splitlist(self):
197 splitlist = self.interp.tk.splitlist
198 call = self.interp.tk.call
199 self.assertRaises(TypeError, splitlist)
200 self.assertRaises(TypeError, splitlist, 'a', 'b')
201 self.assertRaises(TypeError, splitlist, 2)
202 testcases = [
203 ('2', ('2',)),
204 ('', ()),
205 ('{}', ('',)),
206 ('""', ('',)),
207 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
208 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
209 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
210 (u'a \u20ac', ('a', '\xe2\x82\xac')),
211 ('a {b c}', ('a', 'b c')),
212 (r'a b\ c', ('a', 'b c')),
213 (('a', 'b c'), ('a', 'b c')),
214 ('a 2', ('a', '2')),
215 (('a', 2), ('a', 2)),
216 ('a 3.4', ('a', '3.4')),
217 (('a', 3.4), ('a', 3.4)),
218 ((), ()),
219 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
220 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300221 if tcl_version >= (8, 5):
222 testcases += [
223 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
224 (1, u'\u20ac', u'\u20ac', (3.4,))),
225 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300226 for arg, res in testcases:
227 self.assertEqual(splitlist(arg), res)
228 self.assertRaises(TclError, splitlist, '{')
229
230 def test_split(self):
231 split = self.interp.tk.split
232 call = self.interp.tk.call
233 self.assertRaises(TypeError, split)
234 self.assertRaises(TypeError, split, 'a', 'b')
235 self.assertRaises(TypeError, split, 2)
236 testcases = [
237 ('2', '2'),
238 ('', ''),
239 ('{}', ''),
240 ('""', ''),
241 ('{', '{'),
242 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
243 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
244 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
245 (u'a \u20ac', ('a', '\xe2\x82\xac')),
246 ('a {b c}', ('a', ('b', 'c'))),
247 (r'a b\ c', ('a', ('b', 'c'))),
248 (('a', 'b c'), ('a', ('b', 'c'))),
249 (('a', u'b c'), ('a', ('b', 'c'))),
250 ('a 2', ('a', '2')),
251 (('a', 2), ('a', 2)),
252 ('a 3.4', ('a', '3.4')),
253 (('a', 3.4), ('a', 3.4)),
254 (('a', (2, 3.4)), ('a', (2, 3.4))),
255 ((), ()),
256 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
257 ]
Serhiy Storchaka94025332013-09-08 20:32:56 +0300258 if tcl_version >= (8, 5):
259 testcases += [
260 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
261 (12, u'\u20ac', u'\u20ac', (3.4,))),
262 ]
Serhiy Storchakafab65422013-07-11 20:32:48 +0300263 for arg, res in testcases:
264 self.assertEqual(split(arg), res)
265
Neal Norwitz63dfece2004-02-19 02:37:29 +0000266
Serhiy Storchaka42035702013-08-21 21:46:12 +0300267class BigmemTclTest(unittest.TestCase):
268
269 def setUp(self):
270 self.interp = Tcl()
271
272 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
273 "needs UINT_MAX < SIZE_MAX")
274 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
275 dry_run=False)
276 def test_huge_string(self, size):
277 value = ' ' * size
278 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
279
280
Neal Norwitz63dfece2004-02-19 02:37:29 +0000281def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300282 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000283
David Aschere2b4b322004-02-18 05:59:53 +0000284if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000285 test_main()