blob: 4e52fd4882e101213de981f884ea162f6d488ab3 [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,))),
Serhiy Storchaka203eb312013-08-22 17:40:31 +0300203 (call('dict', 'create', 1, '\u20ac', b'\xe2\x82\xac', (3.4,)),
204 (1, '\u20ac', '\u20ac', (3.4,))),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300205 ]
206 for arg, res in testcases:
207 self.assertEqual(splitlist(arg), res, msg=arg)
208 self.assertRaises(TclError, splitlist, '{')
209
210 def test_split(self):
211 split = self.interp.tk.split
212 call = self.interp.tk.call
213 self.assertRaises(TypeError, split)
214 self.assertRaises(TypeError, split, 'a', 'b')
215 self.assertRaises(TypeError, split, 2)
216 testcases = [
217 ('2', '2'),
218 ('', ''),
219 ('{}', ''),
220 ('""', ''),
221 ('{', '{'),
222 ('a\n b\t\r c\n ', ('a', 'b', 'c')),
223 (b'a\n b\t\r c\n ', ('a', 'b', 'c')),
224 ('a \u20ac', ('a', '\u20ac')),
225 (b'a \xe2\x82\xac', ('a', '\u20ac')),
226 ('a {b c}', ('a', ('b', 'c'))),
227 (r'a b\ c', ('a', ('b', 'c'))),
228 (('a', b'b c'), ('a', ('b', 'c'))),
229 (('a', 'b c'), ('a', ('b', 'c'))),
230 ('a 2', ('a', '2')),
231 (('a', 2), ('a', 2)),
232 ('a 3.4', ('a', '3.4')),
233 (('a', 3.4), ('a', 3.4)),
234 (('a', (2, 3.4)), ('a', (2, 3.4))),
235 ((), ()),
236 (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
Serhiy Storchaka203eb312013-08-22 17:40:31 +0300237 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
238 (12, '\u20ac', '\u20ac', (3.4,))),
Serhiy Storchaka275d5fd2013-07-11 20:34:47 +0300239 ]
240 for arg, res in testcases:
241 self.assertEqual(split(arg), res, msg=arg)
242
Neal Norwitz63dfece2004-02-19 02:37:29 +0000243
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300244class BigmemTclTest(unittest.TestCase):
245
246 def setUp(self):
247 self.interp = Tcl()
248
249 @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX,
250 "needs UINT_MAX < SIZE_MAX")
251 @support.bigmemtest(size=_testcapi.INT_MAX + 1, memuse=5, dry_run=False)
252 def test_huge_string(self, size):
253 value = ' ' * size
254 self.assertRaises(OverflowError, self.interp.call, 'set', '_', value)
255
256
Neal Norwitz63dfece2004-02-19 02:37:29 +0000257def test_main():
Serhiy Storchaka9e6b9752013-08-21 21:38:21 +0300258 support.run_unittest(TclTest, TkinterTest, BigmemTclTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000259
David Aschere2b4b322004-02-18 05:59:53 +0000260if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000261 test_main()