blob: 346026236654bf24bc6a2f14ee3457472981bb9d [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,))),
212 ]
213 for arg, res in testcases:
214 self.assertEqual(splitlist(arg), res)
215 self.assertRaises(TclError, splitlist, '{')
216
217 def test_split(self):
218 split = self.interp.tk.split
219 call = self.interp.tk.call
220 self.assertRaises(TypeError, split)
221 self.assertRaises(TypeError, split, 'a', 'b')
222 self.assertRaises(TypeError, split, 2)
223 testcases = [
224 ('2', '2'),
225 ('', ''),
226 ('{}', ''),
227 ('""', ''),
228 ('{', '{'),
229 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
230 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
231 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
232 (u'a \u20ac', ('a', '\xe2\x82\xac')),
233 ('a {b c}', ('a', ('b', 'c'))),
234 (r'a b\ c', ('a', ('b', 'c'))),
235 (('a', 'b c'), ('a', ('b', 'c'))),
236 (('a', u'b c'), ('a', ('b', 'c'))),
237 ('a 2', ('a', '2')),
238 (('a', 2), ('a', 2)),
239 ('a 3.4', ('a', '3.4')),
240 (('a', 3.4), ('a', 3.4)),
241 (('a', (2, 3.4)), ('a', (2, 3.4))),
242 ((), ()),
243 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
244 ]
245 for arg, res in testcases:
246 self.assertEqual(split(arg), res)
247
Neal Norwitz63dfece2004-02-19 02:37:29 +0000248
Serhiy Storchaka42035702013-08-21 21:46:12 +0300249class BigmemTclTest(unittest.TestCase):
250
251 def setUp(self):
252 self.interp = Tcl()
253
254 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
255 "needs UINT_MAX < SIZE_MAX")
256 @test_support.precisionbigmemtest(size=_testcapi.INT_MAX + 1, memuse=5,
257 dry_run=False)
258 def test_huge_string(self, size):
259 value = ' ' * size
260 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
261
262
Neal Norwitz63dfece2004-02-19 02:37:29 +0000263def test_main():
Serhiy Storchaka42035702013-08-21 21:46:12 +0300264 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000265
David Aschere2b4b322004-02-18 05:59:53 +0000266if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000267 test_main()