| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2010-09-23 15:28:35 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | from test import support | 
					
						
							| 
									
										
											  
											
												Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
........
  r70734 | r.david.murray | 2009-03-30 15:04:00 -0400 (Mon, 30 Mar 2009) | 7 lines
  Add import_function method to test.test_support, and modify a number of
  tests that expect to be skipped if imports fail or functions don't
  exist to use import_function and import_module.  The ultimate goal is
  to change regrtest to not skip automatically on ImportError.  Checking
  in now to make sure the buldbots don't show any errors on platforms
  I can't direct test on.
........
  r70775 | r.david.murray | 2009-03-30 19:05:48 -0400 (Mon, 30 Mar 2009) | 4 lines
  Change more tests to use import_module for the modules that
  should cause tests to be skipped.  Also rename import_function
  to the more descriptive get_attribute and add a docstring.
........
  r70856 | r.david.murray | 2009-03-31 14:32:17 -0400 (Tue, 31 Mar 2009) | 7 lines
  A few more test skips via import_module, and change import_module to
  return the error message produced by importlib, so that if an import
  in the package whose import is being wrapped is what failed the skip
  message will contain the name of that module instead of the name of the
  wrapped module.  Also fixed formatting of some previous comments.
........
  r70874 | r.david.murray | 2009-03-31 15:33:15 -0400 (Tue, 31 Mar 2009) | 5 lines
  Improve test_support.import_module docstring, remove
  deprecated flag from get_attribute since it isn't likely
  to do anything useful.
........
  r70876 | r.david.murray | 2009-03-31 15:49:15 -0400 (Tue, 31 Mar 2009) | 4 lines
  Remove the regrtest check that turns any ImportError into a skipped test.
  Hopefully all modules whose imports legitimately result in a skipped
  test have been properly wrapped by the previous commits.
........
  r70877 | r.david.murray | 2009-03-31 15:57:24 -0400 (Tue, 31 Mar 2009) | 2 lines
  Add NEWS entry for regrtest change.
........
											
										 
											2009-03-31 23:16:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Skip this test if the _tkinter module wasn't built. | 
					
						
							|  |  |  | _tkinter = support.import_module('_tkinter') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 02:37:06 -04:00
										 |  |  | # Make sure tkinter._fix runs to set up the environment | 
					
						
							|  |  |  | support.import_fresh_module('tkinter') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-07 02:33:47 +00:00
										 |  |  | from tkinter import Tcl | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | from _tkinter import TclError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-07 10:06:39 +02:00
										 |  |  | try: | 
					
						
							|  |  |  |     from _testcapi import INT_MAX, PY_SSIZE_T_MAX | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     INT_MAX = PY_SSIZE_T_MAX = sys.maxsize | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  | tcl_version = _tkinter.TCL_VERSION.split('.') | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     for i in range(len(tcl_version)): | 
					
						
							|  |  |  |         tcl_version[i] = int(tcl_version[i]) | 
					
						
							|  |  |  | except ValueError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | tcl_version = tuple(tcl_version) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-02 23:04:24 +02:00
										 |  |  | _tk_patchlevel = None | 
					
						
							|  |  |  | def get_tk_patchlevel(): | 
					
						
							|  |  |  |     global _tk_patchlevel | 
					
						
							|  |  |  |     if _tk_patchlevel is None: | 
					
						
							|  |  |  |         tcl = Tcl() | 
					
						
							|  |  |  |         patchlevel = [] | 
					
						
							|  |  |  |         for x in tcl.call('info', 'patchlevel').split('.'): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 x = int(x, 10) | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							|  |  |  |                 x = -1 | 
					
						
							|  |  |  |             patchlevel.append(x) | 
					
						
							|  |  |  |         _tk_patchlevel = tuple(patchlevel) | 
					
						
							|  |  |  |     return _tk_patchlevel | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 68884,68973,68978,69003,69083,69112-69113 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68884 | kristjan.jonsson | 2009-01-24 04:52:26 -0600 (Sat, 24 Jan 2009) | 1 line
  Add a test for UNC import paths, see issue 3677
