1#!/usr/bin/env python
2
3import unittest
4import sys
5import os
6from test import test_support
7from subprocess import Popen, PIPE
8
9# Skip this test if the _tkinter module wasn't built.
10_tkinter = test_support.import_module('_tkinter')
11
12from Tkinter import Tcl
13from _tkinter import TclError
14
15
16class TkinterTest(unittest.TestCase):
17
18    def testFlattenLen(self):
19        # flatten(<object with no length>)
20        self.assertRaises(TypeError, _tkinter._flatten, True)
21
22
23class 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')
102
103    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)
114        os.remove(filename)
115        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
128    def testPackageRequireException(self):
129        tcl = self.interp
130        self.assertRaises(TclError,tcl.eval,'package require DNE')
131
132    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")
150            cmd = '%s -c "import Tkinter; print Tkinter"' % (unc_name,)
151
152            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
164
165    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)
176        for f in (0.0, 1.0, -1.0, 1//3, 1/3.0,
177                  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,)))
186
187
188def test_main():
189    test_support.run_unittest(TclTest, TkinterTest)
190
191if __name__ == "__main__":
192    test_main()
193