blob: 91d324dcd3eb4e30633d750f7c1224be693bd59a [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
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +03006import _testcapi
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
R. David Murraya21e4ca2009-03-31 23:16:50 +00008
9# Skip this test if the _tkinter module wasn't built.
10_tkinter = support.import_module('_tkinter')
11
Terry Jan Reedy743c85a2013-03-16 02:37:06 -040012# Make sure tkinter._fix runs to set up the environment
13support.import_fresh_module('tkinter')
14
Guilherme Polofa8fba92009-02-07 02:33:47 +000015from tkinter import Tcl
David Aschere2b4b322004-02-18 05:59:53 +000016from _tkinter import TclError
17
Benjamin Petersonc4bbc8d2009-01-30 03:39:35 +000018
19class TkinterTest(unittest.TestCase):
20
21 def testFlattenLen(self):
22 # flatten(<object with no length>)
23 self.assertRaises(TypeError, _tkinter._flatten, True)
24
25
David Aschere2b4b322004-02-18 05:59:53 +000026class TclTest(unittest.TestCase):
27
28 def setUp(self):
29 self.interp = Tcl()
30
31 def testEval(self):
32 tcl = self.interp
33 tcl.eval('set a 1')
34 self.assertEqual(tcl.eval('set a'),'1')
35
36 def testEvalException(self):
37 tcl = self.interp
38 self.assertRaises(TclError,tcl.eval,'set a')
39
40 def testEvalException2(self):
41 tcl = self.interp
42 self.assertRaises(TclError,tcl.eval,'this is wrong')
43
44 def testCall(self):
45 tcl = self.interp
46 tcl.call('set','a','1')
47 self.assertEqual(tcl.call('set','a'),'1')
48
49 def testCallException(self):
50 tcl = self.interp
51 self.assertRaises(TclError,tcl.call,'set','a')
52
53 def testCallException2(self):
54 tcl = self.interp
55 self.assertRaises(TclError,tcl.call,'this','is','wrong')
56
57 def testSetVar(self):
58 tcl = self.interp
59 tcl.setvar('a','1')
60 self.assertEqual(tcl.eval('set a'),'1')
61
62 def testSetVarArray(self):
63 tcl = self.interp
64 tcl.setvar('a(1)','1')
65 self.assertEqual(tcl.eval('set a(1)'),'1')
66
67 def testGetVar(self):
68 tcl = self.interp
69 tcl.eval('set a 1')
70 self.assertEqual(tcl.getvar('a'),'1')
71
72 def testGetVarArray(self):
73 tcl = self.interp
74 tcl.eval('set a(1) 1')
75 self.assertEqual(tcl.getvar('a(1)'),'1')
76
77 def testGetVarException(self):
78 tcl = self.interp
79 self.assertRaises(TclError,tcl.getvar,'a')
80
81 def testGetVarArrayException(self):
82 tcl = self.interp
83 self.assertRaises(TclError,tcl.getvar,'a(1)')
84
85 def testUnsetVar(self):
86 tcl = self.interp
87 tcl.setvar('a',1)
88 self.assertEqual(tcl.eval('info exists a'),'1')
89 tcl.unsetvar('a')
90 self.assertEqual(tcl.eval('info exists a'),'0')
91
92 def testUnsetVarArray(self):
93 tcl = self.interp
94 tcl.setvar('a(1)',1)
95 tcl.setvar('a(2)',2)
96 self.assertEqual(tcl.eval('info exists a(1)'),'1')
97 self.assertEqual(tcl.eval('info exists a(2)'),'1')
98 tcl.unsetvar('a(1)')
99 self.assertEqual(tcl.eval('info exists a(1)'),'0')
100 self.assertEqual(tcl.eval('info exists a(2)'),'1')
101
102 def testUnsetVarException(self):
103 tcl = self.interp
104 self.assertRaises(TclError,tcl.unsetvar,'a')
Tim Peters27f88362004-07-08 04:22:35 +0000105
David Aschere2b4b322004-02-18 05:59:53 +0000106 def testEvalFile(self):
107 tcl = self.interp
108 filename = "testEvalFile.tcl"
109 fd = open(filename,'w')
110 script = """set a 1
111 set b 2
112 set c [ expr $a + $b ]
113 """
114 fd.write(script)
115 fd.close()
116 tcl.evalfile(filename)
Neal Norwitz9a8d55e2004-02-29 15:37:50 +0000117 os.remove(filename)
David Aschere2b4b322004-02-18 05:59:53 +0000118 self.assertEqual(tcl.eval('set a'),'1')
119 self.assertEqual(tcl.eval('set b'),'2')
120 self.assertEqual(tcl.eval('set c'),'3')
121
122 def testEvalFileException(self):
123 tcl = self.interp
124 filename = "doesnotexists"
125 try:
126 os.remove(filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000127 except Exception as e:
David Aschere2b4b322004-02-18 05:59:53 +0000128 pass
129 self.assertRaises(TclError,tcl.evalfile,filename)
130
David Aschere2b4b322004-02-18 05:59:53 +0000131 def testPackageRequireException(self):
132 tcl = self.interp
133 self.assertRaises(TclError,tcl.eval,'package require DNE')
134
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000135 @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000136 def testLoadWithUNC(self):
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000137 # 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] != ':':
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000143 raise unittest.SkipTest('Absolute path should have drive part')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000144 unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'],
145 fullname[0],
146 fullname[3:])
Hirokazu Yamamotodda7fdf2010-09-23 15:28:35 +0000147 if not os.path.exists(unc_name):
148 raise unittest.SkipTest('Cannot connect to UNC Path')
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000149
Georg Brandlec5ae3b2010-07-31 19:17:11 +0000150 with support.EnvironmentVarGuard() as env:
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000151 env.unset("TCL_LIBRARY")
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000152 f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000153
Hirokazu Yamamotof2dec8d2010-09-18 04:42:41 +0000154 self.assertIn('tkinter', f.read())
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000155 # exit code must be zero
156 self.assertEqual(f.close(), None)
157
Serhiy Storchakadf4bb462013-02-07 15:40:03 +0200158 def test_passing_values(self):
159 def passValue(value):
160 return self.interp.call('set', '_', value)
161
162 self.assertEqual(passValue(True), True)
163 self.assertEqual(passValue(False), False)
164 self.assertEqual(passValue('string'), 'string')
165 self.assertEqual(passValue('string\u20ac'), 'string\u20ac')
166 for i in (0, 1, -1, 2**31-1, -2**31):
167 self.assertEqual(passValue(i), i)
168 for f in (0.0, 1.0, -1.0, 1/3,
169 sys.float_info.min, sys.float_info.max,
170 -sys.float_info.min, -sys.float_info.max):
171 self.assertEqual(passValue(f), f)
172 for f in float('nan'), float('inf'), -float('inf'):
173 if f != f: # NaN
174 self.assertNotEqual(passValue(f), f)
175 else:
176 self.assertEqual(passValue(f), f)
177 self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
Martin v. Löwis2d5157e2010-06-04 19:50:26 +0000178
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300179 def test_splitlist(self):
180 splitlist = self.interp.tk.splitlist
181 call = self.interp.tk.call
182 self.assertRaises(TypeError, splitlist)
183 self.assertRaises(TypeError, splitlist, 'a', 'b')
184 self.assertRaises(TypeError, splitlist, 2)
185 testcases = [
186 ('2', ('2',)),
187 ('', ()),
188 ('{}', ('',)),
189 ('""', ('',)),
190 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
191 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
192 ('a \u20ac', ('a', '\u20ac')),
193 (b'a \xe2\x82\xac', ('a', '\u20ac')),
194 ('a {b c}', ('a', 'b c')),
195 (r'a b\ c', ('a', 'b c')),
196 (('a', 'b c'), ('a', 'b c')),
197 ('a 2', ('a', '2')),
198 (('a', 2), ('a', 2)),
199 ('a 3.4', ('a', '3.4')),
200 (('a', 3.4), ('a', 3.4)),
201 ((), ()),
202 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
203 ]
204 for arg, res in testcases:
205 self.assertEqual(splitlist(arg), res, msg=arg)
206 self.assertRaises(TclError, splitlist, '{')
207
208 def test_split(self):
209 split = self.interp.tk.split
210 call = self.interp.tk.call
211 self.assertRaises(TypeError, split)
212 self.assertRaises(TypeError, split, 'a', 'b')
213 self.assertRaises(TypeError, split, 2)
214 testcases = [
215 ('2', '2'),
216 ('', ''),
217 ('{}', ''),
218 ('""', ''),
219 ('{', '{'),
220 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
221 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
222 ('a \u20ac', ('a', '\u20ac')),
223 (b'a \xe2\x82\xac', ('a', '\u20ac')),
224 ('a {b c}', ('a', ('b', 'c'))),
225 (r'a b\ c', ('a', ('b', 'c'))),
226 (('a', b'b c'), ('a', ('b', 'c'))),
227 (('a', 'b c'), ('a', ('b', 'c'))),
228 ('a 2', ('a', '2')),
229 (('a', 2), ('a', 2)),
230 ('a 3.4', ('a', '3.4')),
231 (('a', 3.4), ('a', 3.4)),
232 (('a', (2, 3.4)), ('a', (2, 3.4))),
233 ((), ()),
234 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
235 ]
236 for arg, res in testcases:
237 self.assertEqual(split(arg), res, msg=arg)
238
Neal Norwitz63dfece2004-02-19 02:37:29 +0000239
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300240class BigmemTclTest(unittest.TestCase):
241
242 def setUp(self):
243 self.interp = Tcl()
244
245 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
246 "needs UINT_MAX < SIZE_MAX")
247 @support.bigmemtest(size=_testcapi.INT_MAX + 1, memuse=5, dry_run=False)
248 def test_huge_string(self, size):
249 value = ' ' * size
250 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
251
252
Neal Norwitz63dfece2004-02-19 02:37:29 +0000253def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300254 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000255
David Aschere2b4b322004-02-18 05:59:53 +0000256if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000257 test_main()