Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f9ba1f3

Browse filesBrowse files
gh-122688: Add more tests for var-positional parameters in Argument Clinic (GH-122900)
1 parent 253c6a0 commit f9ba1f3
Copy full SHA for f9ba1f3

File tree

Expand file treeCollapse file tree

3 files changed

+427
-153
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+427
-153
lines changed

‎Lib/test/test_clinic.py

Copy file name to clipboardExpand all lines: Lib/test/test_clinic.py
+98-65Lines changed: 98 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -3378,26 +3378,44 @@ def test_keyword_only_parameter(self):
33783378
ac_tester.keyword_only_parameter(1)
33793379
self.assertEqual(ac_tester.keyword_only_parameter(a=1), (1,))
33803380

3381-
def test_posonly_vararg(self):
3382-
with self.assertRaises(TypeError):
3383-
ac_tester.posonly_vararg()
3384-
self.assertEqual(ac_tester.posonly_vararg(1, 2), (1, 2, ()))
3385-
self.assertEqual(ac_tester.posonly_vararg(1, b=2), (1, 2, ()))
3386-
self.assertEqual(ac_tester.posonly_vararg(1, 2, 3, 4), (1, 2, (3, 4)))
3387-
with self.assertRaises(TypeError):
3388-
ac_tester.posonly_vararg(b=4)
3389-
with self.assertRaises(TypeError):
3390-
ac_tester.posonly_vararg(1, 2, 3, b=4)
3381+
def test_varpos(self):
3382+
# fn(*args)
3383+
fn = ac_tester.varpos
3384+
self.assertEqual(fn(), ())
3385+
self.assertEqual(fn(1, 2), (1, 2))
3386+
3387+
def test_posonly_varpos(self):
3388+
# fn(a, b, /, *args)
3389+
fn = ac_tester.posonly_varpos
3390+
self.assertRaises(TypeError, fn)
3391+
self.assertRaises(TypeError, fn, 1)
3392+
self.assertRaises(TypeError, fn, 1, b=2)
3393+
self.assertEqual(fn(1, 2), (1, 2, ()))
3394+
self.assertEqual(fn(1, 2, 3, 4), (1, 2, (3, 4)))
33913395

3392-
def test_vararg(self):
3393-
with self.assertRaises(TypeError):
3394-
ac_tester.vararg()
3395-
with self.assertRaises(TypeError):
3396-
ac_tester.vararg(1, b=2)
3397-
self.assertEqual(ac_tester.vararg(1, 2, 3, 4), (1, (2, 3, 4)))
3396+
def test_posonly_poskw_varpos(self):
3397+
# fn(a, /, b, *args)
3398+
fn = ac_tester.posonly_poskw_varpos
3399+
self.assertRaises(TypeError, fn)
3400+
self.assertEqual(fn(1, 2), (1, 2, ()))
3401+
self.assertEqual(fn(1, b=2), (1, 2, ()))
3402+
self.assertEqual(fn(1, 2, 3, 4), (1, 2, (3, 4)))
3403+
self.assertRaises(TypeError, fn, b=4)
3404+
self.assertRaises(TypeError, fn, 1, 2, 3, b=4)
3405+
3406+
def test_poskw_varpos(self):
3407+
# fn(a, *args)
3408+
fn = ac_tester.poskw_varpos
3409+
self.assertRaises(TypeError, fn)
3410+
self.assertRaises(TypeError, fn, 1, b=2)
3411+
self.assertEqual(fn(a=1), (1, ()))
3412+
self.assertRaises(TypeError, fn, 1, a=2)
3413+
self.assertEqual(fn(1), (1, ()))
3414+
self.assertEqual(fn(1, 2, 3, 4), (1, (2, 3, 4)))
33983415

3399-
def test_vararg_with_default(self):
3400-
fn = ac_tester.vararg_with_default
3416+
def test_poskw_varpos_kwonly_opt(self):
3417+
# fn(a, *args, b=False)
3418+
fn = ac_tester.poskw_varpos_kwonly_opt
34013419
self.assertRaises(TypeError, fn)
34023420
self.assertRaises(TypeError, fn, 1, a=2)
34033421
self.assertEqual(fn(1, b=2), (1, (), True))
@@ -3406,35 +3424,38 @@ def test_vararg_with_default(self):
34063424
self.assertEqual(fn(a=1), (1, (), False))
34073425
self.assertEqual(fn(a=1, b=2), (1, (), True))
34083426

