mirror of https://github.com/python/cpython
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:
commit
50ae3f680b
|
@ -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
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue