summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-10-13 13:41:43 (GMT)
committerGitHub <noreply@github.com>2023-10-13 13:41:43 (GMT)
commit1c44f881c73f1eabe70704dd5acc6ad98d9156bd (patch)
treedc9517bca287414a1cc05a13b1c0698292a37b73 /Lib/test
parent1a7afa7ef41a79a923b93f9a58da7a4e3d359d4f (diff)
downloadcpython-1c44f881c73f1eabe70704dd5acc6ad98d9156bd.zip
cpython-1c44f881c73f1eabe70704dd5acc6ad98d9156bd.tar.gz
cpython-1c44f881c73f1eabe70704dd5acc6ad98d9156bd.tar.bz2
[3.12] gh-110815: Improve tests for PyArg_ParseTupleAndKeywords() (GH-110817) (GH-110825)
(cherry picked from commit 548ce0923b9ef93b1c1df59f8febc4bb3daff28a) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_capi/test_getargs.py36
1 files changed, 31 insertions, 5 deletions
diff --git a/Lib/test/test_capi/test_getargs.py b/Lib/test/test_capi/test_getargs.py
index ec4100e..2546c6e 100644
--- a/Lib/test/test_capi/test_getargs.py
+++ b/Lib/test/test_capi/test_getargs.py
@@ -55,6 +55,8 @@ LLONG_MAX = 2**63-1
LLONG_MIN = -2**63
ULLONG_MAX = 2**64-1
+NULL = None
+
class Index:
def __index__(self):
return 99
@@ -1241,6 +1243,27 @@ class ParseTupleAndKeywords_Test(unittest.TestCase):
self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
(), {}, '', [42])
+ def test_basic(self):
+ parse = _testcapi.parse_tuple_and_keywords
+
+ self.assertEqual(parse((), {'a': 1}, 'O', ['a']), (1,))
+ self.assertEqual(parse((), {}, '|O', ['a']), (NULL,))
+ self.assertEqual(parse((1, 2), {}, 'OO', ['a', 'b']), (1, 2))
+ self.assertEqual(parse((1,), {'b': 2}, 'OO', ['a', 'b']), (1, 2))
+ self.assertEqual(parse((), {'a': 1, 'b': 2}, 'OO', ['a', 'b']), (1, 2))
+ self.assertEqual(parse((), {'b': 2}, '|OO', ['a', 'b']), (NULL, 2))
+
+ with self.assertRaisesRegex(TypeError,
+ "function missing required argument 'a'"):
+ parse((), {}, 'O', ['a'])
+ with self.assertRaisesRegex(TypeError,
+ "'b' is an invalid keyword argument"):
+ parse((), {'b': 1}, '|O', ['a'])
+ with self.assertRaisesRegex(TypeError,
+ fr"argument for function given by name \('a'\) "
+ fr"and position \(1\)"):
+ parse((1,), {'a': 2}, 'O|O', ['a', 'b'])
+
def test_bad_use(self):
# Test handling invalid format and keywords in
# PyArg_ParseTupleAndKeywords()
@@ -1268,20 +1291,23 @@ class ParseTupleAndKeywords_Test(unittest.TestCase):
def test_positional_only(self):
parse = _testcapi.parse_tuple_and_keywords
- parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
- parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
+ self.assertEqual(parse((1, 2, 3), {}, 'OOO', ['', '', 'a']), (1, 2, 3))
+ self.assertEqual(parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a']), (1, 2, 3))
with self.assertRaisesRegex(TypeError,
r'function takes at least 2 positional arguments \(1 given\)'):
parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
- parse((1,), {}, 'O|OO', ['', '', 'a'])
+ self.assertEqual(parse((1,), {}, 'O|OO', ['', '', 'a']),
+ (1, NULL, NULL))
with self.assertRaisesRegex(TypeError,
r'function takes at least 1 positional argument \(0 given\)'):
parse((), {}, 'O|OO', ['', '', 'a'])
- parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
+ self.assertEqual(parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a']),
+ (1, 2, 3))
with self.assertRaisesRegex(TypeError,
r'function takes exactly 2 positional arguments \(1 given\)'):
parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
- parse((1,), {}, 'O|O$O', ['', '', 'a'])
+ self.assertEqual(parse((1,), {}, 'O|O$O', ['', '', 'a']),
+ (1, NULL, NULL))
with self.assertRaisesRegex(TypeError,
r'function takes at least 1 positional argument \(0 given\)'):
parse((), {}, 'O|O$O', ['', '', 'a'])