Skip to content

Commit f9ba1f3

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

File tree

3 files changed

+427
-153
lines changed

3 files changed

+427
-153
lines changed

Lib/test/test_clinic.py

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