3409-
def test_vararg_with_default2(self):
3410-
fn = ac_tester.vararg_with_default2
3427+
def test_poskw_varpos_kwonly_opt2(self):
3428+
# fn(a, *args, b=False, c=False)
3429+
fn = ac_tester.poskw_varpos_kwonly_opt2
34113430
self.assertRaises(TypeError, fn)
34123431
self.assertRaises(TypeError, fn, 1, a=2)
3413-
self.assertEqual(fn(1, b=2), (1, (), 2, None))
3432+
self.assertEqual(fn(1, b=2), (1, (), 2, False))
34143433
self.assertEqual(fn(1, b=2, c=3), (1, (), 2, 3))
3415-
self.assertEqual(fn(1, 2, 3), (1, (2, 3), None, None))
3416-
self.assertEqual(fn(1, 2, 3, b=4), (1, (2, 3), 4, None))
3434+
self.assertEqual(fn(1, 2, 3), (1, (2, 3), False, False))
3435+
self.assertEqual(fn(1, 2, 3, b=4), (1, (2, 3), 4, False))
34173436
self.assertEqual(fn(1, 2, 3, b=4, c=5), (1, (2, 3), 4, 5))
3418-
self.assertEqual(fn(a=1), (1, (), None, None))
3419-
self.assertEqual(fn(a=1, b=2), (1, (), 2, None))
3437+
self.assertEqual(fn(a=1), (1, (), False, False))
3438+
self.assertEqual(fn(a=1, b=2), (1, (), 2, False))
34203439
self.assertEqual(fn(a=1, b=2, c=3), (1, (), 2, 3))
34213440

3422-
def test_vararg_with_only_defaults(self):
3423-
self.assertEqual(ac_tester.vararg_with_only_defaults(), ((), None))
3424-
self.assertEqual(ac_tester.vararg_with_only_defaults(b=2), ((), 2))
3425-
self.assertEqual(ac_tester.vararg_with_only_defaults(1, b=2), ((1, ), 2))
3426-
self.assertEqual(ac_tester.vararg_with_only_defaults(1, 2, 3, 4), ((1, 2, 3, 4), None))
3427-
self.assertEqual(ac_tester.vararg_with_only_defaults(1, 2, 3, 4, b=5), ((1, 2, 3, 4), 5))
3428-
3429-
def test_vararg_kwonly_req_opt(self):
3430-
fn = ac_tester.vararg_kwonly_req_opt
3441+
def test_varpos_kwonly_opt(self):
3442+
# fn(*args, b=False)
3443+
fn = ac_tester.varpos_kwonly_opt
3444+
self.assertEqual(fn(), ((), False))
3445+
self.assertEqual(fn(b=2), ((), 2))
3446+
self.assertEqual(fn(1, b=2), ((1, ), 2))
3447+
self.assertEqual(fn(1, 2, 3, 4), ((1, 2, 3, 4), False))
3448+
self.assertEqual(fn(1, 2, 3, 4, b=5), ((1, 2, 3, 4), 5))
3449+
3450+
def test_varpos_kwonly_req_opt(self):
3451+
fn = ac_tester.varpos_kwonly_req_opt
34313452
self.assertRaises(TypeError, fn)
3432-
self.assertEqual(fn(a=1), ((), 1, None, None))
3433-
self.assertEqual(fn(a=1, b=2), ((), 1, 2, None))
3453+
self.assertEqual(fn(a=1), ((), 1, False, False))
3454+
self.assertEqual(fn(a=1, b=2), ((), 1, 2, False))
34343455
self.assertEqual(fn(a=1, b=2, c=3), ((), 1, 2, 3))
34353456
self.assertRaises(TypeError, fn, 1)
3436-
self.assertEqual(fn(1, a=2), ((1,), 2, None, None))
3437-
self.assertEqual(fn(1, a=2, b=3), ((1,), 2, 3, None))
3457+
self.assertEqual(fn(1, a=2), ((1,), 2, False, False))
3458+
self.assertEqual(fn(1, a=2, b=3), ((1,), 2, 3, False))
34383459
self.assertEqual(fn(1, a=2, b=3, c=4), ((1,), 2, 3, 4))
34393460

34403461
def test_gh_32092_oob(self):
@@ -3459,35 +3480,19 @@ def test_gh_99240_double_free(self):
34593480
ac_tester.gh_99240_double_free('a', '\0b')
34603481

34613482
def test_null_or_tuple_for_varargs(self):
3483+
# fn(name, *constraints, covariant=False)
3484+
fn = ac_tester.null_or_tuple_for_varargs
34623485
# All of these should not crash:
3463-
valid_args_for_test = [
3464-
(('a',), {},
3465-
('a', (), False)),
3466-
(('a', 1, 2, 3), {'covariant': True},
3467-
('a', (1, 2, 3), True)),
3468-
((), {'name': 'a'},
3469-
('a', (), False)),
3470-
((), {'name': 'a', 'covariant': True},
3471-
('a', (), True)),
3472-
((), {'covariant': True, 'name': 'a'},
3473-
('a', (), True)),
3474-
]
3475-
for args, kwargs, expected in valid_args_for_test:
3476-
with self.subTest(args=args, kwargs=kwargs):
3477-
self.assertEqual(
3478-
ac_tester.null_or_tuple_for_varargs(*args, **kwargs),
3479-
expected,
3480-
)
3486+
self.assertEqual(fn('a'), ('a', (), False))
3487+
self.assertEqual(fn('a', 1, 2, 3, covariant=True), ('a', (1, 2, 3), True))
3488+
self.assertEqual(fn(name='a'), ('a', (), False))
3489+
self.assertEqual(fn(name='a', covariant=True), ('a', (), True))
3490+
self.assertEqual(fn(covariant=True, name='a'), ('a', (), True))
34813491

3482-
def test_null_or_tuple_for_varargs_error(self):
3483-
with self.assertRaises(TypeError):
3484-
ac_tester.null_or_tuple_for_varargs(covariant=True)
3485-
with self.assertRaises(TypeError):
3486-
ac_tester.null_or_tuple_for_varargs(1, name='a')
3487-
with self.assertRaises(TypeError):
3488-
ac_tester.null_or_tuple_for_varargs(1, 2, 3, name='a', covariant=True)
3489-
with self.assertRaises(TypeError):
3490-
ac_tester.null_or_tuple_for_varargs(1, 2, 3, covariant=True, name='a')
3492+
self.assertRaises(TypeError, fn, covariant=True)
3493+
self.assertRaises(TypeError, fn, 1, name='a')
3494+
self.assertRaises(TypeError, fn, 1, 2, 3, name='a', covariant=True)
3495+
self.assertRaises(TypeError, fn, 1, 2, 3, covariant=True, name='a')
34913496

34923497
def test_cloned_func_exception_message(self):
34933498
incorrect_arg = -1 # f1() and f2() accept a single str
@@ -3546,6 +3551,34 @@ def test_get_defining_class_arg(self):
35463551
with self.assertRaises(TypeError):
35473552
obj.get_defining_class_arg("arg1", "arg2")
35483553

3554+
def test_defclass_varpos(self):
3555+
# fn(*args)
3556+
cls = ac_tester.TestClass
3557+
obj = cls()
3558+
fn = obj.defclass_varpos
3559+
self.assertEqual(fn(), (cls, ()))
3560+
self.assertEqual(fn(1, 2), (cls, (1, 2)))
3561+
fn = cls.defclass_varpos
3562+
self.assertRaises(TypeError, fn)
3563+
self.assertEqual(fn(obj), (cls, ()))
3564+
self.assertEqual(fn(obj, 1, 2), (cls, (1, 2)))
3565+
3566+
def test_defclass_posonly_varpos(self):
3567+
# fn(a, b, /, *args)
3568+
cls = ac_tester.TestClass
3569+
obj = cls()
3570+
fn = obj.defclass_posonly_varpos
3571+
self.assertRaises(TypeError, fn)
3572+
self.assertRaises(TypeError, fn, 1)
3573+
self.assertEqual(fn(1, 2), (cls, 1, 2, ()))
3574+
self.assertEqual(fn(1, 2, 3, 4), (cls, 1, 2, (3, 4)))
3575+
fn = cls.defclass_posonly_varpos
3576+
self.assertRaises(TypeError, fn)
3577+
self.assertRaises(TypeError, fn, obj)
3578+
self.assertRaises(TypeError, fn, obj, 1)
3579+
self.assertEqual(fn(obj, 1, 2), (cls, 1, 2, ()))
3580+
self.assertEqual(fn(obj, 1, 2, 3, 4), (cls, 1, 2, (3, 4)))
3581+
35493582
def test_depr_star_new(self):
35503583
cls = ac_tester.DeprStarNew
35513584
cls()

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.