blob: a5aaf9b72528168625a4c643faa8f71fea721ae6 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
David Aschere2b4b322004-02-18 05:59:53 +00002
3import unittest
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +00004import sys
David Aschere2b4b322004-02-18 05:59:53 +00005import os
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
R. David Murraya21e4ca2009-03-31 23:16:50 +00007
8# Skip this test if the _tkinter module wasn't built.
9_tkinter = support.import_module('_tkinter')
10
Terry Jan Reedy743c85a2013-03-16 02:37:06 -040011# Make sure tkinter._fix runs to set up the environment
12support.import_fresh_module('tkinter')
13
Guilherme Polofa8fba92009-02-07 02:33:47 +000014from tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000015from _tkinter import TclError
16
Benjamin Petersonc4bbc8d2009-01-30 03:39:35 +000017
18class TkinterTest(unittest.TestCase):
19
20 def testFlattenLen(self):
21 # flatten(<object with no length>)
22 self.assertRaises(TypeError, _tkinter._flatten, True)
23
24
David Aschere2b4b322004-02-18 05:59:53 +000025class TclTest(unittest.TestCase):
26
27 def setUp(self):
28 self.interp = Tcl()
29
30 def testEval(self):
31 tcl = self.interp
32 tcl.eval('set a 1')
33 self.assertEqual(tcl.eval('set a'),'1')
34
35 def testEvalException(self):
36 tcl = self.interp
37 self.assertRaises(TclError,tcl.eval,'set a')
38
39 def testEvalException2(self):
40 tcl = self.interp
41 self.assertRaises(TclError,tcl.eval,'this is wrong')
42
43 def testCall(self):
44 tcl = self.interp
45 tcl.call('set','a','1')
46 self.assertEqual(tcl.call('set','a'),'1')
47
48 def testCallException(self):
49 tcl = self.interp
50 self.assertRaises(TclError,tcl.call,'set','a')
51
52 def testCallException2(self):
53 tcl = self.interp
54 self.assertRaises(TclError,tcl.call,'this','is','wrong')
55
56 def testSetVar(self):
57 tcl = self.interp
58 tcl.setvar('a','1')
59 self.assertEqual(tcl.eval('set a'),'1')
60
61 def testSetVarArray(self):
62 tcl = self.interp
63 tcl.setvar('a(1)','1')
64 self.assertEqual(tcl.eval('set a(1)'),'1')
65
66 def testGetVar(self):
67 tcl = self.interp
68 tcl.eval('set a 1')
69 self.assertEqual(tcl.getvar('a'),'1')
70
71 def testGetVarArray(self):
72 tcl = self.interp
73 tcl.eval('set a(1) 1')
74 self.assertEqual(tcl.getvar('a(1)'),'1')
75
76 def testGetVarException(self):
77 tcl = self.interp
78 self.assertRaises(TclError,tcl.getvar,'a')
79
80 def testGetVarArrayException(self):
81 tcl = self.interp
82 self.assertRaises(TclError,tcl.getvar,'a(1)')
83
84 def testUnsetVar(self):
85 tcl = self.interp
86 tcl.setvar('a',1)
87 self.assertEqual(tcl.eval('info exists a'),'1')
88 tcl.unsetvar('a')
89 self.assertEqual(tcl.eval('info exists a'),'0')
90
91 def testUnsetVarArray(self):
92 tcl = self.interp
93 tcl.setvar('a(1)',1)
94 tcl.setvar('a(2)',2)
95 self.assertEqual(tcl.eval('info exists a(1)'),'1')
96 self.assertEqual(tcl.eval('info exists a(2)'),'1')
97 tcl.unsetvar('a(1)')
98 self.assertEqual(tcl.eval('info exists a(1)'),'0')
99 self.assertEqual(tcl.eval('info exists a(2)'),'1')
100
101 def testUnsetVarException(self):
102 tcl = self.interp
103 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000104
David Aschere2b4b322004-02-18 05:59:53 +0000105 def testEvalFile(self):
106 tcl = self.interp
107 filename = "testEvalFile.tcl"
108 fd = open(filename,'w')
109 script = """set a 1
110 set b 2
111 set c [ expr $a + $b ]
112 """
113 fd.write(script)
114 fd.close()
115 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000116 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000117 self.assertEqual(tcl.eval('set a'),'1')
118 self.assertEqual(tcl.eval('set b'),'2')
119 self.assertEqual(tcl.eval('set c'),'3')
120
121 def testEvalFileException(self):
122 tcl = self.interp
123 filename = "doesnotexists"
124 try:
125 os.remove(filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000126 except Exception as e:
David Aschere2b4b322004-02-18 05:59:53 +0000127 pass
128 self.assertRaises(TclError,tcl.evalfile,filename)
129
David Aschere2b4b322004-02-18 05:59:53 +0000130 def testPackageRequireException(self):
131 tcl = self.interp
132 self.assertRaises(TclError,tcl.eval,'package require DNE')
133
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000134 @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000135 def testLoadWithUNC(self):
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000136 # Build a UNC path from the regular path.
137 # Something like
138 # \\%COMPUTERNAME%\c$\python27\python.exe
139
140 fullname = os.path.abspath(sys.executable)
141 if fullname[1] != ':':
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000142 raise unittest.SkipTest('Absolute path should have drive part')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000143 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
144 fullname[0],
145 fullname[3:])
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000146 if not os.path.exists(unc_name):
147 raise unittest.SkipTest('Cannot connect to UNC Path')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000148
Georg Brandlec5ae3b2010-07-31 19:17:11 +0000149 with support.EnvironmentVarGuard() as env:
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000150 env.unset("TCL_LIBRARY")
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000151 f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000152
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000153 self.assertIn('tkinter', f.read())
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000154 # exit code must be zero
155 self.assertEqual(f.close(), None)
156
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200157 def test_passing_values(self):
158 def passValue(value):
159 return self.interp.call('set', '_', value)
160
161 self.assertEqual(passValue(True), True)
162 self.assertEqual(passValue(False), False)
163 self.assertEqual(passValue('string'), 'string')
164 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
165 for i in (0, 1, -1, 2**31-1, -2**31):
166 self.assertEqual(passValue(i), i)
167 for f in (0.0, 1.0, -1.0, 1/3,
168 sys.float_info.min, sys.float_info.max,
169 -sys.float_info.min, -sys.float_info.max):
170 self.assertEqual(passValue(f), f)
171 for f in float('nan'), float('inf'), -float('inf'):
172 if f != f: # NaN
173 self.assertNotEqual(passValue(f), f)
174 else:
175 self.assertEqual(passValue(f), f)
176 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000177
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300178 def test_splitlist(self):
179 splitlist = self.interp.tk.splitlist
180 call = self.interp.tk.call
181 self.assertRaises(TypeError, splitlist)
182 self.assertRaises(TypeError, splitlist, 'a', 'b')
183 self.assertRaises(TypeError, splitlist, 2)
184 testcases = [
185 ('2', ('2',)),
186 ('', ()),
187 ('{}', ('',)),
188 ('""', ('',)),
189 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
190 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
191 ('a \u20ac', ('a', '\u20ac')),
192 (b'a \xe2\x82\xac', ('a', '\u20ac')),
193 ('a {b c}', ('a', 'b c')),
194 (r'a b\ c', ('a', 'b c')),
195 (('a', 'b c'), ('a', 'b c')),
196 ('a 2', ('a', '2')),
197 (('a', 2), ('a', 2)),
198 ('a 3.4', ('a', '3.4')),
199 (('a', 3.4), ('a', 3.4)),
200 ((), ()),
201 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
202 ]
203 for arg, res in testcases:
204 self.assertEqual(splitlist(arg), res, msg=arg)
205 self.assertRaises(TclError, splitlist, '{')
206
207 def test_split(self):
208 split = self.interp.tk.split
209 call = self.interp.tk.call
210 self.assertRaises(TypeError, split)
211 self.assertRaises(TypeError, split, 'a', 'b')
212 self.assertRaises(TypeError, split, 2)
213 testcases = [
214 ('2', '2'),
215 ('', ''),
216 ('{}', ''),
217 ('""', ''),
218 ('{', '{'),
219 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
220 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
221 ('a \u20ac', ('a', '\u20ac')),
222 (b'a \xe2\x82\xac', ('a', '\u20ac')),
223 ('a {b c}', ('a', ('b', 'c'))),
224 (r'a b\ c', ('a', ('b', 'c'))),
225 (('a', b'b c'), ('a', ('b', 'c'))),
226 (('a', 'b c'), ('a', ('b', 'c'))),
227 ('a 2', ('a', '2')),
228 (('a', 2), ('a', 2)),
229 ('a 3.4', ('a', '3.4')),
230 (('a', 3.4), ('a', 3.4)),
231 (('a', (2, 3.4)), ('a', (2, 3.4))),
232 ((), ()),
233 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
234 ]
235 for arg, res in testcases:
236 self.assertEqual(split(arg), res, msg=arg)
237
Neal Norwitz63dfece2004-02-19 02:37:29 +0000238
239def test_main():
Benjamin Petersonc4bbc8d2009-01-30 03:39:35 +0000240 support.run_unittest(TclTest, TkinterTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000241
David Aschere2b4b322004-02-18 05:59:53 +0000242if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000243 test_main()