summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_tcl.py
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-06-23 15:33:19 (GMT)
committerGitHub <noreply@github.com>2024-06-23 15:33:19 (GMT)
commit99f18ea68934cb59c89c09e946aa1a504bb33065 (patch)
tree97284930b6b0d020b644866034b3ddefa98c30c9 /Lib/test/test_tcl.py
parent97acd295418493b19d78ed1a26d76e2dc8cc63dd (diff)
downloadcpython-99f18ea68934cb59c89c09e946aa1a504bb33065.zip
cpython-99f18ea68934cb59c89c09e946aa1a504bb33065.tar.gz
cpython-99f18ea68934cb59c89c09e946aa1a504bb33065.tar.bz2
[3.13] gh-101830: Fix Tcl_Obj to string conversion (GH-120884) (GH-120905)
Accessing the Tkinter object's string representation no longer converts the underlying Tcl object to a string on Windows. (cherry picked from commit f4ddaa396715855ffbd94590f89ab7d55feeec07) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib/test/test_tcl.py')
-rw-r--r--Lib/test/test_tcl.py52
1 files changed, 51 insertions, 1 deletions
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index e6cf2c7..443787d 100644
--- a/Lib/test/test_tcl.py
+++ b/Lib/test/test_tcl.py
@@ -51,7 +51,7 @@ class TclTest(unittest.TestCase):
def test_eval_surrogates_in_result(self):
tcl = self.interp
- self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>')
+ self.assertEqual(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>')
def testEvalException(self):
tcl = self.interp
@@ -61,6 +61,13 @@ class TclTest(unittest.TestCase):
tcl = self.interp
self.assertRaises(TclError,tcl.eval,'this is wrong')
+ def test_eval_returns_tcl_obj(self):
+ tcl = self.interp.tk
+ tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a')
+ a = tcl.eval('set a')
+ expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab'
+ self.assertEqual(a, expected)
+
def testCall(self):
tcl = self.interp
tcl.call('set','a','1')
@@ -74,6 +81,18 @@ class TclTest(unittest.TestCase):
tcl = self.interp
self.assertRaises(TclError,tcl.call,'this','is','wrong')
+ def test_call_returns_tcl_obj(self):
+ tcl = self.interp.tk
+ tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a')
+ a = tcl.call('set', 'a')
+ expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab'
+ if self.wantobjects:
+ self.assertEqual(str(a), expected)
+ self.assertEqual(a.string, expected)
+ self.assertEqual(a.typename, 'regexp')
+ else:
+ self.assertEqual(a, expected)
+
def testSetVar(self):
tcl = self.interp
tcl.setvar('a','1')
@@ -102,6 +121,18 @@ class TclTest(unittest.TestCase):
tcl = self.interp
self.assertRaises(TclError,tcl.getvar,'a(1)')
+ def test_getvar_returns_tcl_obj(self):
+ tcl = self.interp.tk
+ tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a')
+ a = tcl.getvar('a')
+ expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab'
+ if self.wantobjects:
+ self.assertEqual(str(a), expected)
+ self.assertEqual(a.string, expected)
+ self.assertEqual(a.typename, 'regexp')
+ else:
+ self.assertEqual(a, expected)
+
def testUnsetVar(self):
tcl = self.interp
tcl.setvar('a',1)
@@ -549,6 +580,24 @@ class TclTest(unittest.TestCase):
'1 2 {3 4} {5 6} {}',
(1, (2,), (3, 4), '5 6', ''))
+ def test_passing_tcl_obj(self):
+ tcl = self.interp.tk
+ a = None
+ def testfunc(arg):
+ nonlocal a
+ a = arg
+ self.interp.createcommand('testfunc', testfunc)
+ self.addCleanup(self.interp.tk.deletecommand, 'testfunc')
+ tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a')
+ tcl.eval(r'testfunc $a')
+ expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab'
+ if self.wantobjects >= 2:
+ self.assertEqual(str(a), expected)
+ self.assertEqual(a.string, expected)
+ self.assertEqual(a.typename, 'regexp')
+ else:
+ self.assertEqual(a, expected)
+
def test_splitlist(self):
splitlist = self.interp.tk.splitlist
call = self.interp.tk.call
@@ -673,6 +722,7 @@ class TclTest(unittest.TestCase):
support.check_disallow_instantiation(self, _tkinter.TkttType)
support.check_disallow_instantiation(self, _tkinter.TkappType)
+
class BigmemTclTest(unittest.TestCase):
def setUp(self):