17db96d56Sopenharmony_ciimport unittest 27db96d56Sopenharmony_ciimport locale 37db96d56Sopenharmony_ciimport re 47db96d56Sopenharmony_ciimport subprocess 57db96d56Sopenharmony_ciimport sys 67db96d56Sopenharmony_ciimport os 77db96d56Sopenharmony_ciimport warnings 87db96d56Sopenharmony_cifrom test import support 97db96d56Sopenharmony_cifrom test.support import import_helper 107db96d56Sopenharmony_cifrom test.support import os_helper 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci# Skip this test if the _tkinter module wasn't built. 137db96d56Sopenharmony_ci_tkinter = import_helper.import_module('_tkinter') 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciimport tkinter 167db96d56Sopenharmony_cifrom tkinter import Tcl 177db96d56Sopenharmony_cifrom _tkinter import TclError 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_citry: 207db96d56Sopenharmony_ci from _testcapi import INT_MAX, PY_SSIZE_T_MAX 217db96d56Sopenharmony_ciexcept ImportError: 227db96d56Sopenharmony_ci INT_MAX = PY_SSIZE_T_MAX = sys.maxsize 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_citcl_version = tuple(map(int, _tkinter.TCL_VERSION.split('.'))) 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci_tk_patchlevel = None 277db96d56Sopenharmony_cidef get_tk_patchlevel(): 287db96d56Sopenharmony_ci global _tk_patchlevel 297db96d56Sopenharmony_ci if _tk_patchlevel is None: 307db96d56Sopenharmony_ci tcl = Tcl() 317db96d56Sopenharmony_ci _tk_patchlevel = tcl.info_patchlevel() 327db96d56Sopenharmony_ci return _tk_patchlevel 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ciclass TkinterTest(unittest.TestCase): 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci def testFlattenLen(self): 387db96d56Sopenharmony_ci # Object without length. 397db96d56Sopenharmony_ci self.assertRaises(TypeError, _tkinter._flatten, True) 407db96d56Sopenharmony_ci # Object with length, but not sequence. 417db96d56Sopenharmony_ci self.assertRaises(TypeError, _tkinter._flatten, {}) 427db96d56Sopenharmony_ci # Sequence or set, but not tuple or list. 437db96d56Sopenharmony_ci # (issue44608: there were leaks in the following cases) 447db96d56Sopenharmony_ci self.assertRaises(TypeError, _tkinter._flatten, 'string') 457db96d56Sopenharmony_ci self.assertRaises(TypeError, _tkinter._flatten, {'set'}) 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ciclass TclTest(unittest.TestCase): 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci def setUp(self): 517db96d56Sopenharmony_ci self.interp = Tcl() 527db96d56Sopenharmony_ci self.wantobjects = self.interp.tk.wantobjects() 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def testEval(self): 557db96d56Sopenharmony_ci tcl = self.interp 567db96d56Sopenharmony_ci tcl.eval('set a 1') 577db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a'),'1') 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci def test_eval_null_in_result(self): 607db96d56Sopenharmony_ci tcl = self.interp 617db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a "a\\0b"'), 'a\x00b') 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci def test_eval_surrogates_in_result(self): 647db96d56Sopenharmony_ci tcl = self.interp 657db96d56Sopenharmony_ci self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci def testEvalException(self): 687db96d56Sopenharmony_ci tcl = self.interp 697db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.eval,'set a') 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci def testEvalException2(self): 727db96d56Sopenharmony_ci tcl = self.interp 737db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.eval,'this is wrong') 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci def testCall(self): 767db96d56Sopenharmony_ci tcl = self.interp 777db96d56Sopenharmony_ci tcl.call('set','a','1') 787db96d56Sopenharmony_ci self.assertEqual(tcl.call('set','a'),'1') 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci def testCallException(self): 817db96d56Sopenharmony_ci tcl = self.interp 827db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.call,'set','a') 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci def testCallException2(self): 857db96d56Sopenharmony_ci tcl = self.interp 867db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.call,'this','is','wrong') 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci def testSetVar(self): 897db96d56Sopenharmony_ci tcl = self.interp 907db96d56Sopenharmony_ci tcl.setvar('a','1') 917db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a'),'1') 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci def testSetVarArray(self): 947db96d56Sopenharmony_ci tcl = self.interp 957db96d56Sopenharmony_ci tcl.setvar('a(1)','1') 967db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a(1)'),'1') 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci def testGetVar(self): 997db96d56Sopenharmony_ci tcl = self.interp 1007db96d56Sopenharmony_ci tcl.eval('set a 1') 1017db96d56Sopenharmony_ci self.assertEqual(tcl.getvar('a'),'1') 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci def testGetVarArray(self): 1047db96d56Sopenharmony_ci tcl = self.interp 1057db96d56Sopenharmony_ci tcl.eval('set a(1) 1') 1067db96d56Sopenharmony_ci self.assertEqual(tcl.getvar('a(1)'),'1') 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci def testGetVarException(self): 1097db96d56Sopenharmony_ci tcl = self.interp 1107db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.getvar,'a') 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci def testGetVarArrayException(self): 1137db96d56Sopenharmony_ci tcl = self.interp 1147db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.getvar,'a(1)') 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci def testUnsetVar(self): 1177db96d56Sopenharmony_ci tcl = self.interp 1187db96d56Sopenharmony_ci tcl.setvar('a',1) 1197db96d56Sopenharmony_ci self.assertEqual(tcl.eval('info exists a'),'1') 1207db96d56Sopenharmony_ci tcl.unsetvar('a') 1217db96d56Sopenharmony_ci self.assertEqual(tcl.eval('info exists a'),'0') 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci def testUnsetVarArray(self): 1247db96d56Sopenharmony_ci tcl = self.interp 1257db96d56Sopenharmony_ci tcl.setvar('a(1)',1) 1267db96d56Sopenharmony_ci tcl.setvar('a(2)',2) 1277db96d56Sopenharmony_ci self.assertEqual(tcl.eval('info exists a(1)'),'1') 1287db96d56Sopenharmony_ci self.assertEqual(tcl.eval('info exists a(2)'),'1') 1297db96d56Sopenharmony_ci tcl.unsetvar('a(1)') 1307db96d56Sopenharmony_ci self.assertEqual(tcl.eval('info exists a(1)'),'0') 1317db96d56Sopenharmony_ci self.assertEqual(tcl.eval('info exists a(2)'),'1') 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci def testUnsetVarException(self): 1347db96d56Sopenharmony_ci tcl = self.interp 1357db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.unsetvar,'a') 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci def get_integers(self): 1387db96d56Sopenharmony_ci return (0, 1, -1, 1397db96d56Sopenharmony_ci 2**31-1, -2**31, 2**31, -2**31-1, 1407db96d56Sopenharmony_ci 2**63-1, -2**63, 2**63, -2**63-1, 1417db96d56Sopenharmony_ci 2**1000, -2**1000) 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci def test_getint(self): 1447db96d56Sopenharmony_ci tcl = self.interp.tk 1457db96d56Sopenharmony_ci for i in self.get_integers(): 1467db96d56Sopenharmony_ci self.assertEqual(tcl.getint(' %d ' % i), i) 1477db96d56Sopenharmony_ci self.assertEqual(tcl.getint(' %#o ' % i), i) 1487db96d56Sopenharmony_ci # Numbers starting with 0 are parsed as decimal in Tcl 9.0 1497db96d56Sopenharmony_ci # and as octal in older versions. 1507db96d56Sopenharmony_ci self.assertEqual(tcl.getint((' %#o ' % i).replace('o', '')), 1517db96d56Sopenharmony_ci i if tcl_version < (9, 0) else int('%o' % i)) 1527db96d56Sopenharmony_ci self.assertEqual(tcl.getint(' %#x ' % i), i) 1537db96d56Sopenharmony_ci self.assertEqual(tcl.getint(42), 42) 1547db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getint) 1557db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getint, '42', '10') 1567db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getint, b'42') 1577db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getint, 42.0) 1587db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.getint, 'a') 1597db96d56Sopenharmony_ci self.assertRaises((TypeError, ValueError, TclError), 1607db96d56Sopenharmony_ci tcl.getint, '42\0') 1617db96d56Sopenharmony_ci self.assertRaises((UnicodeEncodeError, ValueError, TclError), 1627db96d56Sopenharmony_ci tcl.getint, '42\ud800') 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci def test_getdouble(self): 1657db96d56Sopenharmony_ci tcl = self.interp.tk 1667db96d56Sopenharmony_ci self.assertEqual(tcl.getdouble(' 42 '), 42.0) 1677db96d56Sopenharmony_ci self.assertEqual(tcl.getdouble(' 42.5 '), 42.5) 1687db96d56Sopenharmony_ci self.assertEqual(tcl.getdouble(42.5), 42.5) 1697db96d56Sopenharmony_ci self.assertEqual(tcl.getdouble(42), 42.0) 1707db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getdouble) 1717db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getdouble, '42.5', '10') 1727db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getdouble, b'42.5') 1737db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.getdouble, 'a') 1747db96d56Sopenharmony_ci self.assertRaises((TypeError, ValueError, TclError), 1757db96d56Sopenharmony_ci tcl.getdouble, '42.5\0') 1767db96d56Sopenharmony_ci self.assertRaises((UnicodeEncodeError, ValueError, TclError), 1777db96d56Sopenharmony_ci tcl.getdouble, '42.5\ud800') 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci def test_getboolean(self): 1807db96d56Sopenharmony_ci tcl = self.interp.tk 1817db96d56Sopenharmony_ci self.assertIs(tcl.getboolean('on'), True) 1827db96d56Sopenharmony_ci self.assertIs(tcl.getboolean('1'), True) 1837db96d56Sopenharmony_ci self.assertIs(tcl.getboolean(42), True) 1847db96d56Sopenharmony_ci self.assertIs(tcl.getboolean(0), False) 1857db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getboolean) 1867db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getboolean, 'on', '1') 1877db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getboolean, b'on') 1887db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.getboolean, 1.0) 1897db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.getboolean, 'a') 1907db96d56Sopenharmony_ci self.assertRaises((TypeError, ValueError, TclError), 1917db96d56Sopenharmony_ci tcl.getboolean, 'on\0') 1927db96d56Sopenharmony_ci self.assertRaises((UnicodeEncodeError, ValueError, TclError), 1937db96d56Sopenharmony_ci tcl.getboolean, 'on\ud800') 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci def testEvalFile(self): 1967db96d56Sopenharmony_ci tcl = self.interp 1977db96d56Sopenharmony_ci filename = os_helper.TESTFN_ASCII 1987db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 1997db96d56Sopenharmony_ci with open(filename, 'w') as f: 2007db96d56Sopenharmony_ci f.write("""set a 1 2017db96d56Sopenharmony_ci set b 2 2027db96d56Sopenharmony_ci set c [ expr $a + $b ] 2037db96d56Sopenharmony_ci """) 2047db96d56Sopenharmony_ci tcl.evalfile(filename) 2057db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a'),'1') 2067db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set b'),'2') 2077db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set c'),'3') 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci def test_evalfile_null_in_result(self): 2107db96d56Sopenharmony_ci tcl = self.interp 2117db96d56Sopenharmony_ci filename = os_helper.TESTFN_ASCII 2127db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 2137db96d56Sopenharmony_ci with open(filename, 'w') as f: 2147db96d56Sopenharmony_ci f.write(""" 2157db96d56Sopenharmony_ci set a "a\0b" 2167db96d56Sopenharmony_ci set b "a\\0b" 2177db96d56Sopenharmony_ci """) 2187db96d56Sopenharmony_ci tcl.evalfile(filename) 2197db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a'), 'a\x00b') 2207db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set b'), 'a\x00b') 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci def test_evalfile_surrogates_in_result(self): 2237db96d56Sopenharmony_ci tcl = self.interp 2247db96d56Sopenharmony_ci encoding = tcl.call('encoding', 'system') 2257db96d56Sopenharmony_ci self.addCleanup(tcl.call, 'encoding', 'system', encoding) 2267db96d56Sopenharmony_ci tcl.call('encoding', 'system', 'utf-8') 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_ci filename = os_helper.TESTFN_ASCII 2297db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 2307db96d56Sopenharmony_ci with open(filename, 'wb') as f: 2317db96d56Sopenharmony_ci f.write(b""" 2327db96d56Sopenharmony_ci set a "<\xed\xa0\xbd\xed\xb2\xbb>" 2337db96d56Sopenharmony_ci set b "<\\ud83d\\udcbb>" 2347db96d56Sopenharmony_ci """) 2357db96d56Sopenharmony_ci tcl.evalfile(filename) 2367db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') 2377db96d56Sopenharmony_ci self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>') 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ci def testEvalFileException(self): 2407db96d56Sopenharmony_ci tcl = self.interp 2417db96d56Sopenharmony_ci filename = "doesnotexists" 2427db96d56Sopenharmony_ci try: 2437db96d56Sopenharmony_ci os.remove(filename) 2447db96d56Sopenharmony_ci except Exception as e: 2457db96d56Sopenharmony_ci pass 2467db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.evalfile,filename) 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci def testPackageRequireException(self): 2497db96d56Sopenharmony_ci tcl = self.interp 2507db96d56Sopenharmony_ci self.assertRaises(TclError,tcl.eval,'package require DNE') 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == 'win32', 'Requires Windows') 2537db96d56Sopenharmony_ci def testLoadWithUNC(self): 2547db96d56Sopenharmony_ci # Build a UNC path from the regular path. 2557db96d56Sopenharmony_ci # Something like 2567db96d56Sopenharmony_ci # \\%COMPUTERNAME%\c$\python27\python.exe 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci fullname = os.path.abspath(sys.executable) 2597db96d56Sopenharmony_ci if fullname[1] != ':': 2607db96d56Sopenharmony_ci raise unittest.SkipTest('Absolute path should have drive part') 2617db96d56Sopenharmony_ci unc_name = r'\\%s\%s$\%s' % (os.environ['COMPUTERNAME'], 2627db96d56Sopenharmony_ci fullname[0], 2637db96d56Sopenharmony_ci fullname[3:]) 2647db96d56Sopenharmony_ci if not os.path.exists(unc_name): 2657db96d56Sopenharmony_ci raise unittest.SkipTest('Cannot connect to UNC Path') 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci with os_helper.EnvironmentVarGuard() as env: 2687db96d56Sopenharmony_ci env.unset("TCL_LIBRARY") 2697db96d56Sopenharmony_ci stdout = subprocess.check_output( 2707db96d56Sopenharmony_ci [unc_name, '-c', 'import tkinter; print(tkinter)']) 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci self.assertIn(b'tkinter', stdout) 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci def test_exprstring(self): 2757db96d56Sopenharmony_ci tcl = self.interp 2767db96d56Sopenharmony_ci tcl.call('set', 'a', 3) 2777db96d56Sopenharmony_ci tcl.call('set', 'b', 6) 2787db96d56Sopenharmony_ci def check(expr, expected): 2797db96d56Sopenharmony_ci result = tcl.exprstring(expr) 2807db96d56Sopenharmony_ci self.assertEqual(result, expected) 2817db96d56Sopenharmony_ci self.assertIsInstance(result, str) 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprstring) 2847db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprstring, '8.2', '+6') 2857db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprstring, b'8.2 + 6') 2867db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprstring, 'spam') 2877db96d56Sopenharmony_ci check('', '0') 2887db96d56Sopenharmony_ci check('8.2 + 6', '14.2') 2897db96d56Sopenharmony_ci check('3.1 + $a', '6.1') 2907db96d56Sopenharmony_ci check('2 + "$a.$b"', '5.6') 2917db96d56Sopenharmony_ci check('4*[llength "6 2"]', '8') 2927db96d56Sopenharmony_ci check('{word one} < "word $a"', '0') 2937db96d56Sopenharmony_ci check('4*2 < 7', '0') 2947db96d56Sopenharmony_ci check('hypot($a, 4)', '5.0') 2957db96d56Sopenharmony_ci check('5 / 4', '1') 2967db96d56Sopenharmony_ci check('5 / 4.0', '1.25') 2977db96d56Sopenharmony_ci check('5 / ( [string length "abcd"] + 0.0 )', '1.25') 2987db96d56Sopenharmony_ci check('20.0/5.0', '4.0') 2997db96d56Sopenharmony_ci check('"0x03" > "2"', '1') 3007db96d56Sopenharmony_ci check('[string length "a\xbd\u20ac"]', '3') 3017db96d56Sopenharmony_ci check(r'[string length "a\xbd\u20ac"]', '3') 3027db96d56Sopenharmony_ci check('"abc"', 'abc') 3037db96d56Sopenharmony_ci check('"a\xbd\u20ac"', 'a\xbd\u20ac') 3047db96d56Sopenharmony_ci check(r'"a\xbd\u20ac"', 'a\xbd\u20ac') 3057db96d56Sopenharmony_ci check(r'"a\0b"', 'a\x00b') 3067db96d56Sopenharmony_ci check('2**64', str(2**64)) 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci def test_exprdouble(self): 3097db96d56Sopenharmony_ci tcl = self.interp 3107db96d56Sopenharmony_ci tcl.call('set', 'a', 3) 3117db96d56Sopenharmony_ci tcl.call('set', 'b', 6) 3127db96d56Sopenharmony_ci def check(expr, expected): 3137db96d56Sopenharmony_ci result = tcl.exprdouble(expr) 3147db96d56Sopenharmony_ci self.assertEqual(result, expected) 3157db96d56Sopenharmony_ci self.assertIsInstance(result, float) 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprdouble) 3187db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprdouble, '8.2', '+6') 3197db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprdouble, b'8.2 + 6') 3207db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprdouble, 'spam') 3217db96d56Sopenharmony_ci check('', 0.0) 3227db96d56Sopenharmony_ci check('8.2 + 6', 14.2) 3237db96d56Sopenharmony_ci check('3.1 + $a', 6.1) 3247db96d56Sopenharmony_ci check('2 + "$a.$b"', 5.6) 3257db96d56Sopenharmony_ci check('4*[llength "6 2"]', 8.0) 3267db96d56Sopenharmony_ci check('{word one} < "word $a"', 0.0) 3277db96d56Sopenharmony_ci check('4*2 < 7', 0.0) 3287db96d56Sopenharmony_ci check('hypot($a, 4)', 5.0) 3297db96d56Sopenharmony_ci check('5 / 4', 1.0) 3307db96d56Sopenharmony_ci check('5 / 4.0', 1.25) 3317db96d56Sopenharmony_ci check('5 / ( [string length "abcd"] + 0.0 )', 1.25) 3327db96d56Sopenharmony_ci check('20.0/5.0', 4.0) 3337db96d56Sopenharmony_ci check('"0x03" > "2"', 1.0) 3347db96d56Sopenharmony_ci check('[string length "a\xbd\u20ac"]', 3.0) 3357db96d56Sopenharmony_ci check(r'[string length "a\xbd\u20ac"]', 3.0) 3367db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprdouble, '"abc"') 3377db96d56Sopenharmony_ci check('2**64', float(2**64)) 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci def test_exprlong(self): 3407db96d56Sopenharmony_ci tcl = self.interp 3417db96d56Sopenharmony_ci tcl.call('set', 'a', 3) 3427db96d56Sopenharmony_ci tcl.call('set', 'b', 6) 3437db96d56Sopenharmony_ci def check(expr, expected): 3447db96d56Sopenharmony_ci result = tcl.exprlong(expr) 3457db96d56Sopenharmony_ci self.assertEqual(result, expected) 3467db96d56Sopenharmony_ci self.assertIsInstance(result, int) 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprlong) 3497db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprlong, '8.2', '+6') 3507db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprlong, b'8.2 + 6') 3517db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprlong, 'spam') 3527db96d56Sopenharmony_ci check('', 0) 3537db96d56Sopenharmony_ci check('8.2 + 6', 14) 3547db96d56Sopenharmony_ci check('3.1 + $a', 6) 3557db96d56Sopenharmony_ci check('2 + "$a.$b"', 5) 3567db96d56Sopenharmony_ci check('4*[llength "6 2"]', 8) 3577db96d56Sopenharmony_ci check('{word one} < "word $a"', 0) 3587db96d56Sopenharmony_ci check('4*2 < 7', 0) 3597db96d56Sopenharmony_ci check('hypot($a, 4)', 5) 3607db96d56Sopenharmony_ci check('5 / 4', 1) 3617db96d56Sopenharmony_ci check('5 / 4.0', 1) 3627db96d56Sopenharmony_ci check('5 / ( [string length "abcd"] + 0.0 )', 1) 3637db96d56Sopenharmony_ci check('20.0/5.0', 4) 3647db96d56Sopenharmony_ci check('"0x03" > "2"', 1) 3657db96d56Sopenharmony_ci check('[string length "a\xbd\u20ac"]', 3) 3667db96d56Sopenharmony_ci check(r'[string length "a\xbd\u20ac"]', 3) 3677db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprlong, '"abc"') 3687db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprlong, '2**64') 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci def test_exprboolean(self): 3717db96d56Sopenharmony_ci tcl = self.interp 3727db96d56Sopenharmony_ci tcl.call('set', 'a', 3) 3737db96d56Sopenharmony_ci tcl.call('set', 'b', 6) 3747db96d56Sopenharmony_ci def check(expr, expected): 3757db96d56Sopenharmony_ci result = tcl.exprboolean(expr) 3767db96d56Sopenharmony_ci self.assertEqual(result, expected) 3777db96d56Sopenharmony_ci self.assertIsInstance(result, int) 3787db96d56Sopenharmony_ci self.assertNotIsInstance(result, bool) 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprboolean) 3817db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprboolean, '8.2', '+6') 3827db96d56Sopenharmony_ci self.assertRaises(TypeError, tcl.exprboolean, b'8.2 + 6') 3837db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprboolean, 'spam') 3847db96d56Sopenharmony_ci check('', False) 3857db96d56Sopenharmony_ci for value in ('0', 'false', 'no', 'off'): 3867db96d56Sopenharmony_ci check(value, False) 3877db96d56Sopenharmony_ci check('"%s"' % value, False) 3887db96d56Sopenharmony_ci check('{%s}' % value, False) 3897db96d56Sopenharmony_ci for value in ('1', 'true', 'yes', 'on'): 3907db96d56Sopenharmony_ci check(value, True) 3917db96d56Sopenharmony_ci check('"%s"' % value, True) 3927db96d56Sopenharmony_ci check('{%s}' % value, True) 3937db96d56Sopenharmony_ci check('8.2 + 6', True) 3947db96d56Sopenharmony_ci check('3.1 + $a', True) 3957db96d56Sopenharmony_ci check('2 + "$a.$b"', True) 3967db96d56Sopenharmony_ci check('4*[llength "6 2"]', True) 3977db96d56Sopenharmony_ci check('{word one} < "word $a"', False) 3987db96d56Sopenharmony_ci check('4*2 < 7', False) 3997db96d56Sopenharmony_ci check('hypot($a, 4)', True) 4007db96d56Sopenharmony_ci check('5 / 4', True) 4017db96d56Sopenharmony_ci check('5 / 4.0', True) 4027db96d56Sopenharmony_ci check('5 / ( [string length "abcd"] + 0.0 )', True) 4037db96d56Sopenharmony_ci check('20.0/5.0', True) 4047db96d56Sopenharmony_ci check('"0x03" > "2"', True) 4057db96d56Sopenharmony_ci check('[string length "a\xbd\u20ac"]', True) 4067db96d56Sopenharmony_ci check(r'[string length "a\xbd\u20ac"]', True) 4077db96d56Sopenharmony_ci self.assertRaises(TclError, tcl.exprboolean, '"abc"') 4087db96d56Sopenharmony_ci check('2**64', True) 4097db96d56Sopenharmony_ci 4107db96d56Sopenharmony_ci def test_booleans(self): 4117db96d56Sopenharmony_ci tcl = self.interp 4127db96d56Sopenharmony_ci def check(expr, expected): 4137db96d56Sopenharmony_ci result = tcl.call('expr', expr) 4147db96d56Sopenharmony_ci if tcl.wantobjects(): 4157db96d56Sopenharmony_ci self.assertEqual(result, expected) 4167db96d56Sopenharmony_ci self.assertIsInstance(result, int) 4177db96d56Sopenharmony_ci else: 4187db96d56Sopenharmony_ci self.assertIn(result, (expr, str(int(expected)))) 4197db96d56Sopenharmony_ci self.assertIsInstance(result, str) 4207db96d56Sopenharmony_ci check('true', True) 4217db96d56Sopenharmony_ci check('yes', True) 4227db96d56Sopenharmony_ci check('on', True) 4237db96d56Sopenharmony_ci check('false', False) 4247db96d56Sopenharmony_ci check('no', False) 4257db96d56Sopenharmony_ci check('off', False) 4267db96d56Sopenharmony_ci check('1 < 2', True) 4277db96d56Sopenharmony_ci check('1 > 2', False) 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci def test_expr_bignum(self): 4307db96d56Sopenharmony_ci tcl = self.interp 4317db96d56Sopenharmony_ci for i in self.get_integers(): 4327db96d56Sopenharmony_ci result = tcl.call('expr', str(i)) 4337db96d56Sopenharmony_ci if self.wantobjects: 4347db96d56Sopenharmony_ci self.assertEqual(result, i) 4357db96d56Sopenharmony_ci self.assertIsInstance(result, int) 4367db96d56Sopenharmony_ci else: 4377db96d56Sopenharmony_ci self.assertEqual(result, str(i)) 4387db96d56Sopenharmony_ci self.assertIsInstance(result, str) 4397db96d56Sopenharmony_ci 4407db96d56Sopenharmony_ci def test_passing_values(self): 4417db96d56Sopenharmony_ci def passValue(value): 4427db96d56Sopenharmony_ci return self.interp.call('set', '_', value) 4437db96d56Sopenharmony_ci 4447db96d56Sopenharmony_ci self.assertEqual(passValue(True), True if self.wantobjects else '1') 4457db96d56Sopenharmony_ci self.assertEqual(passValue(False), False if self.wantobjects else '0') 4467db96d56Sopenharmony_ci self.assertEqual(passValue('string'), 'string') 4477db96d56Sopenharmony_ci self.assertEqual(passValue('string\u20ac'), 'string\u20ac') 4487db96d56Sopenharmony_ci self.assertEqual(passValue('string\U0001f4bb'), 'string\U0001f4bb') 4497db96d56Sopenharmony_ci self.assertEqual(passValue('str\x00ing'), 'str\x00ing') 4507db96d56Sopenharmony_ci self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd') 4517db96d56Sopenharmony_ci self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') 4527db96d56Sopenharmony_ci self.assertEqual(passValue('str\x00ing\U0001f4bb'), 4537db96d56Sopenharmony_ci 'str\x00ing\U0001f4bb') 4547db96d56Sopenharmony_ci if sys.platform != 'win32': 4557db96d56Sopenharmony_ci self.assertEqual(passValue('<\udce2\udc82\udcac>'), 4567db96d56Sopenharmony_ci '<\u20ac>') 4577db96d56Sopenharmony_ci self.assertEqual(passValue('<\udced\udca0\udcbd\udced\udcb2\udcbb>'), 4587db96d56Sopenharmony_ci '<\U0001f4bb>') 4597db96d56Sopenharmony_ci self.assertEqual(passValue(b'str\x00ing'), 4607db96d56Sopenharmony_ci b'str\x00ing' if self.wantobjects else 'str\x00ing') 4617db96d56Sopenharmony_ci self.assertEqual(passValue(b'str\xc0\x80ing'), 4627db96d56Sopenharmony_ci b'str\xc0\x80ing' if self.wantobjects else 'str\xc0\x80ing') 4637db96d56Sopenharmony_ci self.assertEqual(passValue(b'str\xbding'), 4647db96d56Sopenharmony_ci b'str\xbding' if self.wantobjects else 'str\xbding') 4657db96d56Sopenharmony_ci for i in self.get_integers(): 4667db96d56Sopenharmony_ci self.assertEqual(passValue(i), i if self.wantobjects else str(i)) 4677db96d56Sopenharmony_ci for f in (0.0, 1.0, -1.0, 1/3, 4687db96d56Sopenharmony_ci sys.float_info.min, sys.float_info.max, 4697db96d56Sopenharmony_ci -sys.float_info.min, -sys.float_info.max): 4707db96d56Sopenharmony_ci if self.wantobjects: 4717db96d56Sopenharmony_ci self.assertEqual(passValue(f), f) 4727db96d56Sopenharmony_ci else: 4737db96d56Sopenharmony_ci self.assertEqual(float(passValue(f)), f) 4747db96d56Sopenharmony_ci if self.wantobjects: 4757db96d56Sopenharmony_ci f = passValue(float('nan')) 4767db96d56Sopenharmony_ci self.assertNotEqual(f, f) 4777db96d56Sopenharmony_ci self.assertEqual(passValue(float('inf')), float('inf')) 4787db96d56Sopenharmony_ci self.assertEqual(passValue(-float('inf')), -float('inf')) 4797db96d56Sopenharmony_ci else: 4807db96d56Sopenharmony_ci self.assertEqual(float(passValue(float('inf'))), float('inf')) 4817db96d56Sopenharmony_ci self.assertEqual(float(passValue(-float('inf'))), -float('inf')) 4827db96d56Sopenharmony_ci # XXX NaN representation can be not parsable by float() 4837db96d56Sopenharmony_ci self.assertEqual(passValue((1, '2', (3.4,))), 4847db96d56Sopenharmony_ci (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') 4857db96d56Sopenharmony_ci self.assertEqual(passValue(['a', ['b', 'c']]), 4867db96d56Sopenharmony_ci ('a', ('b', 'c')) if self.wantobjects else 'a {b c}') 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci def test_user_command(self): 4897db96d56Sopenharmony_ci result = None 4907db96d56Sopenharmony_ci def testfunc(arg): 4917db96d56Sopenharmony_ci nonlocal result 4927db96d56Sopenharmony_ci result = arg 4937db96d56Sopenharmony_ci return arg 4947db96d56Sopenharmony_ci self.interp.createcommand('testfunc', testfunc) 4957db96d56Sopenharmony_ci self.addCleanup(self.interp.tk.deletecommand, 'testfunc') 4967db96d56Sopenharmony_ci def check(value, expected=None, *, eq=self.assertEqual): 4977db96d56Sopenharmony_ci if expected is None: 4987db96d56Sopenharmony_ci expected = value 4997db96d56Sopenharmony_ci nonlocal result 5007db96d56Sopenharmony_ci result = None 5017db96d56Sopenharmony_ci r = self.interp.call('testfunc', value) 5027db96d56Sopenharmony_ci self.assertIsInstance(result, str) 5037db96d56Sopenharmony_ci eq(result, expected) 5047db96d56Sopenharmony_ci self.assertIsInstance(r, str) 5057db96d56Sopenharmony_ci eq(r, expected) 5067db96d56Sopenharmony_ci def float_eq(actual, expected): 5077db96d56Sopenharmony_ci self.assertAlmostEqual(float(actual), expected, 5087db96d56Sopenharmony_ci delta=abs(expected) * 1e-10) 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci check(True, '1') 5117db96d56Sopenharmony_ci check(False, '0') 5127db96d56Sopenharmony_ci check('string') 5137db96d56Sopenharmony_ci check('string\xbd') 5147db96d56Sopenharmony_ci check('string\u20ac') 5157db96d56Sopenharmony_ci check('string\U0001f4bb') 5167db96d56Sopenharmony_ci if sys.platform != 'win32': 5177db96d56Sopenharmony_ci check('<\udce2\udc82\udcac>', '<\u20ac>') 5187db96d56Sopenharmony_ci check('<\udced\udca0\udcbd\udced\udcb2\udcbb>', '<\U0001f4bb>') 5197db96d56Sopenharmony_ci check('') 5207db96d56Sopenharmony_ci check(b'string', 'string') 5217db96d56Sopenharmony_ci check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') 5227db96d56Sopenharmony_ci check(b'string\xbd', 'string\xbd') 5237db96d56Sopenharmony_ci check(b'', '') 5247db96d56Sopenharmony_ci check('str\x00ing') 5257db96d56Sopenharmony_ci check('str\x00ing\xbd') 5267db96d56Sopenharmony_ci check('str\x00ing\u20ac') 5277db96d56Sopenharmony_ci check(b'str\x00ing', 'str\x00ing') 5287db96d56Sopenharmony_ci check(b'str\xc0\x80ing', 'str\xc0\x80ing') 5297db96d56Sopenharmony_ci check(b'str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac') 5307db96d56Sopenharmony_ci for i in self.get_integers(): 5317db96d56Sopenharmony_ci check(i, str(i)) 5327db96d56Sopenharmony_ci for f in (0.0, 1.0, -1.0): 5337db96d56Sopenharmony_ci check(f, repr(f)) 5347db96d56Sopenharmony_ci for f in (1/3.0, sys.float_info.min, sys.float_info.max, 5357db96d56Sopenharmony_ci -sys.float_info.min, -sys.float_info.max): 5367db96d56Sopenharmony_ci check(f, eq=float_eq) 5377db96d56Sopenharmony_ci check(float('inf'), eq=float_eq) 5387db96d56Sopenharmony_ci check(-float('inf'), eq=float_eq) 5397db96d56Sopenharmony_ci # XXX NaN representation can be not parsable by float() 5407db96d56Sopenharmony_ci check((), '') 5417db96d56Sopenharmony_ci check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') 5427db96d56Sopenharmony_ci check([1, [2,], [3, 4], '5 6', []], '1 2 {3 4} {5 6} {}') 5437db96d56Sopenharmony_ci 5447db96d56Sopenharmony_ci def test_splitlist(self): 5457db96d56Sopenharmony_ci splitlist = self.interp.tk.splitlist 5467db96d56Sopenharmony_ci call = self.interp.tk.call 5477db96d56Sopenharmony_ci self.assertRaises(TypeError, splitlist) 5487db96d56Sopenharmony_ci self.assertRaises(TypeError, splitlist, 'a', 'b') 5497db96d56Sopenharmony_ci self.assertRaises(TypeError, splitlist, 2) 5507db96d56Sopenharmony_ci testcases = [ 5517db96d56Sopenharmony_ci ('2', ('2',)), 5527db96d56Sopenharmony_ci ('', ()), 5537db96d56Sopenharmony_ci ('{}', ('',)), 5547db96d56Sopenharmony_ci ('""', ('',)), 5557db96d56Sopenharmony_ci ('a\n b\t\r c\n ', ('a', 'b', 'c')), 5567db96d56Sopenharmony_ci (b'a\n b\t\r c\n ', ('a', 'b', 'c')), 5577db96d56Sopenharmony_ci ('a \u20ac', ('a', '\u20ac')), 5587db96d56Sopenharmony_ci ('a \U0001f4bb', ('a', '\U0001f4bb')), 5597db96d56Sopenharmony_ci (b'a \xe2\x82\xac', ('a', '\u20ac')), 5607db96d56Sopenharmony_ci (b'a \xf0\x9f\x92\xbb', ('a', '\U0001f4bb')), 5617db96d56Sopenharmony_ci (b'a \xed\xa0\xbd\xed\xb2\xbb', ('a', '\U0001f4bb')), 5627db96d56Sopenharmony_ci (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')), 5637db96d56Sopenharmony_ci ('a {b c}', ('a', 'b c')), 5647db96d56Sopenharmony_ci (r'a b\ c', ('a', 'b c')), 5657db96d56Sopenharmony_ci (('a', 'b c'), ('a', 'b c')), 5667db96d56Sopenharmony_ci ('a 2', ('a', '2')), 5677db96d56Sopenharmony_ci (('a', 2), ('a', 2)), 5687db96d56Sopenharmony_ci ('a 3.4', ('a', '3.4')), 5697db96d56Sopenharmony_ci (('a', 3.4), ('a', 3.4)), 5707db96d56Sopenharmony_ci ((), ()), 5717db96d56Sopenharmony_ci ([], ()), 5727db96d56Sopenharmony_ci (['a', ['b', 'c']], ('a', ['b', 'c'])), 5737db96d56Sopenharmony_ci (call('list', 1, '2', (3.4,)), 5747db96d56Sopenharmony_ci (1, '2', (3.4,)) if self.wantobjects else 5757db96d56Sopenharmony_ci ('1', '2', '3.4')), 5767db96d56Sopenharmony_ci ] 5777db96d56Sopenharmony_ci tk_patchlevel = get_tk_patchlevel() 5787db96d56Sopenharmony_ci if not self.wantobjects: 5797db96d56Sopenharmony_ci expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') 5807db96d56Sopenharmony_ci else: 5817db96d56Sopenharmony_ci expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) 5827db96d56Sopenharmony_ci testcases += [ 5837db96d56Sopenharmony_ci (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), 5847db96d56Sopenharmony_ci expected), 5857db96d56Sopenharmony_ci ] 5867db96d56Sopenharmony_ci dbg_info = ('want objects? %s, Tcl version: %s, Tk patchlevel: %s' 5877db96d56Sopenharmony_ci % (self.wantobjects, tcl_version, tk_patchlevel)) 5887db96d56Sopenharmony_ci for arg, res in testcases: 5897db96d56Sopenharmony_ci self.assertEqual(splitlist(arg), res, 5907db96d56Sopenharmony_ci 'arg=%a, %s' % (arg, dbg_info)) 5917db96d56Sopenharmony_ci self.assertRaises(TclError, splitlist, '{') 5927db96d56Sopenharmony_ci 5937db96d56Sopenharmony_ci def test_splitdict(self): 5947db96d56Sopenharmony_ci splitdict = tkinter._splitdict 5957db96d56Sopenharmony_ci tcl = self.interp.tk 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci arg = '-a {1 2 3} -something foo status {}' 5987db96d56Sopenharmony_ci self.assertEqual(splitdict(tcl, arg, False), 5997db96d56Sopenharmony_ci {'-a': '1 2 3', '-something': 'foo', 'status': ''}) 6007db96d56Sopenharmony_ci self.assertEqual(splitdict(tcl, arg), 6017db96d56Sopenharmony_ci {'a': '1 2 3', 'something': 'foo', 'status': ''}) 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ci arg = ('-a', (1, 2, 3), '-something', 'foo', 'status', '{}') 6047db96d56Sopenharmony_ci self.assertEqual(splitdict(tcl, arg, False), 6057db96d56Sopenharmony_ci {'-a': (1, 2, 3), '-something': 'foo', 'status': '{}'}) 6067db96d56Sopenharmony_ci self.assertEqual(splitdict(tcl, arg), 6077db96d56Sopenharmony_ci {'a': (1, 2, 3), 'something': 'foo', 'status': '{}'}) 6087db96d56Sopenharmony_ci 6097db96d56Sopenharmony_ci self.assertRaises(RuntimeError, splitdict, tcl, '-a b -c ') 6107db96d56Sopenharmony_ci self.assertRaises(RuntimeError, splitdict, tcl, ('-a', 'b', '-c')) 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci arg = tcl.call('list', 6137db96d56Sopenharmony_ci '-a', (1, 2, 3), '-something', 'foo', 'status', ()) 6147db96d56Sopenharmony_ci self.assertEqual(splitdict(tcl, arg), 6157db96d56Sopenharmony_ci {'a': (1, 2, 3) if self.wantobjects else '1 2 3', 6167db96d56Sopenharmony_ci 'something': 'foo', 'status': ''}) 6177db96d56Sopenharmony_ci 6187db96d56Sopenharmony_ci arg = tcl.call('dict', 'create', 6197db96d56Sopenharmony_ci '-a', (1, 2, 3), '-something', 'foo', 'status', ()) 6207db96d56Sopenharmony_ci if not self.wantobjects: 6217db96d56Sopenharmony_ci expected = {'a': '1 2 3', 'something': 'foo', 'status': ''} 6227db96d56Sopenharmony_ci else: 6237db96d56Sopenharmony_ci expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''} 6247db96d56Sopenharmony_ci self.assertEqual(splitdict(tcl, arg), expected) 6257db96d56Sopenharmony_ci 6267db96d56Sopenharmony_ci def test_join(self): 6277db96d56Sopenharmony_ci join = tkinter._join 6287db96d56Sopenharmony_ci tcl = self.interp.tk 6297db96d56Sopenharmony_ci def unpack(s): 6307db96d56Sopenharmony_ci return tcl.call('lindex', s, 0) 6317db96d56Sopenharmony_ci def check(value): 6327db96d56Sopenharmony_ci self.assertEqual(unpack(join([value])), value) 6337db96d56Sopenharmony_ci self.assertEqual(unpack(join([value, 0])), value) 6347db96d56Sopenharmony_ci self.assertEqual(unpack(unpack(join([[value]]))), value) 6357db96d56Sopenharmony_ci self.assertEqual(unpack(unpack(join([[value, 0]]))), value) 6367db96d56Sopenharmony_ci self.assertEqual(unpack(unpack(join([[value], 0]))), value) 6377db96d56Sopenharmony_ci self.assertEqual(unpack(unpack(join([[value, 0], 0]))), value) 6387db96d56Sopenharmony_ci check('') 6397db96d56Sopenharmony_ci check('spam') 6407db96d56Sopenharmony_ci check('sp am') 6417db96d56Sopenharmony_ci check('sp\tam') 6427db96d56Sopenharmony_ci check('sp\nam') 6437db96d56Sopenharmony_ci check(' \t\n') 6447db96d56Sopenharmony_ci check('{spam}') 6457db96d56Sopenharmony_ci check('{sp am}') 6467db96d56Sopenharmony_ci check('"spam"') 6477db96d56Sopenharmony_ci check('"sp am"') 6487db96d56Sopenharmony_ci check('{"spam"}') 6497db96d56Sopenharmony_ci check('"{spam}"') 6507db96d56Sopenharmony_ci check('sp\\am') 6517db96d56Sopenharmony_ci check('"sp\\am"') 6527db96d56Sopenharmony_ci check('"{}" "{}"') 6537db96d56Sopenharmony_ci check('"\\') 6547db96d56Sopenharmony_ci check('"{') 6557db96d56Sopenharmony_ci check('"}') 6567db96d56Sopenharmony_ci check('\n\\') 6577db96d56Sopenharmony_ci check('\n{') 6587db96d56Sopenharmony_ci check('\n}') 6597db96d56Sopenharmony_ci check('\\\n') 6607db96d56Sopenharmony_ci check('{\n') 6617db96d56Sopenharmony_ci check('}\n') 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ci @support.cpython_only 6647db96d56Sopenharmony_ci def test_new_tcl_obj(self): 6657db96d56Sopenharmony_ci support.check_disallow_instantiation(self, _tkinter.Tcl_Obj) 6667db96d56Sopenharmony_ci support.check_disallow_instantiation(self, _tkinter.TkttType) 6677db96d56Sopenharmony_ci support.check_disallow_instantiation(self, _tkinter.TkappType) 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ciclass BigmemTclTest(unittest.TestCase): 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci def setUp(self): 6727db96d56Sopenharmony_ci self.interp = Tcl() 6737db96d56Sopenharmony_ci 6747db96d56Sopenharmony_ci @support.cpython_only 6757db96d56Sopenharmony_ci @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX") 6767db96d56Sopenharmony_ci @support.bigmemtest(size=INT_MAX + 1, memuse=5, dry_run=False) 6777db96d56Sopenharmony_ci def test_huge_string_call(self, size): 6787db96d56Sopenharmony_ci value = ' ' * size 6797db96d56Sopenharmony_ci self.assertRaises(OverflowError, self.interp.call, 'string', 'index', value, 0) 6807db96d56Sopenharmony_ci 6817db96d56Sopenharmony_ci @support.cpython_only 6827db96d56Sopenharmony_ci @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX") 6837db96d56Sopenharmony_ci @support.bigmemtest(size=INT_MAX + 1, memuse=2, dry_run=False) 6847db96d56Sopenharmony_ci def test_huge_string_builtins(self, size): 6857db96d56Sopenharmony_ci tk = self.interp.tk 6867db96d56Sopenharmony_ci value = '1' + ' ' * size 6877db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.getint, value) 6887db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.getdouble, value) 6897db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.getboolean, value) 6907db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.eval, value) 6917db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.evalfile, value) 6927db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.record, value) 6937db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.adderrorinfo, value) 6947db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.setvar, value, 'x', 'a') 6957db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.setvar, 'x', value, 'a') 6967db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.unsetvar, value) 6977db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.unsetvar, 'x', value) 6987db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.adderrorinfo, value) 6997db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.exprstring, value) 7007db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.exprlong, value) 7017db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.exprboolean, value) 7027db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.splitlist, value) 7037db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.createcommand, value, max) 7047db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.deletecommand, value) 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci @support.cpython_only 7077db96d56Sopenharmony_ci @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, "needs UINT_MAX < SIZE_MAX") 7087db96d56Sopenharmony_ci @support.bigmemtest(size=INT_MAX + 1, memuse=6, dry_run=False) 7097db96d56Sopenharmony_ci def test_huge_string_builtins2(self, size): 7107db96d56Sopenharmony_ci # These commands require larger memory for possible error messages 7117db96d56Sopenharmony_ci tk = self.interp.tk 7127db96d56Sopenharmony_ci value = '1' + ' ' * size 7137db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.evalfile, value) 7147db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.unsetvar, value) 7157db96d56Sopenharmony_ci self.assertRaises(OverflowError, tk.unsetvar, 'x', value) 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_cidef setUpModule(): 7197db96d56Sopenharmony_ci if support.verbose: 7207db96d56Sopenharmony_ci tcl = Tcl() 7217db96d56Sopenharmony_ci print('patchlevel =', tcl.call('info', 'patchlevel'), flush=True) 7227db96d56Sopenharmony_ci 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ciif __name__ == "__main__": 7257db96d56Sopenharmony_ci unittest.main() 726