|
63 | 63 |
|
64 | 64 | NULL = None
|
65 | 65 |
|
| 66 | +class CustomError(Exception): |
| 67 | + pass |
| 68 | + |
66 | 69 | class Index:
|
67 | 70 | def __index__(self):
|
68 | 71 | return 99
|
@@ -586,13 +589,13 @@ def test_tuple(self):
|
586 | 589 | ret = getargs_tuple(1, (2, 3))
|
587 | 590 | self.assertEqual(ret, (1,2,3))
|
588 | 591 |
|
589 |
| - # make sure invalid tuple arguments are handled correctly |
590 |
| - class seq: |
| 592 | + # make sure invalid sequence arguments are handled correctly |
| 593 | + class TestSeq: |
591 | 594 | def __len__(self):
|
592 | 595 | return 2
|
593 | 596 | def __getitem__(self, n):
|
594 |
| - raise ValueError |
595 |
| - self.assertRaises(TypeError, getargs_tuple, 1, seq()) |
| 597 | + raise CustomError |
| 598 | + self.assertRaises(CustomError, getargs_tuple, 1, TestSeq()) |
596 | 599 |
|
597 | 600 | class Keywords_TestCase(unittest.TestCase):
|
598 | 601 | def test_kwargs(self):
|
@@ -1320,33 +1323,69 @@ def test_nonascii_keywords(self):
|
1320 | 1323 | f"this function got an unexpected keyword argument '{name2}'"):
|
1321 | 1324 | parse((), {name2: 1, name3: 2}, '|OO', [name, name3])
|
1322 | 1325 |
|
1323 |
| - def test_nested_tuple(self): |
| 1326 | + def test_nested_sequence(self): |
1324 | 1327 | parse = _testcapi.parse_tuple_and_keywords
|
1325 | 1328 |
|
1326 | 1329 | self.assertEqual(parse(((1, 2, 3),), {}, '(OOO)', ['a']), (1, 2, 3))
|
1327 | 1330 | self.assertEqual(parse((1, (2, 3), 4), {}, 'O(OO)O', ['a', 'b', 'c']),
|
1328 | 1331 | (1, 2, 3, 4))
|
1329 | 1332 | parse(((1, 2, 3),), {}, '(iii)', ['a'])
|
| 1333 | + parse(([1, 2, 3],), {}, '(iii)', ['a']) |
1330 | 1334 |
|
1331 | 1335 | with self.assertRaisesRegex(TypeError,
|
1332 |
| - "argument 1 must be sequence of length 2, not 3"): |
| 1336 | + "argument 1 must be tuple of length 2, not 3"): |
1333 | 1337 | parse(((1, 2, 3),), {}, '(ii)', ['a'])
|
1334 | 1338 | with self.assertRaisesRegex(TypeError,
|
1335 |
| - "argument 1 must be sequence of length 2, not 1"): |
| 1339 | + "argument 1 must be tuple of length 2, not 1"): |
1336 | 1340 | parse(((1,),), {}, '(ii)', ['a'])
|
1337 | 1341 | with self.assertRaisesRegex(TypeError,
|
1338 |
| - "argument 1 must be 2-item sequence, not int"): |
| 1342 | + "argument 1 must be sequence of length 2, not 3"): |
| 1343 | + parse(([1, 2, 3],), {}, '(ii)', ['a']) |
| 1344 | + with self.assertRaisesRegex(TypeError, |
| 1345 | + "argument 1 must be sequence of length 2, not 1"): |
| 1346 | + parse(([1,],), {}, '(ii)', ['a']) |
| 1347 | + with self.assertRaisesRegex(TypeError, |
| 1348 | + "argument 1 must be 2-item tuple, not int"): |
1339 | 1349 | parse((1,), {}, '(ii)', ['a'])
|
1340 | 1350 | with self.assertRaisesRegex(TypeError,
|
1341 |
| - "argument 1 must be 2-item sequence, not bytes"): |
| 1351 | + "argument 1 must be 2-item tuple, not None$"): |
| 1352 | + parse((None,), {}, '(ii)', ['a']) |
| 1353 | + with self.assertRaisesRegex(TypeError, |
| 1354 | + "argument 1 must be 2-item tuple, not str"): |
| 1355 | + parse(('ab',), {}, '(CC)', ['a']) |
| 1356 | + with self.assertRaisesRegex(TypeError, |
| 1357 | + "argument 1 must be 2-item tuple, not bytes"): |
1342 | 1358 | parse((b'ab',), {}, '(ii)', ['a'])
|
| 1359 | + with self.assertRaisesRegex(TypeError, |
| 1360 | + "argument 1 must be 2-item tuple, not bytearray"): |
| 1361 | + parse((bytearray(b'ab'),), {}, '(ii)', ['a']) |
| 1362 | + with self.assertRaisesRegex(TypeError, |
| 1363 | + "argument 1 must be 2-item tuple, not dict"): |
| 1364 | + parse(({},), {}, '(ii)', ['a']) |
| 1365 | + |
| 1366 | + with self.assertWarnsRegex(DeprecationWarning, |
| 1367 | + "argument must be 3-item tuple, not list"): |
| 1368 | + self.assertEqual(parse(([1, 2, 3],), {}, '(OOO)', ['a']), (1, 2, 3)) |
| 1369 | + with self.assertWarnsRegex(DeprecationWarning, |
| 1370 | + "argument must be 2-item tuple, not list"): |
| 1371 | + with self.assertRaisesRegex(TypeError, |
| 1372 | + "argument 1 must be tuple of length 2, not 3"): |
| 1373 | + parse(([1, 2, 3],), {}, '(OO)', ['a']) |
| 1374 | + with self.assertWarnsRegex(DeprecationWarning, |
| 1375 | + "argument must be 2-item tuple, not list"): |
| 1376 | + with self.assertRaisesRegex(TypeError, |
| 1377 | + "argument 1 must be tuple of length 2, not 1"): |
| 1378 | + parse(([1,],), {}, '(OO)', ['a']) |
1343 | 1379 |
|
1344 | 1380 | for f in 'es', 'et', 'es#', 'et#':
|
1345 | 1381 | with self.assertRaises(LookupError): # empty encoding ""
|
1346 | 1382 | parse((('a',),), {}, '(' + f + ')', ['a'])
|
1347 | 1383 | with self.assertRaisesRegex(TypeError,
|
1348 |
| - "argument 1 must be sequence of length 1, not 0"): |
| 1384 | + "argument 1 must be tuple of length 1, not 0"): |
1349 | 1385 | parse(((),), {}, '(' + f + ')', ['a'])
|
| 1386 | + with self.assertRaisesRegex(TypeError, |
| 1387 | + "argument 1 must be sequence of length 1, not 0"): |
| 1388 | + parse(([],), {}, '(' + f + ')', ['a']) |
1350 | 1389 |
|
1351 | 1390 | @unittest.skipIf(_testinternalcapi is None, 'needs _testinternalcapi')
|
1352 | 1391 | def test_gh_119213(self):
|
|
0 commit comments