| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2015-10-12 23:27:58 -05:00
										 |  |  | import subprocess | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2020-06-25 20:15:40 +08:00
										 |  |  | from test.support import import_helper | 
					
						
							| 
									
										
										
										
											2020-08-06 19:51:29 +08:00
										 |  |  | from test.support import os_helper | 
					
						
							| 
									
										
											  
											
												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. | 
					
						
							| 
									
										
										
										
											2020-06-25 20:15:40 +08:00
										 |  |  | _tkinter = import_helper.import_module('_tkinter') | 
					
						
							| 
									
										
											  
											
												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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 11:36:53 -05:00
										 |  |  | import 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 08:36:03 +03:00
										 |  |  | tcl_version = tuple(map(int, _tkinter.TCL_VERSION.split('.'))) | 
					
						
							| 
									
										
										
										
											2013-09-08 20:29:37 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							| 
									
										
										
										
											2022-05-06 13:50:38 +03:00
										 |  |  |         _tk_patchlevel = tcl.info_patchlevel() | 
					
						
							| 
									
										
										
										
											2014-02-02 23:04:24 +02:00
										 |  |  |     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): | 
					
						
							| 
									
										
										
										
											2021-07-14 08:19:18 +03:00
										 |  |  |         # Object without length. | 
					
						
							| 
									
										
											  
											
												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
										 |  |  |         self.assertRaises(TypeError, _tkinter._flatten, True) | 
					
						
							| 
									
										
										
										
											2021-07-14 08:19:18 +03:00
										 |  |  |         # Object with length, but not sequence. | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _tkinter._flatten, {}) | 
					
						
							|  |  |  |         # Sequence or set, but not tuple or list. | 
					
						
							|  |  |  |         # (issue44608: there were leaks in the following cases) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _tkinter._flatten, 'string') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, _tkinter._flatten, {'set'}) | 
					
						
							| 
									
										
											  
											
												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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |     def test_eval_surrogates_in_result(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  |     def get_integers(self): | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         return (0, 1, -1, | 
					
						
							|  |  |  |                 2**31-1, -2**31, 2**31, -2**31-1, | 
					
						
							|  |  |  |                 2**63-1, -2**63, 2**63, -2**63-1, | 
					
						
							|  |  |  |                 2**1000, -2**1000) | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-30 14:07:38 +03:00
										 |  |  |     def test_getint(self): | 
					
						
							|  |  |  |         tcl = self.interp.tk | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  |         for i in self.get_integers(): | 
					
						
							|  |  |  |             self.assertEqual(tcl.getint(' %d ' % i), i) | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |             self.assertEqual(tcl.getint(' %#o ' % i), i) | 
					
						
							| 
									
										
										
										
											2015-04-02 20:07:09 +03:00
										 |  |  |             self.assertEqual(tcl.getint((' %#o ' % i).replace('o', '')), i) | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  |             self.assertEqual(tcl.getint(' %#x ' % i), i) | 
					
						
							| 
									
										
										
										
											2014-05-30 14:07:38 +03:00
										 |  |  |         self.assertEqual(tcl.getint(42), 42) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getint) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getint, '42', '10') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getint, b'42') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getint, 42.0) | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.getint, 'a') | 
					
						
							|  |  |  |         self.assertRaises((TypeError, ValueError, TclError), | 
					
						
							|  |  |  |                           tcl.getint, '42\0') | 
					
						
							|  |  |  |         self.assertRaises((UnicodeEncodeError, ValueError, TclError), | 
					
						
							|  |  |  |                           tcl.getint, '42\ud800') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_getdouble(self): | 
					
						
							|  |  |  |         tcl = self.interp.tk | 
					
						
							|  |  |  |         self.assertEqual(tcl.getdouble(' 42 '), 42.0) | 
					
						
							|  |  |  |         self.assertEqual(tcl.getdouble(' 42.5 '), 42.5) | 
					
						
							|  |  |  |         self.assertEqual(tcl.getdouble(42.5), 42.5) | 
					
						
							| 
									
										
										
										
											2015-05-06 14:00:04 +03:00
										 |  |  |         self.assertEqual(tcl.getdouble(42), 42.0) | 
					
						
							| 
									
										
										
										
											2014-05-30 14:07:38 +03:00
										 |  |  |         self.assertRaises(TypeError, tcl.getdouble) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getdouble, '42.5', '10') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getdouble, b'42.5') | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.getdouble, 'a') | 
					
						
							|  |  |  |         self.assertRaises((TypeError, ValueError, TclError), | 
					
						
							|  |  |  |                           tcl.getdouble, '42.5\0') | 
					
						
							|  |  |  |         self.assertRaises((UnicodeEncodeError, ValueError, TclError), | 
					
						
							|  |  |  |                           tcl.getdouble, '42.5\ud800') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_getboolean(self): | 
					
						
							|  |  |  |         tcl = self.interp.tk | 
					
						
							|  |  |  |         self.assertIs(tcl.getboolean('on'), True) | 
					
						
							|  |  |  |         self.assertIs(tcl.getboolean('1'), True) | 
					
						
							| 
									
										
										
										
											2015-04-04 12:43:01 +03:00
										 |  |  |         self.assertIs(tcl.getboolean(42), True) | 
					
						
							|  |  |  |         self.assertIs(tcl.getboolean(0), False) | 
					
						
							| 
									
										
										
										
											2014-05-30 14:07:38 +03:00
										 |  |  |         self.assertRaises(TypeError, tcl.getboolean) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getboolean, 'on', '1') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getboolean, b'on') | 
					
						
							|  |  |  |         self.assertRaises(TypeError, tcl.getboolean, 1.0) | 
					
						
							|  |  |  |         self.assertRaises(TclError, tcl.getboolean, 'a') | 
					
						
							|  |  |  |         self.assertRaises((TypeError, ValueError, TclError), | 
					
						
							|  |  |  |                           tcl.getboolean, 'on\0') | 
					
						
							|  |  |  |         self.assertRaises((UnicodeEncodeError, ValueError, TclError), | 
					
						
							|  |  |  |                           tcl.getboolean, 'on\ud800') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-18 05:59:53 +00:00
										 |  |  |     def testEvalFile(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |         filename = os_helper.TESTFN_ASCII | 
					
						
							|  |  |  |         self.addCleanup(os_helper.unlink, filename) | 
					
						
							|  |  |  |         with open(filename, 'w') as f: | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |             f.write("""set a 1
 | 
					
						
							|  |  |  |             set b 2 | 
					
						
							|  |  |  |             set c [ expr $a + $b ] | 
					
						
							|  |  |  |             """)
 | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |         tcl.evalfile(filename) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |         filename = os_helper.TESTFN_ASCII | 
					
						
							|  |  |  |         self.addCleanup(os_helper.unlink, filename) | 
					
						
							|  |  |  |         with open(filename, 'w') as f: | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |             f.write("""
 | 
					
						
							|  |  |  |             set a "a\0b" | 
					
						
							|  |  |  |             set b "a\\0b" | 
					
						
							|  |  |  |             """)
 | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |         tcl.evalfile(filename) | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |         self.assertEqual(tcl.eval('set a'), 'a\x00b') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set b'), 'a\x00b') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |     def test_evalfile_surrogates_in_result(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         encoding = tcl.call('encoding', 'system') | 
					
						
							|  |  |  |         self.addCleanup(tcl.call, 'encoding', 'system', encoding) | 
					
						
							|  |  |  |         tcl.call('encoding', 'system', 'utf-8') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         filename = os_helper.TESTFN_ASCII | 
					
						
							|  |  |  |         self.addCleanup(os_helper.unlink, filename) | 
					
						
							|  |  |  |         with open(filename, 'wb') as f: | 
					
						
							|  |  |  |             f.write(b"""
 | 
					
						
							|  |  |  |             set a "<\xed\xa0\xbd\xed\xb2\xbb>" | 
					
						
							|  |  |  |             set b "<\\ud83d\\udcbb>" | 
					
						
							|  |  |  |             """)
 | 
					
						
							|  |  |  |         tcl.evalfile(filename) | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') | 
					
						
							|  |  |  |         self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-06 19:51:29 +08:00
										 |  |  |         with os_helper.EnvironmentVarGuard() as env: | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  |             env.unset("TCL_LIBRARY") | 
					
						
							| 
									
										
										
										
											2015-10-12 23:27:58 -05:00
										 |  |  |             stdout = subprocess.check_output( | 
					
						
							|  |  |  |                     [unc_name, '-c', 'import tkinter; print(tkinter)']) | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 23:27:58 -05:00
										 |  |  |         self.assertIn(b'tkinter', stdout) | 
					
						
							| 
									
										
										
										
											2010-06-04 19:50:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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') | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         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"') | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         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"') | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         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"') | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         check('2**64', True) | 
					
						
							| 
									
										
										
										
											2014-02-03 20:41:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 10:35:57 +03:00
										 |  |  |     def test_booleans(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         def check(expr, expected): | 
					
						
							|  |  |  |             result = tcl.call('expr', expr) | 
					
						
							| 
									
										
										
										
											2015-04-02 11:46:07 +03:00
										 |  |  |             if tcl.wantobjects(): | 
					
						
							|  |  |  |                 self.assertEqual(result, expected) | 
					
						
							|  |  |  |                 self.assertIsInstance(result, int) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.assertIn(result, (expr, str(int(expected)))) | 
					
						
							|  |  |  |                 self.assertIsInstance(result, str) | 
					
						
							| 
									
										
										
										
											2015-04-02 10:35:57 +03:00
										 |  |  |         check('true', True) | 
					
						
							|  |  |  |         check('yes', True) | 
					
						
							|  |  |  |         check('on', True) | 
					
						
							|  |  |  |         check('false', False) | 
					
						
							|  |  |  |         check('no', False) | 
					
						
							|  |  |  |         check('off', False) | 
					
						
							|  |  |  |         check('1 < 2', True) | 
					
						
							|  |  |  |         check('1 > 2', False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  |     def test_expr_bignum(self): | 
					
						
							|  |  |  |         tcl = self.interp | 
					
						
							|  |  |  |         for i in self.get_integers(): | 
					
						
							|  |  |  |             result = tcl.call('expr', str(i)) | 
					
						
							|  |  |  |             if self.wantobjects: | 
					
						
							|  |  |  |                 self.assertEqual(result, i) | 
					
						
							|  |  |  |                 self.assertIsInstance(result, int) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.assertEqual(result, str(i)) | 
					
						
							|  |  |  |                 self.assertIsInstance(result, str) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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') | 
					
						
							| 
									
										
										
										
											2019-10-04 13:09:52 +03:00
										 |  |  |         self.assertEqual(passValue('string\U0001f4bb'), 'string\U0001f4bb') | 
					
						
							| 
									
										
										
										
											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') | 
					
						
							| 
									
										
										
										
											2019-10-04 13:09:52 +03:00
										 |  |  |         self.assertEqual(passValue('str\x00ing\U0001f4bb'), | 
					
						
							|  |  |  |                          'str\x00ing\U0001f4bb') | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |         if sys.platform != 'win32': | 
					
						
							|  |  |  |             self.assertEqual(passValue('<\udce2\udc82\udcac>'), | 
					
						
							|  |  |  |                              '<\u20ac>') | 
					
						
							|  |  |  |             self.assertEqual(passValue('<\udced\udca0\udcbd\udced\udcb2\udcbb>'), | 
					
						
							|  |  |  |                              '<\U0001f4bb>') | 
					
						
							| 
									
										
										
										
											2014-07-30 18:33:13 +03:00
										 |  |  |         self.assertEqual(passValue(b'str\x00ing'), | 
					
						
							|  |  |  |                          b'str\x00ing' if self.wantobjects else 'str\x00ing') | 
					
						
							|  |  |  |         self.assertEqual(passValue(b'str\xc0\x80ing'), | 
					
						
							|  |  |  |                          b'str\xc0\x80ing' if self.wantobjects else 'str\xc0\x80ing') | 
					
						
							|  |  |  |         self.assertEqual(passValue(b'str\xbding'), | 
					
						
							|  |  |  |                          b'str\xbding' if self.wantobjects else 'str\xbding') | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  |         for i in self.get_integers(): | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  |             self.assertEqual(float(passValue(float('inf'))), float('inf')) | 
					
						
							|  |  |  |             self.assertEqual(float(passValue(-float('inf'))), -float('inf')) | 
					
						
							| 
									
										
										
										
											2014-07-07 14:57:08 +03:00
										 |  |  |             # XXX NaN representation can be not parsable by float() | 
					
						
							| 
									
										
										
										
											2013-12-25 17:29:01 +02:00
										 |  |  |         self.assertEqual(passValue((1, '2', (3.4,))), | 
					
						
							|  |  |  |                          (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') | 
					
						
							| 
									
										
										
										
											2014-05-21 17:12:21 +03:00
										 |  |  |         self.assertEqual(passValue(['a', ['b', 'c']]), | 
					
						
							|  |  |  |                          ('a', ('b', 'c')) if self.wantobjects else 'a {b c}') | 
					
						
							| 
									
										
										
										
											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-08-18 17:47:29 +03:00
										 |  |  |         def check(value, expected=None, *, eq=self.assertEqual): | 
					
						
							|  |  |  |             if expected is None: | 
					
						
							|  |  |  |                 expected = value | 
					
						
							|  |  |  |             nonlocal result | 
					
						
							|  |  |  |             result = None | 
					
						
							| 
									
										
										
										
											2014-01-23 16:48:44 +02:00
										 |  |  |             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): | 
					
						
							|  |  |  |             self.assertAlmostEqual(float(actual), expected, | 
					
						
							|  |  |  |                                    delta=abs(expected) * 1e-10) | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         check(True, '1') | 
					
						
							|  |  |  |         check(False, '0') | 
					
						
							| 
									
										
										
										
											2014-08-18 17:47:29 +03:00
										 |  |  |         check('string') | 
					
						
							|  |  |  |         check('string\xbd') | 
					
						
							|  |  |  |         check('string\u20ac') | 
					
						
							| 
									
										
										
										
											2019-10-04 13:09:52 +03:00
										 |  |  |         check('string\U0001f4bb') | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |         if sys.platform != 'win32': | 
					
						
							|  |  |  |             check('<\udce2\udc82\udcac>', '<\u20ac>') | 
					
						
							|  |  |  |             check('<\udced\udca0\udcbd\udced\udcb2\udcbb>', '<\U0001f4bb>') | 
					
						
							| 
									
										
										
										
											2014-09-11 10:57:13 +03:00
										 |  |  |         check('') | 
					
						
							| 
									
										
										
										
											2014-02-03 21:24:07 +02:00
										 |  |  |         check(b'string', 'string') | 
					
						
							| 
									
										
										
										
											2014-07-30 18:33:13 +03:00
										 |  |  |         check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') | 
					
						
							|  |  |  |         check(b'string\xbd', 'string\xbd') | 
					
						
							| 
									
										
										
										
											2014-09-11 10:57:13 +03:00
										 |  |  |         check(b'', '') | 
					
						
							| 
									
										
										
										
											2014-08-18 17:47:29 +03:00
										 |  |  |         check('str\x00ing') | 
					
						
							|  |  |  |         check('str\x00ing\xbd') | 
					
						
							|  |  |  |         check('str\x00ing\u20ac') | 
					
						
							| 
									
										
										
										
											2014-07-30 18:33:13 +03:00
										 |  |  |         check(b'str\x00ing', 'str\x00ing') | 
					
						
							|  |  |  |         check(b'str\xc0\x80ing', 'str\xc0\x80ing') | 
					
						
							|  |  |  |         check(b'str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac') | 
					
						
							| 
									
										
										
										
											2015-04-02 18:46:50 +03:00
										 |  |  |         for i in self.get_integers(): | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  |             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-08-18 17:47:29 +03:00
										 |  |  |             check(f, eq=float_eq) | 
					
						
							|  |  |  |         check(float('inf'), eq=float_eq) | 
					
						
							|  |  |  |         check(-float('inf'), eq=float_eq) | 
					
						
							| 
									
										
										
										
											2014-07-07 14:57:08 +03:00
										 |  |  |         # XXX NaN representation can be not parsable by float() | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  |         check((), '') | 
					
						
							|  |  |  |         check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') | 
					
						
							| 
									
										
										
										
											2014-05-21 17:12:21 +03:00
										 |  |  |         check([1, [2,], [3, 4], '5 6', []], '1 2 {3 4} {5 6} {}') | 
					
						
							| 
									
										
										
										
											2014-01-23 09:44:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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')), | 
					
						
							| 
									
										
										
										
											2019-10-04 13:09:52 +03:00
										 |  |  |             ('a \U0001f4bb', ('a', '\U0001f4bb')), | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |             (b'a \xe2\x82\xac', ('a', '\u20ac')), | 
					
						
							| 
									
										
										
										
											2020-11-15 18:16:59 +02:00
										 |  |  |             (b'a \xf0\x9f\x92\xbb', ('a', '\U0001f4bb')), | 
					
						
							|  |  |  |             (b'a \xed\xa0\xbd\xed\xb2\xbb', ('a', '\U0001f4bb')), | 
					
						
							| 
									
										
										
										
											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)), | 
					
						
							|  |  |  |             ((), ()), | 
					
						
							| 
									
										
										
										
											2014-05-21 17:12:21 +03:00
										 |  |  |             ([], ()), | 
					
						
							|  |  |  |             (['a', ['b', 'c']], ('a', ['b', 'c'])), | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2014-09-04 09:53:16 +02:00
										 |  |  |         tk_patchlevel = get_tk_patchlevel() | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         if not self.wantobjects: | 
					
						
							|  |  |  |             expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) | 
					
						
							|  |  |  |         testcases += [ | 
					
						
							|  |  |  |             (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), | 
					
						
							|  |  |  |                 expected), | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2014-09-04 09:53:16 +02:00
										 |  |  |         dbg_info = ('want objects? %s, Tcl version: %s, Tk patchlevel: %s' | 
					
						
							|  |  |  |                     % (self.wantobjects, tcl_version, tk_patchlevel)) | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |         for arg, res in testcases: | 
					
						
							| 
									
										
										
										
											2014-09-04 09:53:16 +02:00
										 |  |  |             self.assertEqual(splitlist(arg), res, | 
					
						
							|  |  |  |                              'arg=%a, %s' % (arg, dbg_info)) | 
					
						
							| 
									
										
										
										
											2013-07-11 20:34:47 +03:00
										 |  |  |         self.assertRaises(TclError, splitlist, '{') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-06 22:47:58 +03:00
										 |  |  |     def test_splitdict(self): | 
					
						
							|  |  |  |         splitdict = tkinter._splitdict | 
					
						
							|  |  |  |         tcl = self.interp.tk | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         arg = '-a {1 2 3} -something foo status {}' | 
					
						
							|  |  |  |         self.assertEqual(splitdict(tcl, arg, False), | 
					
						
							|  |  |  |             {'-a': '1 2 3', '-something': 'foo', 'status': ''}) | 
					
						
							|  |  |  |         self.assertEqual(splitdict(tcl, arg), | 
					
						
							|  |  |  |             {'a': '1 2 3', 'something': 'foo', 'status': ''}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         arg = ('-a', (1, 2, 3), '-something', 'foo', 'status', '{}') | 
					
						
							|  |  |  |         self.assertEqual(splitdict(tcl, arg, False), | 
					
						
							|  |  |  |             {'-a': (1, 2, 3), '-something': 'foo', 'status': '{}'}) | 
					
						
							|  |  |  |         self.assertEqual(splitdict(tcl, arg), | 
					
						
							|  |  |  |             {'a': (1, 2, 3), 'something': 'foo', 'status': '{}'}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(RuntimeError, splitdict, tcl, '-a b -c ') | 
					
						
							|  |  |  |         self.assertRaises(RuntimeError, splitdict, tcl, ('-a', 'b', '-c')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         arg = tcl.call('list', | 
					
						
							|  |  |  |                         '-a', (1, 2, 3), '-something', 'foo', 'status', ()) | 
					
						
							|  |  |  |         self.assertEqual(splitdict(tcl, arg), | 
					
						
							|  |  |  |             {'a': (1, 2, 3) if self.wantobjects else '1 2 3', | 
					
						
							|  |  |  |              'something': 'foo', 'status': ''}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 13:05:52 +02:00
										 |  |  |         arg = tcl.call('dict', 'create', | 
					
						
							|  |  |  |                        '-a', (1, 2, 3), '-something', 'foo', 'status', ()) | 
					
						
							|  |  |  |         if not self.wantobjects: | 
					
						
							|  |  |  |             expected = {'a': '1 2 3', 'something': 'foo', 'status': ''} | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''} | 
					
						
							|  |  |  |         self.assertEqual(splitdict(tcl, arg), expected) | 
					
						
							| 
									
										
										
										
											2014-09-06 22:47:58 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 09:20:28 +03:00
										 |  |  |     def test_join(self): | 
					
						
							|  |  |  |         join = tkinter._join | 
					
						
							|  |  |  |         tcl = self.interp.tk | 
					
						
							|  |  |  |         def unpack(s): | 
					
						
							|  |  |  |             return tcl.call('lindex', s, 0) | 
					
						
							|  |  |  |         def check(value): | 
					
						
							|  |  |  |             self.assertEqual(unpack(join([value])), value) | 
					
						
							|  |  |  |             self.assertEqual(unpack(join([value, 0])), value) | 
					
						
							|  |  |  |             self.assertEqual(unpack(unpack(join([[value]]))), value) | 
					
						
							|  |  |  |             self.assertEqual(unpack(unpack(join([[value, 0]]))), value) | 
					
						
							|  |  |  |             self.assertEqual(unpack(unpack(join([[value], 0]))), value) | 
					
						
							|  |  |  |             self.assertEqual(unpack(unpack(join([[value, 0], 0]))), value) | 
					
						
							|  |  |  |         check('') | 
					
						
							|  |  |  |         check('spam') | 
					
						
							|  |  |  |         check('sp am') | 
					
						
							|  |  |  |         check('sp\tam') | 
					
						
							|  |  |  |         check('sp\nam') | 
					
						
							|  |  |  |         check(' \t\n') | 
					
						
							|  |  |  |         check('{spam}') | 
					
						
							|  |  |  |         check('{sp am}') | 
					
						
							|  |  |  |         check('"spam"') | 
					
						
							|  |  |  |         check('"sp am"') | 
					
						
							|  |  |  |         check('{"spam"}') | 
					
						
							|  |  |  |         check('"{spam}"') | 
					
						
							|  |  |  |         check('sp\\am') | 
					
						
							|  |  |  |         check('"sp\\am"') | 
					
						
							|  |  |  |         check('"{}" "{}"') | 
					
						
							|  |  |  |         check('"\\') | 
					
						
							|  |  |  |         check('"{') | 
					
						
							|  |  |  |         check('"}') | 
					
						
							|  |  |  |         check('\n\\') | 
					
						
							|  |  |  |         check('\n{') | 
					
						
							|  |  |  |         check('\n}') | 
					
						
							|  |  |  |         check('\\\n') | 
					
						
							|  |  |  |         check('{\n') | 
					
						
							|  |  |  |         check('}\n') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-30 16:04:57 +02:00
										 |  |  |     @support.cpython_only | 
					
						
							| 
									
										
										
										
											2016-05-08 20:46:22 +03:00
										 |  |  |     def test_new_tcl_obj(self): | 
					
						
							| 
									
										
										
										
											2021-05-27 23:00:26 +02:00
										 |  |  |         support.check_disallow_instantiation(self, _tkinter.Tcl_Obj) | 
					
						
							|  |  |  |         support.check_disallow_instantiation(self, _tkinter.TkttType) | 
					
						
							|  |  |  |         support.check_disallow_instantiation(self, _tkinter.TkappType) | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2014-05-30 14:24:03 +03:00
										 |  |  |     def test_huge_string_call(self, size): | 
					
						
							| 
									
										
										
										
											2013-08-21 21:38:21 +03:00
										 |  |  |         value = ' ' * size | 
					
						
							| 
									
										
										
										
											2017-10-03 22:39:55 +03:00
										 |  |  |         self.assertRaises(OverflowError, self.interp.call, 'string', 'index', value, 0) | 
					
						
							| 
									
										
										
										
											2013-08-21 21:38:21 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-30 14:24:03 +03:00
										 |  |  |     @support.cpython_only | 
					
						
							|  |  |  |     @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX") | 
					
						
							| 
									
										
										
										
											2017-10-03 22:39:55 +03:00
										 |  |  |     @support.bigmemtest(size=INT_MAX + 1, memuse=2, dry_run=False) | 
					
						
							| 
									
										
										
										
											2014-05-30 14:24:03 +03:00
										 |  |  |     def test_huge_string_builtins(self, size): | 
					
						
							| 
									
										
										
										
											2017-10-03 22:39:55 +03:00
										 |  |  |         tk = self.interp.tk | 
					
						
							| 
									
										
										
										
											2014-05-30 14:24:03 +03:00
										 |  |  |         value = '1' + ' ' * size | 
					
						
							| 
									
										
										
										
											2017-10-03 22:39:55 +03:00
										 |  |  |         self.assertRaises(OverflowError, tk.getint, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.getdouble, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.getboolean, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.eval, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.evalfile, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.record, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.adderrorinfo, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.setvar, value, 'x', 'a') | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.setvar, 'x', value, 'a') | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.unsetvar, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.unsetvar, 'x', value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.adderrorinfo, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.exprstring, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.exprlong, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.exprboolean, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.splitlist, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.createcommand, value, max) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.deletecommand, value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @support.cpython_only | 
					
						
							|  |  |  |     @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX") | 
					
						
							|  |  |  |     @support.bigmemtest(size=INT_MAX + 1, memuse=6, dry_run=False) | 
					
						
							|  |  |  |     def test_huge_string_builtins2(self, size): | 
					
						
							|  |  |  |         # These commands require larger memory for possible error messages | 
					
						
							|  |  |  |         tk = self.interp.tk | 
					
						
							|  |  |  |         value = '1' + ' ' * size | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.evalfile, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.unsetvar, value) | 
					
						
							|  |  |  |         self.assertRaises(OverflowError, tk.unsetvar, 'x', value) | 
					
						
							| 
									
										
										
										
											2014-05-30 14:24:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-21 21:38:21 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-20 17:43:49 +02:00
										 |  |  | def setUpModule(): | 
					
						
							|  |  |  |     if support.verbose: | 
					
						
							|  |  |  |         tcl = Tcl() | 
					
						
							| 
									
										
										
										
											2022-05-06 13:50:38 +03:00
										 |  |  |         print('patchlevel =', tcl.call('info', 'patchlevel'), flush=True) | 
					
						
							| 
									
										
										
										
											2013-11-20 17:43:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-19 02:37:29 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2021-09-19 15:27:33 +03:00
										 |  |  |     unittest.main() |