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