blob: a0e9e627ac6a1d2e927475995b2969f9c96db962 [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
Neal Norwitz63dfece2004-02-19 02:37:29 +0000187
188def test_main():
Benjamin Petersonb3619be2009-01-30 02:24:39 +0000189 test_support.run_unittest(TclTest, TkinterTest)
Neal Norwitz63dfece2004-02-19 02:37:29 +0000190
David Aschere2b4b322004-02-18 05:59:53 +0000191if __name__ == "__main__":
Neal Norwitz63dfece2004-02-19 02:37:29 +0000192 test_main()