source: python/trunk/Lib/test/test_tcl.py

Last change on this file was 391, checked in by dmik, 11 years ago

python: Merge vendor 2.7.6 to trunk.

  • Property svn:eol-style set to native
File size: 9.1 KB
Line 
1#!/usr/bin/env python
2
3import unittest
4import sys
5import os
6import _testcapi
7from test import test_support
8from subprocess import Popen, PIPE
9
10# Skip this test if the _tkinter module wasn't built.
11_tkinter = test_support.import_module('_tkinter')
12
13from Tkinter import Tcl
14from _tkinter import TclError
15
16tcl_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
24
25class TkinterTest(unittest.TestCase):
26
27 def testFlattenLen(self):
28 # flatten(<object with no length>)
29 self.assertRaises(TypeError, _tkinter._flatten, True)
30
31
32class 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')
111
112 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)
123 os.remove(filename)
124 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
137 def testPackageRequireException(self):
138 tcl = self.interp
139 self.assertRaises(TclError,tcl.eval,'package require DNE')
140
141 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")
159 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
160
161 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
173
174 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)
185 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
186 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,)))
195
196 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 ]
221 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 ]
226 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 ]
258 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 ]
263 for arg, res in testcases:
264 self.assertEqual(split(arg), res)
265
266
267class 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
281def test_main():
282 test_support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
283
284if __name__ == "__main__":
285 test_main()
Note: See TracBrowser for help on using the repository browser.