mirror of
https://github.com/python/cpython.git
synced 2025-10-02 21:25:24 +00:00
[3.12] gh-105071: add PyUnstable_Exc_PrepReraiseStar to expose except* implementation in the unstable API (GH-105072) (#105095)
(cherry picked from commit b7aadb4583
)
This commit is contained in:
parent
7899fac3c5
commit
b45df737d4
7 changed files with 196 additions and 1 deletions
|
@ -5,6 +5,7 @@ import unittest
|
|||
from test import support
|
||||
from test.support import import_helper
|
||||
from test.support.script_helper import assert_python_failure
|
||||
from test.support.testcase import ExceptionIsLikeMixin
|
||||
|
||||
from .test_misc import decode_stderr
|
||||
|
||||
|
@ -189,5 +190,97 @@ class Test_ErrSetAndRestore(unittest.TestCase):
|
|||
'Normalization failed: type=Broken args=<unknown>')
|
||||
|
||||
|
||||
class Test_PyUnstable_Exc_PrepReraiseStar(ExceptionIsLikeMixin, unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
try:
|
||||
raise ExceptionGroup("eg", [TypeError('bad type'), ValueError(42)])
|
||||
except ExceptionGroup as e:
|
||||
self.orig = e
|
||||
|
||||
def test_invalid_args(self):
|
||||
with self.assertRaisesRegex(TypeError, "orig must be an exception"):
|
||||
_testcapi.unstable_exc_prep_reraise_star(42, [None])
|
||||
|
||||
with self.assertRaisesRegex(TypeError, "excs must be a list"):
|
||||
_testcapi.unstable_exc_prep_reraise_star(self.orig, 42)
|
||||
|
||||
with self.assertRaisesRegex(TypeError, "not an exception"):
|
||||
_testcapi.unstable_exc_prep_reraise_star(self.orig, [TypeError(42), 42])
|
||||
|
||||
with self.assertRaisesRegex(ValueError, "orig must be a raised exception"):
|
||||
_testcapi.unstable_exc_prep_reraise_star(ValueError(42), [TypeError(42)])
|
||||
|
||||
with self.assertRaisesRegex(ValueError, "orig must be a raised exception"):
|
||||
_testcapi.unstable_exc_prep_reraise_star(ExceptionGroup("eg", [ValueError(42)]),
|
||||
[TypeError(42)])
|
||||
|
||||
|
||||
def test_nothing_to_reraise(self):
|
||||
self.assertEqual(
|
||||
_testcapi.unstable_exc_prep_reraise_star(self.orig, [None]), None)
|
||||
|
||||
try:
|
||||
raise ValueError(42)
|
||||
except ValueError as e:
|
||||
orig = e
|
||||
self.assertEqual(
|
||||
_testcapi.unstable_exc_prep_reraise_star(orig, [None]), None)
|
||||
|
||||
def test_reraise_orig(self):
|
||||
orig = self.orig
|
||||
res = _testcapi.unstable_exc_prep_reraise_star(orig, [orig])
|
||||
self.assertExceptionIsLike(res, orig)
|
||||
|
||||
def test_raise_orig_parts(self):
|
||||
orig = self.orig
|
||||
match, rest = orig.split(TypeError)
|
||||
|
||||
test_cases = [
|
||||
([match, rest], orig),
|
||||
([rest, match], orig),
|
||||
([match], match),
|
||||
([rest], rest),
|
||||
([], None),
|
||||
]
|
||||
|
||||
for input, expected in test_cases:
|
||||
with self.subTest(input=input):
|
||||
res = _testcapi.unstable_exc_prep_reraise_star(orig, input)
|
||||
self.assertExceptionIsLike(res, expected)
|
||||
|
||||
|
||||
def test_raise_with_new_exceptions(self):
|
||||
orig = self.orig
|
||||
|
||||
match, rest = orig.split(TypeError)
|
||||
new1 = OSError('bad file')
|
||||
new2 = RuntimeError('bad runtime')
|
||||
|
||||
test_cases = [
|
||||
([new1, match, rest], ExceptionGroup("", [new1, orig])),
|
||||
([match, new1, rest], ExceptionGroup("", [new1, orig])),
|
||||
([match, rest, new1], ExceptionGroup("", [new1, orig])),
|
||||
|
||||
([new1, new2, match, rest], ExceptionGroup("", [new1, new2, orig])),
|
||||
([new1, match, new2, rest], ExceptionGroup("", [new1, new2, orig])),
|
||||
([new2, rest, match, new1], ExceptionGroup("", [new2, new1, orig])),
|
||||
([rest, new2, match, new1], ExceptionGroup("", [new2, new1, orig])),
|
||||
|
||||
|
||||
([new1, new2, rest], ExceptionGroup("", [new1, new2, rest])),
|
||||
([new1, match, new2], ExceptionGroup("", [new1, new2, match])),
|
||||
([rest, new2, new1], ExceptionGroup("", [new2, new1, rest])),
|
||||
([new1, new2], ExceptionGroup("", [new1, new2])),
|
||||
([new2, new1], ExceptionGroup("", [new2, new1])),
|
||||
]
|
||||
|
||||
for (input, expected) in test_cases:
|
||||
with self.subTest(input=input):
|
||||
res = _testcapi.unstable_exc_prep_reraise_star(orig, input)
|
||||
self.assertExceptionIsLike(res, expected)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue