Commit 50ae3f68 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #18101: Tcl.split() now process strings nested in a tuple as it

do with byte strings.

Added tests for Tcl.split() and Tcl.splitline().
parents e3ed4edb 275d5fdb
...@@ -175,6 +175,66 @@ class TclTest(unittest.TestCase): ...@@ -175,6 +175,66 @@ class TclTest(unittest.TestCase):
self.assertEqual(passValue(f), f) self.assertEqual(passValue(f), f)
self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,))) self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)))
def test_splitlist(self):
splitlist = self.interp.tk.splitlist
call = self.interp.tk.call
self.assertRaises(TypeError, splitlist)
self.assertRaises(TypeError, splitlist, 'a', 'b')
self.assertRaises(TypeError, splitlist, 2)
testcases = [
('2', ('2',)),
('', ()),
('{}', ('',)),
('""', ('',)),
('a\n b\t\r c\n ', ('a', 'b', 'c')),
(b'a\n b\t\r c\n ', ('a', 'b', 'c')),
('a \u20ac', ('a', '\u20ac')),
(b'a \xe2\x82\xac', ('a', '\u20ac')),
('a {b c}', ('a', 'b c')),
(r'a b\ c', ('a', 'b c')),
(('a', 'b c'), ('a', 'b c')),
('a 2', ('a', '2')),
(('a', 2), ('a', 2)),
('a 3.4', ('a', '3.4')),
(('a', 3.4), ('a', 3.4)),
((), ()),
(call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
]
for arg, res in testcases:
self.assertEqual(splitlist(arg), res, msg=arg)
self.assertRaises(TclError, splitlist, '{')
def test_split(self):
split = self.interp.tk.split
call = self.interp.tk.call
self.assertRaises(TypeError, split)
self.assertRaises(TypeError, split, 'a', 'b')
self.assertRaises(TypeError, split, 2)
testcases = [
('2', '2'),
('', ''),
('{}', ''),
('""', ''),
('{', '{'),
('a\n b\t\r c\n ', ('a', 'b', 'c')),
(b'a\n b\t\r c\n ', ('a', 'b', 'c')),
('a \u20ac', ('a', '\u20ac')),
(b'a \xe2\x82\xac', ('a', '\u20ac')),
('a {b c}', ('a', ('b', 'c'))),
(r'a b\ c', ('a', ('b', 'c'))),
(('a', b'b c'), ('a', ('b', 'c'))),
(('a', 'b c'), ('a', ('b', 'c'))),
('a 2', ('a', '2')),
(('a', 2), ('a', 2)),
('a 3.4', ('a', '3.4')),
(('a', 3.4), ('a', 3.4)),
(('a', (2, 3.4)), ('a', (2, 3.4))),
((), ()),
(call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
]
for arg, res in testcases:
self.assertEqual(split(arg), res, msg=arg)
def test_main(): def test_main():
support.run_unittest(TclTest, TkinterTest) support.run_unittest(TclTest, TkinterTest)
......
...@@ -148,6 +148,9 @@ Core and Builtins ...@@ -148,6 +148,9 @@ Core and Builtins
Library Library
------- -------
- Issue #18101: Tcl.split() now process strings nested in a tuple as it
do with byte strings.
- Issue #18116: getpass was always getting an error when testing /dev/tty, - Issue #18116: getpass was always getting an error when testing /dev/tty,
and thus was always falling back to stdin. It also leaked an open file and thus was always falling back to stdin. It also leaked an open file
when it did so. Both of these issues are now fixed. when it did so. Both of these issues are now fixed.
......
...@@ -423,6 +423,21 @@ SplitObj(PyObject *arg) ...@@ -423,6 +423,21 @@ SplitObj(PyObject *arg)
return result; return result;
/* Fall through, returning arg. */ /* Fall through, returning arg. */
} }
else if (PyUnicode_Check(arg)) {
int argc;
char **argv;
char *list = PyUnicode_AsUTF8(arg);
if (list == NULL ||
Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) {
Py_INCREF(arg);
return arg;
}
Tcl_Free(FREECAST argv);
if (argc > 1)
return Split(list);
/* Fall through, returning arg. */
}
else if (PyBytes_Check(arg)) { else if (PyBytes_Check(arg)) {
int argc; int argc;
char **argv; char **argv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment