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().
This commit is contained in:
Serhiy Storchaka 2013-07-11 20:36:00 +03:00
commit 50ae3f680b
3 changed files with 78 additions and 0 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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;