........
  r68973 | georg.brandl | 2009-01-26 15:29:38 -0600 (Mon, 26 Jan 2009) | 2 lines
  Copy over docs on advanced role features from Sphinx docs.
........
  r68978 | mark.dickinson | 2009-01-26 15:51:56 -0600 (Mon, 26 Jan 2009) | 3 lines
  Issue #5073: Fix occasional failure of bsddb/test/test_lock.py.  Thanks
  Hirokazu Yamamoto for the patch.
........
  r69003 | benjamin.peterson | 2009-01-26 21:07:53 -0600 (Mon, 26 Jan 2009) | 1 line
  excellent place to use a set() #5069
........
  r69083 | benjamin.peterson | 2009-01-28 21:03:00 -0600 (Wed, 28 Jan 2009) | 1 line
  fix download url
........
  r69112 | benjamin.peterson | 2009-01-29 20:02:25 -0600 (Thu, 29 Jan 2009) | 1 line
  pep8tify conditionals
........
  r69113 | benjamin.peterson | 2009-01-29 20:24:39 -0600 (Thu, 29 Jan 2009) | 1 line
  make _tkinter._flatten check the result of PySequence_Size for errors #3880
........
											
										 
											2009-01-30 03:39:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TkinterTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testFlattenLen(self): | 
					
						
							|  |  |  |         # flatten(<object with no length>) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _tkinter._flatten, True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | class TclTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.interp = Tcl() | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |         self.wantobjects = self.interp.tk.wantobjects() | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testEval(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.eval('set a 1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set a'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |     def test_eval_null_in_result(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set a "a\\0b"'), 'a\x00b') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  |     def testEvalException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.eval,'set a') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testEvalException2(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.eval,'this is wrong') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCall(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.call('set','a','1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.call('set','a'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCallException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.call,'set','a') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCallException2(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.call,'this','is','wrong') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testSetVar(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.setvar('a','1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set a'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testSetVarArray(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.setvar('a(1)','1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set a(1)'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testGetVar(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.eval('set a 1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.getvar('a'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testGetVarArray(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.eval('set a(1) 1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.getvar('a(1)'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testGetVarException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.getvar,'a') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testGetVarArrayException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.getvar,'a(1)') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testUnsetVar(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.setvar('a',1) | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('info exists a'),'1') | 
					
						
							|  |  |  |         tcl.unsetvar('a') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('info exists a'),'0') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testUnsetVarArray(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.setvar('a(1)',1) | 
					
						
							|  |  |  |         tcl.setvar('a(2)',2) | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('info exists a(1)'),'1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('info exists a(2)'),'1') | 
					
						
							|  |  |  |         tcl.unsetvar('a(1)') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('info exists a(1)'),'0') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('info exists a(2)'),'1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testUnsetVarException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.unsetvar,'a') | 
					
						
							| 
									
										
										
										
											2004-07-08 04:22:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  |     def testEvalFile(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |         with open(support.TESTFN, 'w') as f: | 
					
						
							|  |  |  |             self.addCleanup(support.unlink, support.TESTFN) | 
					
						
							|  |  |  |             f.write("""set a 1
 | 
					
						
							|  |  |  |             set b 2 | 
					
						
							|  |  |  |             set c [ expr $a + $b ] | 
					
						
							|  |  |  |             """)
 | 
					
						
							|  |  |  |         tcl.evalfile(support.TESTFN) | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  |         self.assertEqual(tcl.eval('set a'),'1') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set b'),'2') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set c'),'3') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |     def test_evalfile_null_in_result(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         with open(support.TESTFN, 'w') as f: | 
					
						
							|  |  |  |             self.addCleanup(support.unlink, support.TESTFN) | 
					
						
							|  |  |  |             f.write("""
 | 
					
						
							|  |  |  |             set a "a\0b" | 
					
						
							|  |  |  |             set b "a\\0b" | 
					
						
							|  |  |  |             """)
 | 
					
						
							|  |  |  |         tcl.evalfile(support.TESTFN) | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set a'), 'a\x00b') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set b'), 'a\x00b') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  |     def testEvalFileException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         filename = "doesnotexists" | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             os.remove(filename) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |         except Exception as e: | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  |             pass | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.evalfile,filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testPackageRequireException(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertRaises(TclError,tcl.eval,'package require DNE') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-23 15:28:35 +00:00
										 |  |  |     @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows') | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  |     def testLoadWithUNC(self): | 
					
						
							|  |  |  |         # Build a UNC path from the regular path. | 
					
						
							|  |  |  |         # Something like | 
					
						
							|  |  |  |         #   \\%COMPUTERNAME%\c$\python27\python.exe | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fullname = os.path.abspath(sys.executable) | 
					
						
							|  |  |  |         if fullname[1] != ':': | 
					
						
							| 
									
										
										
										
											2010-09-23 15:28:35 +00:00
										 |  |  |             raise unittest.SkipTest('Absolute path should have drive part') | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  |         unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'], | 
					
						
							|  |  |  |                                     fullname[0], | 
					
						
							|  |  |  |                                     fullname[3:]) | 
					
						
							| 
									
										
										
										
											2010-09-23 15:28:35 +00:00
										 |  |  |         if not os.path.exists(unc_name): | 
					
						
							|  |  |  |             raise unittest.SkipTest('Cannot connect to UNC Path') | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-31 19:17:11 +00:00
										 |  |  |         with support.EnvironmentVarGuard() as env: | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  |             env.unset("TCL_LIBRARY") | 
					
						
							| 
									
										
										
										
											2010-09-18 04:42:41 +00:00
										 |  |  |             f = os.popen('%s -c "import tkinter; print(tkinter)"' % (unc_name,)) | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 04:42:41 +00:00
										 |  |  |         self.assertIn('tkinter', f.read()) | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  |         # exit code must be zero | 
					
						
							|  |  |  |         self.assertEqual(f.close(), None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-03 20:41:34 +02:00
										 |  |  |     def test_exprstring(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.call('set', 'a', 3) | 
					
						
							|  |  |  |         tcl.call('set', 'b', 6) | 
					
						
							|  |  |  |         def check(expr, expected): | 
					
						
							|  |  |  |             result = tcl.exprstring(expr) | 
					
						
							|  |  |  |             self.assertEqual(result, expected) | 
					
						
							|  |  |  |             self.assertIsInstance(result, str) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprstring) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprstring, b'8.2 + 6') | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprstring, 'spam') | 
					
						
							|  |  |  |         check('', '0') | 
					
						
							|  |  |  |         check('8.2 + 6', '14.2') | 
					
						
							|  |  |  |         check('3.1 + $a', '6.1') | 
					
						
							|  |  |  |         check('2 + "$a.$b"', '5.6') | 
					
						
							|  |  |  |         check('4*[llength "6 2"]', '8') | 
					
						
							|  |  |  |         check('{word one} < "word $a"', '0') | 
					
						
							|  |  |  |         check('4*2 < 7', '0') | 
					
						
							|  |  |  |         check('hypot($a, 4)', '5.0') | 
					
						
							|  |  |  |         check('5 / 4', '1') | 
					
						
							|  |  |  |         check('5 / 4.0', '1.25') | 
					
						
							|  |  |  |         check('5 / ( [string length "abcd"] + 0.0 )', '1.25') | 
					
						
							|  |  |  |         check('20.0/5.0', '4.0') | 
					
						
							|  |  |  |         check('"0x03" > "2"', '1') | 
					
						
							|  |  |  |         check('[string length "a\xbd\u20ac"]', '3') | 
					
						
							|  |  |  |         check(r'[string length "a\xbd\u20ac"]', '3') | 
					
						
							|  |  |  |         check('"abc"', 'abc') | 
					
						
							|  |  |  |         check('"a\xbd\u20ac"', 'a\xbd\u20ac') | 
					
						
							|  |  |  |         check(r'"a\xbd\u20ac"', 'a\xbd\u20ac') | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |         check(r'"a\0b"', 'a\x00b') | 
					
						
							| 
									
										
										
										
											2014-02-03 22:31:09 +02:00
										 |  |  |         if tcl_version >= (8, 5): | 
					
						
							|  |  |  |             check('2**64', str(2**64)) | 
					
						
							| 
									
										
										
										
											2014-02-03 20:41:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_exprdouble(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.call('set', 'a', 3) | 
					
						
							|  |  |  |         tcl.call('set', 'b', 6) | 
					
						
							|  |  |  |         def check(expr, expected): | 
					
						
							|  |  |  |             result = tcl.exprdouble(expr) | 
					
						
							|  |  |  |             self.assertEqual(result, expected) | 
					
						
							|  |  |  |             self.assertIsInstance(result, float) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprdouble) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprdouble, b'8.2 + 6') | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprdouble, 'spam') | 
					
						
							|  |  |  |         check('', 0.0) | 
					
						
							|  |  |  |         check('8.2 + 6', 14.2) | 
					
						
							|  |  |  |         check('3.1 + $a', 6.1) | 
					
						
							|  |  |  |         check('2 + "$a.$b"', 5.6) | 
					
						
							|  |  |  |         check('4*[llength "6 2"]', 8.0) | 
					
						
							|  |  |  |         check('{word one} < "word $a"', 0.0) | 
					
						
							|  |  |  |         check('4*2 < 7', 0.0) | 
					
						
							|  |  |  |         check('hypot($a, 4)', 5.0) | 
					
						
							|  |  |  |         check('5 / 4', 1.0) | 
					
						
							|  |  |  |         check('5 / 4.0', 1.25) | 
					
						
							|  |  |  |         check('5 / ( [string length "abcd"] + 0.0 )', 1.25) | 
					
						
							|  |  |  |         check('20.0/5.0', 4.0) | 
					
						
							|  |  |  |         check('"0x03" > "2"', 1.0) | 
					
						
							|  |  |  |         check('[string length "a\xbd\u20ac"]', 3.0) | 
					
						
							|  |  |  |         check(r'[string length "a\xbd\u20ac"]', 3.0) | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprdouble, '"abc"') | 
					
						
							| 
									
										
										
										
											2014-02-03 22:31:09 +02:00
										 |  |  |         if tcl_version >= (8, 5): | 
					
						
							|  |  |  |             check('2**64', float(2**64)) | 
					
						
							| 
									
										
										
										
											2014-02-03 20:41:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_exprlong(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.call('set', 'a', 3) | 
					
						
							|  |  |  |         tcl.call('set', 'b', 6) | 
					
						
							|  |  |  |         def check(expr, expected): | 
					
						
							|  |  |  |             result = tcl.exprlong(expr) | 
					
						
							|  |  |  |             self.assertEqual(result, expected) | 
					
						
							|  |  |  |             self.assertIsInstance(result, int) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprlong) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprlong, b'8.2 + 6') | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprlong, 'spam') | 
					
						
							|  |  |  |         check('', 0) | 
					
						
							|  |  |  |         check('8.2 + 6', 14) | 
					
						
							|  |  |  |         check('3.1 + $a', 6) | 
					
						
							|  |  |  |         check('2 + "$a.$b"', 5) | 
					
						
							|  |  |  |         check('4*[llength "6 2"]', 8) | 
					
						
							|  |  |  |         check('{word one} < "word $a"', 0) | 
					
						
							|  |  |  |         check('4*2 < 7', 0) | 
					
						
							|  |  |  |         check('hypot($a, 4)', 5) | 
					
						
							|  |  |  |         check('5 / 4', 1) | 
					
						
							|  |  |  |         check('5 / 4.0', 1) | 
					
						
							|  |  |  |         check('5 / ( [string length "abcd"] + 0.0 )', 1) | 
					
						
							|  |  |  |         check('20.0/5.0', 4) | 
					
						
							|  |  |  |         check('"0x03" > "2"', 1) | 
					
						
							|  |  |  |         check('[string length "a\xbd\u20ac"]', 3) | 
					
						
							|  |  |  |         check(r'[string length "a\xbd\u20ac"]', 3) | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprlong, '"abc"') | 
					
						
							| 
									
										
										
										
											2014-02-03 22:31:09 +02:00
										 |  |  |         if tcl_version >= (8, 5): | 
					
						
							|  |  |  |             self.assertRaises(TclError, tcl.exprlong, '2**64') | 
					
						
							| 
									
										
										
										
											2014-02-03 20:41:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_exprboolean(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         tcl.call('set', 'a', 3) | 
					
						
							|  |  |  |         tcl.call('set', 'b', 6) | 
					
						
							|  |  |  |         def check(expr, expected): | 
					
						
							|  |  |  |             result = tcl.exprboolean(expr) | 
					
						
							|  |  |  |             self.assertEqual(result, expected) | 
					
						
							|  |  |  |             self.assertIsInstance(result, int) | 
					
						
							|  |  |  |             self.assertNotIsInstance(result, bool) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprboolean) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.exprboolean, b'8.2 + 6') | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprboolean, 'spam') | 
					
						
							|  |  |  |         check('', False) | 
					
						
							|  |  |  |         for value in ('0', 'false', 'no', 'off'): | 
					
						
							|  |  |  |             check(value, False) | 
					
						
							|  |  |  |             check('"%s"' % value, False) | 
					
						
							|  |  |  |             check('{%s}' % value, False) | 
					
						
							|  |  |  |         for value in ('1', 'true', 'yes', 'on'): | 
					
						
							|  |  |  |             check(value, True) | 
					
						
							|  |  |  |             check('"%s"' % value, True) | 
					
						
							|  |  |  |             check('{%s}' % value, True) | 
					
						
							|  |  |  |         check('8.2 + 6', True) | 
					
						
							|  |  |  |         check('3.1 + $a', True) | 
					
						
							|  |  |  |         check('2 + "$a.$b"', True) | 
					
						
							|  |  |  |         check('4*[llength "6 2"]', True) | 
					
						
							|  |  |  |         check('{word one} < "word $a"', False) | 
					
						
							|  |  |  |         check('4*2 < 7', False) | 
					
						
							|  |  |  |         check('hypot($a, 4)', True) | 
					
						
							|  |  |  |         check('5 / 4', True) | 
					
						
							|  |  |  |         check('5 / 4.0', True) | 
					
						
							|  |  |  |         check('5 / ( [string length "abcd"] + 0.0 )', True) | 
					
						
							|  |  |  |         check('20.0/5.0', True) | 
					
						
							|  |  |  |         check('"0x03" > "2"', True) | 
					
						
							|  |  |  |         check('[string length "a\xbd\u20ac"]', True) | 
					
						
							|  |  |  |         check(r'[string length "a\xbd\u20ac"]', True) | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.exprboolean, '"abc"') | 
					
						
							| 
									
										
										
										
											2014-02-03 22:31:09 +02:00
										 |  |  |         if tcl_version >= (8, 5): | 
					
						
							|  |  |  |             check('2**64', True) | 
					
						
							| 
									
										
										
										
											2014-02-03 20:41:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-07 15:40:03 +02:00
										 |  |  |     def test_passing_values(self): | 
					
						
							|  |  |  |         def passValue(value): | 
					
						
							|  |  |  |             return self.interp.call('set', '_', value) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |         self.assertEqual(passValue(True), True if self.wantobjects else '1') | 
					
						
							|  |  |  |         self.assertEqual(passValue(False), False if self.wantobjects else '0') | 
					
						
							| 
									
										
										
										
											2013-02-07 15:40:03 +02:00
										 |  |  |         self.assertEqual(passValue('string'), 'string') | 
					
						
							|  |  |  |         self.assertEqual(passValue('string\u20ac'), 'string\u20ac') | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |         self.assertEqual(passValue('str\x00ing'), 'str\x00ing') | 
					
						
							|  |  |  |         self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd') | 
					
						
							|  |  |  |         self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') | 
					
						
							|  |  |  |         self.assertEqual(passValue(b'str\x00ing'), 'str\x00ing') | 
					
						
							|  |  |  |         self.assertEqual(passValue(b'str\xc0\x80ing'), 'str\x00ing') | 
					
						
							| 
									
										
										
										
											2013-02-07 15:40:03 +02:00
										 |  |  |         for i in (0, 1, -1, 2**31-1, -2**31): | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |             self.assertEqual(passValue(i), i if self.wantobjects else str(i)) | 
					
						
							| 
									
										
										
										
											2013-02-07 15:40:03 +02:00
										 |  |  |         for f in (0.0, 1.0, -1.0, 1/3, | 
					
						
							|  |  |  |                   sys.float_info.min, sys.float_info.max, | 
					
						
							|  |  |  |                   -sys.float_info.min, -sys.float_info.max): | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |             if self.wantobjects: | 
					
						
							| 
									
										
										
										
											2013-02-07 15:40:03 +02:00
										 |  |  |                 self.assertEqual(passValue(f), f) | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 self.assertEqual(float(passValue(f)), f) | 
					
						
							|  |  |  |         if self.wantobjects: | 
					
						
							|  |  |  |             f = passValue(float('nan')) | 
					
						
							|  |  |  |             self.assertNotEqual(f, f) | 
					
						
							|  |  |  |             self.assertEqual(passValue(float('inf')), float('inf')) | 
					
						
							|  |  |  |             self.assertEqual(passValue(-float('inf')), -float('inf')) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             f = float(passValue(float('nan'))) | 
					
						
							|  |  |  |             self.assertNotEqual(f, f) | 
					
						
							|  |  |  |             self.assertEqual(float(passValue(float('inf'))), float('inf')) | 
					
						
							|  |  |  |             self.assertEqual(float(passValue(-float('inf'))), -float('inf')) | 
					
						
							|  |  |  |         self.assertEqual(passValue((1, '2', (3.4,))), | 
					
						
							|  |  |  |                          (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  |     def test_user_command(self): | 
					
						
							|  |  |  |         result = None | 
					
						
							|  |  |  |         def testfunc(arg): | 
					
						
							|  |  |  |             nonlocal result | 
					
						
							|  |  |  |             result = arg | 
					
						
							|  |  |  |             return arg | 
					
						
							|  |  |  |         self.interp.createcommand('testfunc', testfunc) | 
					
						
							| 
									
										
										
										
											2014-02-23 19:39:06 +01:00
										 |  |  |         self.addCleanup(self.interp.tk.deletecommand, 'testfunc') | 
					
						
							| 
									
										
										
										
											2014-01-23 16:48:44 +02:00
										 |  |  |         def check(value, expected, eq=self.assertEqual): | 
					
						
							|  |  |  |             r = self.interp.call('testfunc', value) | 
					
						
							|  |  |  |             self.assertIsInstance(result, str) | 
					
						
							|  |  |  |             eq(result, expected) | 
					
						
							|  |  |  |             self.assertIsInstance(r, str) | 
					
						
							|  |  |  |             eq(r, expected) | 
					
						
							|  |  |  |         def float_eq(actual, expected): | 
					
						
							|  |  |  |             expected = float(expected) | 
					
						
							|  |  |  |             self.assertAlmostEqual(float(actual), expected, | 
					
						
							|  |  |  |                                    delta=abs(expected) * 1e-10) | 
					
						
							|  |  |  |         def nan_eq(actual, expected): | 
					
						
							|  |  |  |             actual = float(actual) | 
					
						
							|  |  |  |             self.assertNotEqual(actual, actual) | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         check(True, '1') | 
					
						
							|  |  |  |         check(False, '0') | 
					
						
							|  |  |  |         check('string', 'string') | 
					
						
							|  |  |  |         check('string\xbd', 'string\xbd') | 
					
						
							|  |  |  |         check('string\u20ac', 'string\u20ac') | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |         check(b'string', 'string') | 
					
						
							|  |  |  |         check(b'string\xe2\x82\xac', 'string\u20ac') | 
					
						
							|  |  |  |         check('str\x00ing', 'str\x00ing') | 
					
						
							|  |  |  |         check('str\x00ing\xbd', 'str\x00ing\xbd') | 
					
						
							|  |  |  |         check('str\x00ing\u20ac', 'str\x00ing\u20ac') | 
					
						
							|  |  |  |         check(b'str\xc0\x80ing', 'str\x00ing') | 
					
						
							|  |  |  |         check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac') | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  |         for i in (0, 1, -1, 2**31-1, -2**31): | 
					
						
							|  |  |  |             check(i, str(i)) | 
					
						
							| 
									
										
										
										
											2014-01-23 16:48:44 +02:00
										 |  |  |         for f in (0.0, 1.0, -1.0): | 
					
						
							|  |  |  |             check(f, repr(f)) | 
					
						
							|  |  |  |         for f in (1/3.0, sys.float_info.min, sys.float_info.max, | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  |                   -sys.float_info.min, -sys.float_info.max): | 
					
						
							| 
									
										
										
										
											2014-01-23 16:48:44 +02:00
										 |  |  |             check(f, f, eq=float_eq) | 
					
						
							|  |  |  |         check(float('inf'), 'Inf', eq=float_eq) | 
					
						
							|  |  |  |         check(-float('inf'), '-Inf', eq=float_eq) | 
					
						
							|  |  |  |         check(float('nan'), 'NaN', eq=nan_eq) | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  |         check((), '') | 
					
						
							|  |  |  |         check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |     def test_splitlist(self): | 
					
						
							|  |  |  |         splitlist = self.interp.tk.splitlist | 
					
						
							|  |  |  |         call = self.interp.tk.call | 
					
						
							|  |  |  |         self.assertRaises(TypeError, splitlist) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, splitlist, 'a', 'b') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, splitlist, 2) | 
					
						
							|  |  |  |         testcases = [ | 
					
						
							|  |  |  |             ('2', ('2',)), | 
					
						
							|  |  |  |             ('', ()), | 
					
						
							|  |  |  |             ('{}', ('',)), | 
					
						
							|  |  |  |             ('""', ('',)), | 
					
						
							|  |  |  |             ('a\n b\t\r c\n ', ('a', 'b', 'c')), | 
					
						
							|  |  |  |             (b'a\n b\t\r c\n ', ('a', 'b', 'c')), | 
					
						
							|  |  |  |             ('a \u20ac', ('a', '\u20ac')), | 
					
						
							|  |  |  |             (b'a \xe2\x82\xac', ('a', '\u20ac')), | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |             (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')), | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |             ('a {b c}', ('a', 'b c')), | 
					
						
							|  |  |  |             (r'a b\ c', ('a', 'b c')), | 
					
						
							|  |  |  |             (('a', 'b c'), ('a', 'b c')), | 
					
						
							|  |  |  |             ('a 2', ('a', '2')), | 
					
						
							|  |  |  |             (('a', 2), ('a', 2)), | 
					
						
							|  |  |  |             ('a 3.4', ('a', '3.4')), | 
					
						
							|  |  |  |             (('a', 3.4), ('a', 3.4)), | 
					
						
							|  |  |  |             ((), ()), | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |             (call('list', 1, '2', (3.4,)), | 
					
						
							|  |  |  |                 (1, '2', (3.4,)) if self.wantobjects else | 
					
						
							|  |  |  |                 ('1', '2', '3.4')), | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  |         if tcl_version >= (8, 5): | 
					
						
							| 
									
										
										
										
											2014-02-02 23:04:24 +02:00
										 |  |  |             if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): | 
					
						
							|  |  |  |                 # Before 8.5.5 dicts were converted to lists through string | 
					
						
							|  |  |  |                 expected = ('12', '\u20ac', '\u20ac', '3.4') | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 expected = (12, '\u20ac', '\u20ac', (3.4,)) | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  |             testcases += [ | 
					
						
							| 
									
										
										
										
											2014-02-02 23:04:24 +02:00
										 |  |  |                 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), | 
					
						
							|  |  |  |                     expected), | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  |             ] | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |         for arg, res in testcases: | 
					
						
							|  |  |  |             self.assertEqual(splitlist(arg), res, msg=arg) | 
					
						
							|  |  |  |         self.assertRaises(TclError, splitlist, '{') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_split(self): | 
					
						
							|  |  |  |         split = self.interp.tk.split | 
					
						
							|  |  |  |         call = self.interp.tk.call | 
					
						
							|  |  |  |         self.assertRaises(TypeError, split) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, split, 'a', 'b') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, split, 2) | 
					
						
							|  |  |  |         testcases = [ | 
					
						
							|  |  |  |             ('2', '2'), | 
					
						
							|  |  |  |             ('', ''), | 
					
						
							|  |  |  |             ('{}', ''), | 
					
						
							|  |  |  |             ('""', ''), | 
					
						
							|  |  |  |             ('{', '{'), | 
					
						
							|  |  |  |             ('a\n b\t\r c\n ', ('a', 'b', 'c')), | 
					
						
							|  |  |  |             (b'a\n b\t\r c\n ', ('a', 'b', 'c')), | 
					
						
							|  |  |  |             ('a \u20ac', ('a', '\u20ac')), | 
					
						
							|  |  |  |             (b'a \xe2\x82\xac', ('a', '\u20ac')), | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |             (b'a\xc0\x80b', 'a\x00b'), | 
					
						
							|  |  |  |             (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')), | 
					
						
							|  |  |  |             (b'{a\xc0\x80b c\xc0\x80d', '{a\x00b c\x00d'), | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |             ('a {b c}', ('a', ('b', 'c'))), | 
					
						
							|  |  |  |             (r'a b\ c', ('a', ('b', 'c'))), | 
					
						
							|  |  |  |             (('a', b'b c'), ('a', ('b', 'c'))), | 
					
						
							|  |  |  |             (('a', 'b c'), ('a', ('b', 'c'))), | 
					
						
							|  |  |  |             ('a 2', ('a', '2')), | 
					
						
							|  |  |  |             (('a', 2), ('a', 2)), | 
					
						
							|  |  |  |             ('a 3.4', ('a', '3.4')), | 
					
						
							|  |  |  |             (('a', 3.4), ('a', 3.4)), | 
					
						
							|  |  |  |             (('a', (2, 3.4)), ('a', (2, 3.4))), | 
					
						
							|  |  |  |             ((), ()), | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |             (call('list', 1, '2', (3.4,)), | 
					
						
							|  |  |  |                 (1, '2', (3.4,)) if self.wantobjects else | 
					
						
							|  |  |  |                 ('1', '2', '3.4')), | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  |         if tcl_version >= (8, 5): | 
					
						
							| 
									
										
										
										
											2014-02-02 23:04:24 +02:00
										 |  |  |             if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): | 
					
						
							|  |  |  |                 # Before 8.5.5 dicts were converted to lists through string | 
					
						
							|  |  |  |                 expected = ('12', '\u20ac', '\u20ac', '3.4') | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 expected = (12, '\u20ac', '\u20ac', (3.4,)) | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  |             testcases += [ | 
					
						
							|  |  |  |                 (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), | 
					
						
							| 
									
										
										
										
											2014-02-02 23:04:24 +02:00
										 |  |  |                     expected), | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  |             ] | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |         for arg, res in testcases: | 
					
						
							|  |  |  |             self.assertEqual(split(arg), res, msg=arg) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-21 21:38:21 +03:00
										 |  |  | class BigmemTclTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.interp = Tcl() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-07 10:06:39 +02:00
										 |  |  |     @support.cpython_only | 
					
						
							|  |  |  |     @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX") | 
					
						
							|  |  |  |     @support.bigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False) | 
					
						
							| 
									
										
										
										
											2013-08-21 21:38:21 +03:00
										 |  |  |     def test_huge_string(self, size): | 
					
						
							|  |  |  |         value = ' ' * size | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, self.interp.call, 'set', '_', value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-20 17:43:49 +02:00
										 |  |  | def setUpModule(): | 
					
						
							|  |  |  |     if support.verbose: | 
					
						
							|  |  |  |         tcl = Tcl() | 
					
						
							|  |  |  |         print('patchlevel =', tcl.call('info', 'patchlevel')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-19 02:37:29 +00:00
										 |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2013-08-21 21:38:21 +03:00
										 |  |  |     support.run_unittest(TclTest, TkinterTest, BigmemTclTest) | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-19 02:37:29 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |