blob: 1e60b1d1a8dae470783205e45e32981f4603730b [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
Benjamin Petersonb3619be2009-01-30 02:24:39 +000016
17class TkinterTest(unittest.TestCase):
18
19 def testFlattenLen(self):
20 # flatten(<object with no length>)
21 self.assertRaises(TypeError, _tkinter._flatten, True)
22
23
David Aschere2b4b322004-02-18 05:59:53 +000024class TclTest(unittest.TestCase):
25
26 def setUp(self):
27 self.interp = Tcl()
28
29 def testEval(self):
30 tcl = self.interp
31 tcl.eval('set a 1')
32 self.assertEqual(tcl.eval('set a'),'1')
33
34 def testEvalException(self):
35 tcl = self.interp
36 self.assertRaises(TclError,tcl.eval,'set a')
37
38 def testEvalException2(self):
39 tcl = self.interp
40 self.assertRaises(TclError,tcl.eval,'this is wrong')
41
42 def testCall(self):
43 tcl = self.interp
44 tcl.call('set','a','1')
45 self.assertEqual(tcl.call('set','a'),'1')
46
47 def testCallException(self):
48 tcl = self.interp
49 self.assertRaises(TclError,tcl.call,'set','a')
50
51 def testCallException2(self):
52 tcl = self.interp
53 self.assertRaises(TclError,tcl.call,'this','is','wrong')
54
55 def testSetVar(self):
56 tcl = self.interp
57 tcl.setvar('a','1')
58 self.assertEqual(tcl.eval('set a'),'1')
59
60 def testSetVarArray(self):
61 tcl = self.interp
62 tcl.setvar('a(1)','1')
63 self.assertEqual(tcl.eval('set a(1)'),'1')
64
65 def testGetVar(self):
66 tcl = self.interp
67 tcl.eval('set a 1')
68 self.assertEqual(tcl.getvar('a'),'1')
69
70 def testGetVarArray(self):
71 tcl = self.interp
72 tcl.eval('set a(1) 1')
73 self.assertEqual(tcl.getvar('a(1)'),'1')
74
75 def testGetVarException(self):
76 tcl = self.interp
77 self.assertRaises(TclError,tcl.getvar,'a')
78
79 def testGetVarArrayException(self):
80 tcl = self.interp
81 self.assertRaises(TclError,tcl.getvar,'a(1)')
82
83 def testUnsetVar(self):
84 tcl = self.interp
85 tcl.setvar('a',1)
86 self.assertEqual(tcl.eval('info exists a'),'1')
87 tcl.unsetvar('a')
88 self.assertEqual(tcl.eval('info exists a'),'0')
89
90 def testUnsetVarArray(self):
91 tcl = self.interp
92 tcl.setvar('a(1)',1)
93 tcl.setvar('a(2)',2)
94 self.assertEqual(tcl.eval('info exists a(1)'),'1')
95 self.assertEqual(tcl.eval('info exists a(2)'),'1')
96 tcl.unsetvar('a(1)')
97 self.assertEqual(tcl.eval('info exists a(1)'),'0')
98 self.assertEqual(tcl.eval('info exists a(2)'),'1')
99
100 def testUnsetVarException(self):
101 tcl = self.interp
102 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000103
David Aschere2b4b322004-02-18 05:59:53 +0000104 def testEvalFile(self):
105 tcl = self.interp
106 filename = "testEvalFile.tcl"
107 fd = open(filename,'w')
108 script = """set a 1
109 set b 2
110 set c [ expr $a + $b ]
111 """
112 fd.write(script)
113 fd.close()
114 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000115 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000116 self.assertEqual(tcl.eval('set a'),'1')
117 self.assertEqual(tcl.eval('set b'),'2')
118 self.assertEqual(tcl.eval('set c'),'3')
119
120 def testEvalFileException(self):
121 tcl = self.interp
122 filename = "doesnotexists"
123 try:
124 os.remove(filename)
125 except Exception,e:
126 pass
127 self.assertRaises(TclError,tcl.evalfile,filename)
128
David Aschere2b4b322004-02-18 05:59:53 +0000129 def testPackageRequireException(self):
130 tcl = self.interp
131 self.assertRaises(TclError,tcl.eval,'package require DNE')
132
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000133 def testLoadWithUNC(self):
134 import sys
135 if sys.platform != 'win32':
136 return
137
138 # Build a UNC path from the regular path.
139 # Something like
140 # \\%COMPUTERNAME%\c$\python27\python.exe
141
142 fullname = os.path.abspath(sys.executable)
143 if fullname[1] != ':':
144 return
145 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
146 fullname[0],
147 fullname[3:])
148
149 with test_support.EnvironmentVarGuard() as env:
150 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300151 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000152
Ezio Melotti794e5572013-05-07 09:34:49 +0300153 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
154 out_data, err_data = p.communicate()
155
156 msg = '\n\n'.join(['"Tkinter.py" not in output',
157 'Command:', cmd,
158 'stdout:', out_data,
159 'stderr:', err_data])
160
161 self.assertIn('Tkinter.py', out_data, msg)
162
163 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
164
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000165
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200166 def test_passing_values(self):
167 def passValue(value):
168 return self.interp.call('set', '_', value)
169 self.assertEqual(passValue(True), True)
170 self.assertEqual(passValue(False), False)
171 self.assertEqual(passValue('string'), 'string')
172 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
173 self.assertEqual(passValue(u'string'), u'string')
174 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
175 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
176 self.assertEqual(passValue(i), i)
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200177 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200178 sys.float_info.min, sys.float_info.max,
179 -sys.float_info.min, -sys.float_info.max):
180 self.assertEqual(passValue(f), f)
181 for f in float('nan'), float('inf'), -float('inf'):
182 if f != f: # NaN
183 self.assertNotEqual(passValue(f), f)
184 else:
185 self.assertEqual(passValue(f), f)
186 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000187
Serhiy Storchakafab65422013-07-11 20:32:48 +0300188 def test_splitlist(self):
189 splitlist = self.interp.tk.splitlist
190 call = self.interp.tk.call
191 self.assertRaises(TypeError, splitlist)
192 self.assertRaises(TypeError, splitlist, 'a', 'b')
193 self.assertRaises(TypeError, splitlist, 2)
194 testcases = [
195 ('2', ('2',)),
196 ('', ()),
197 ('{}', ('',)),
198 ('""', ('',)),
199 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
200 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
201 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
202 (u'a \u20ac', ('a', '\xe2\x82\xac')),
203 ('a {b c}', ('a', 'b c')),
204 (r'a b\ c', ('a', 'b c')),
205 (('a', 'b c'), ('a', 'b c')),
206 ('a 2', ('a', '2')),
207 (('a', 2), ('a', 2)),
208 ('a 3.4', ('a', '3.4')),
209 (('a', 3.4), ('a', 3.4)),
210 ((), ()),
211 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
Serhiy Storchaka2ac1c1a2013-08-22 17:42:45 +0300212 (call('dict', 'create', 1, u'\u20ac', '\xe2\x82\xac', (3.4,)),
213 (1, u'\u20ac', u'\u20ac', (3.4,))),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300214 ]
215 for arg, res in testcases:
216 self.assertEqual(splitlist(arg), res)
217 self.assertRaises(TclError, splitlist, '{')
218
219 def test_split(self):
220 split = self.interp.tk.split
221 call = self.interp.tk.call
222 self.assertRaises(TypeError, split)
223 self.assertRaises(TypeError, split, 'a', 'b')
224 self.assertRaises(TypeError, split, 2)
225 testcases = [
226 ('2', '2'),
227 ('', ''),
228 ('{}', ''),
229 ('""', ''),
230 ('{', '{'),
231 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
232 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
233 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
234 (u'a \u20ac', ('a', '\xe2\x82\xac')),
235 ('a {b c}', ('a', ('b', 'c'))),
236 (r'a b\ c', ('a', ('b', 'c'))),
237 (('a', 'b c'), ('a', ('b', 'c'))),
238 (('a', u'b c'), ('a', ('b', 'c'))),
239 ('a 2', ('a', '2')),
240 (('a', 2), ('a', 2)),
241 ('a 3.4', ('a', '3.4')),
242 (('a', 3.4), ('a', 3.4)),
243 (('a', (2, 3.4)), ('a', (2, 3.4))),
244 ((), ()),
245 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
Serhiy Storchaka2ac1c1a2013-08-22 17:42:45 +0300246 (call('dict', 'create', 12, u'\u20ac', '\xe2\x82\xac', (3.4,)),
247 (12, u'\u20ac', u'\u20ac', (3.4,))),
Serhiy Storchakafab65422013-07-11 20:32:48 +0300248 ]
249 for arg, res in testcases:
250 self.assertEqual(split(arg), res)
251
Neal Norwitz63dfece2004-02-19 02:37:29 +0000252
Serhiy Storchaka42035702013-08-21 21:46:12 +0300253class BigmemTclTest(unittest.TestCase):
254
255 def setUp(self):
256 self.interp = Tcl()
257
258 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
259 "needs UINT_MAX < SIZE_MAX")
260 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
261 dry_run=False)
262 def test_huge_string(self, size):
263 value = ' ' * size
264 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
265
266
Neal Norwitz63dfece2004-02-19 02:37:29 +0000267def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300268 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000269
David Aschere2b4b322004-02-18 05:59:53 +0000270if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000271 test_main()