1 #!/usr/bin/env python 2 3 import unittest 4 import sys 5 import os 6 from test import test_support 7 from subprocess import Popen, PIPE 8 9 # Skip this test if the _tkinter module wasn't built. 10 _tkinter = test_support.import_module('_tkinter') 11 12 from Tkinter import Tcl 13 from _tkinter import TclError 14 15 16 class TkinterTest(unittest.TestCase): 17 18 def testFlattenLen(self): 19 # flatten(<object with no length>) 20 self.assertRaises(TypeError, _tkinter._flatten, True) 21 22 23 class 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 188 def test_main(): 189 test_support.run_unittest(TclTest, TkinterTest) 190 191 if __name__ == "__main__": 192 test_main() 193