blob: 3da87d9b253a685b68b3bad58836311ef7428690 [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
Neal Norwitz63dfece2004-02-19 02:37:29 +00006from test import test_support
Ezio Melotti794e5572013-05-07 09:34:49 +03007from subprocess import Popen, PIPE
R. David Murray597ebab2009-03-31 18:32:17 +00008
9# Skip this test if the _tkinter module wasn't built.
10_tkinter = test_support.import_module('_tkinter')
11
Guilherme Polo8e5e4382009-02-07 02:20:29 +000012from Tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000013from _tkinter import TclError
14
Benjamin Petersonb3619be2009-01-30 02:24:39 +000015
16class TkinterTest(unittest.TestCase):
17
18 def testFlattenLen(self):
19 # flatten(<object with no length>)
20 self.assertRaises(TypeError, _tkinter._flatten, True)
21
22
David Aschere2b4b322004-02-18 05:59:53 +000023class TclTest(unittest.TestCase):
24
25 def setUp(self):
26 self.interp = Tcl()
27
28 def testEval(self):
29 tcl = self.interp
30 tcl.eval('set a 1')
31 self.assertEqual(tcl.eval('set a'),'1')
32
33 def testEvalException(self):
34 tcl = self.interp
35 self.assertRaises(TclError,tcl.eval,'set a')
36
37 def testEvalException2(self):
38 tcl = self.interp
39 self.assertRaises(TclError,tcl.eval,'this is wrong')
40
41 def testCall(self):
42 tcl = self.interp
43 tcl.call('set','a','1')
44 self.assertEqual(tcl.call('set','a'),'1')
45
46 def testCallException(self):
47 tcl = self.interp
48 self.assertRaises(TclError,tcl.call,'set','a')
49
50 def testCallException2(self):
51 tcl = self.interp
52 self.assertRaises(TclError,tcl.call,'this','is','wrong')
53
54 def testSetVar(self):
55 tcl = self.interp
56 tcl.setvar('a','1')
57 self.assertEqual(tcl.eval('set a'),'1')
58
59 def testSetVarArray(self):
60 tcl = self.interp
61 tcl.setvar('a(1)','1')
62 self.assertEqual(tcl.eval('set a(1)'),'1')
63
64 def testGetVar(self):
65 tcl = self.interp
66 tcl.eval('set a 1')
67 self.assertEqual(tcl.getvar('a'),'1')
68
69 def testGetVarArray(self):
70 tcl = self.interp
71 tcl.eval('set a(1) 1')
72 self.assertEqual(tcl.getvar('a(1)'),'1')
73
74 def testGetVarException(self):
75 tcl = self.interp
76 self.assertRaises(TclError,tcl.getvar,'a')
77
78 def testGetVarArrayException(self):
79 tcl = self.interp
80 self.assertRaises(TclError,tcl.getvar,'a(1)')
81
82 def testUnsetVar(self):
83 tcl = self.interp
84 tcl.setvar('a',1)
85 self.assertEqual(tcl.eval('info exists a'),'1')
86 tcl.unsetvar('a')
87 self.assertEqual(tcl.eval('info exists a'),'0')
88
89 def testUnsetVarArray(self):
90 tcl = self.interp
91 tcl.setvar('a(1)',1)
92 tcl.setvar('a(2)',2)
93 self.assertEqual(tcl.eval('info exists a(1)'),'1')
94 self.assertEqual(tcl.eval('info exists a(2)'),'1')
95 tcl.unsetvar('a(1)')
96 self.assertEqual(tcl.eval('info exists a(1)'),'0')
97 self.assertEqual(tcl.eval('info exists a(2)'),'1')
98
99 def testUnsetVarException(self):
100 tcl = self.interp
101 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000102
David Aschere2b4b322004-02-18 05:59:53 +0000103 def testEvalFile(self):
104 tcl = self.interp
105 filename = "testEvalFile.tcl"
106 fd = open(filename,'w')
107 script = """set a 1
108 set b 2
109 set c [ expr $a + $b ]
110 """
111 fd.write(script)
112 fd.close()
113 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000114 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000115 self.assertEqual(tcl.eval('set a'),'1')
116 self.assertEqual(tcl.eval('set b'),'2')
117 self.assertEqual(tcl.eval('set c'),'3')
118
119 def testEvalFileException(self):
120 tcl = self.interp
121 filename = "doesnotexists"
122 try:
123 os.remove(filename)
124 except Exception,e:
125 pass
126 self.assertRaises(TclError,tcl.evalfile,filename)
127
David Aschere2b4b322004-02-18 05:59:53 +0000128 def testPackageRequireException(self):
129 tcl = self.interp
130 self.assertRaises(TclError,tcl.eval,'package require DNE')
131
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000132 def testLoadWithUNC(self):
133 import sys
134 if sys.platform != 'win32':
135 return
136
137 # Build a UNC path from the regular path.
138 # Something like
139 # \\%COMPUTERNAME%\c$\python27\python.exe
140
141 fullname = os.path.abspath(sys.executable)
142 if fullname[1] != ':':
143 return
144 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
145 fullname[0],
146 fullname[3:])
147
148 with test_support.EnvironmentVarGuard() as env:
149 env.unset("TCL_LIBRARY")
Ezio Melotti794e5572013-05-07 09:34:49 +0300150 cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000151
Ezio Melotti794e5572013-05-07 09:34:49 +0300152 p = Popen(cmd, stdout=PIPE, stderr=PIPE)
153 out_data, err_data = p.communicate()
154
155 msg = '\n\n'.join(['"Tkinter.py" not in output',
156 'Command:', cmd,
157 'stdout:', out_data,
158 'stderr:', err_data])
159
160 self.assertIn('Tkinter.py', out_data, msg)
161
162 self.assertEqual(p.wait(), 0, 'Non-zero exit code')
163
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000164
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200165 def test_passing_values(self):
166 def passValue(value):
167 return self.interp.call('set', '_', value)
168 self.assertEqual(passValue(True), True)
169 self.assertEqual(passValue(False), False)
170 self.assertEqual(passValue('string'), 'string')
171 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
172 self.assertEqual(passValue(u'string'), u'string')
173 self.assertEqual(passValue(u'string\u20ac'), u'string\u20ac')
174 for i in (0, 1, -1, int(2**31-1), int(-2**31)):
175 self.assertEqual(passValue(i), i)
Ezio Melotti0a4a7e12013-02-23 08:19:00 +0200176 for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
Serhiy Storchaka4a880412013-02-07 15:37:53 +0200177 sys.float_info.min, sys.float_info.max,
178 -sys.float_info.min, -sys.float_info.max):
179 self.assertEqual(passValue(f), f)
180 for f in float('nan'), float('inf'), -float('inf'):
181 if f != f: # NaN
182 self.assertNotEqual(passValue(f), f)
183 else:
184 self.assertEqual(passValue(f), f)
185 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwiseba67c02010-06-04 19:39:07 +0000186
Serhiy Storchakafab65422013-07-11 20:32:48 +0300187 def test_splitlist(self):
188 splitlist = self.interp.tk.splitlist
189 call = self.interp.tk.call
190 self.assertRaises(TypeError, splitlist)
191 self.assertRaises(TypeError, splitlist, 'a', 'b')
192 self.assertRaises(TypeError, splitlist, 2)
193 testcases = [
194 ('2', ('2',)),
195 ('', ()),
196 ('{}', ('',)),
197 ('""', ('',)),
198 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
199 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
200 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
201 (u'a \u20ac', ('a', '\xe2\x82\xac')),
202 ('a {b c}', ('a', 'b c')),
203 (r'a b\ c', ('a', 'b c')),
204 (('a', 'b c'), ('a', 'b c')),
205 ('a 2', ('a', '2')),
206 (('a', 2), ('a', 2)),
207 ('a 3.4', ('a', '3.4')),
208 (('a', 3.4), ('a', 3.4)),
209 ((), ()),
210 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
211 ]
212 for arg, res in testcases:
213 self.assertEqual(splitlist(arg), res)
214 self.assertRaises(TclError, splitlist, '{')
215
216 def test_split(self):
217 split = self.interp.tk.split
218 call = self.interp.tk.call
219 self.assertRaises(TypeError, split)
220 self.assertRaises(TypeError, split, 'a', 'b')
221 self.assertRaises(TypeError, split, 2)
222 testcases = [
223 ('2', '2'),
224 ('', ''),
225 ('{}', ''),
226 ('""', ''),
227 ('{', '{'),
228 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
229 (u'a\n b\t\r c\n ', ('a', 'b', 'c')),
230 ('a \xe2\x82\xac', ('a', '\xe2\x82\xac')),
231 (u'a \u20ac', ('a', '\xe2\x82\xac')),
232 ('a {b c}', ('a', ('b', 'c'))),
233 (r'a b\ c', ('a', ('b', 'c'))),
234 (('a', 'b c'), ('a', ('b', 'c'))),
235 (('a', u'b c'), ('a', ('b', 'c'))),
236 ('a 2', ('a', '2')),
237 (('a', 2), ('a', 2)),
238 ('a 3.4', ('a', '3.4')),
239 (('a', 3.4), ('a', 3.4)),
240 (('a', (2, 3.4)), ('a', (2, 3.4))),
241 ((), ()),
242 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
243 ]
244 for arg, res in testcases:
245 self.assertEqual(split(arg), res)
246
Neal Norwitz63dfece2004-02-19 02:37:29 +0000247
248def test_main():
Benjamin Petersonb3619be2009-01-30 02:24:39 +0000249 test_support.run_unittest(TclTest, TkinterTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000250
David Aschere2b4b322004-02-18 05:59:53 +0000251if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000252 test_main()