##// END OF EJS Templates
fix formatting
jakkdl -
Show More
@@ -1,109 +1,112
1 1 import unittest
2 2 import re
3 3 from IPython.utils.capture import capture_output
4 4 import sys
5 5 import pytest
6 6 from tempfile import TemporaryDirectory
7 7 from IPython.testing import tools as tt
8 8
9
9 10 def _exceptiongroup_common(
10 11 outer_chain: str,
11 12 inner_chain: str,
12 13 native: bool,
13 14 ) -> None:
14 15 pre_raise = "exceptiongroup." if not native else ""
15 16 pre_catch = pre_raise if sys.version_info < (3, 11) else ""
16 17 filestr = f"""
17 18 {"import exceptiongroup" if not native else ""}
18 19 import pytest
19 20
20 21 def f(): raise ValueError("From f()")
21 22 def g(): raise BaseException("From g()")
22 23
23 24 def inner(inner_chain):
24 25 excs = []
25 26 for callback in [f, g]:
26 27 try:
27 28 callback()
28 29 except BaseException as err:
29 30 excs.append(err)
30 31 if excs:
31 32 if inner_chain == "none":
32 33 raise {pre_raise}BaseExceptionGroup("Oops", excs)
33 34 try:
34 35 raise SyntaxError()
35 36 except SyntaxError as e:
36 37 if inner_chain == "from":
37 38 raise {pre_raise}BaseExceptionGroup("Oops", excs) from e
38 39 else:
39 40 raise {pre_raise}BaseExceptionGroup("Oops", excs)
40 41
41 42 def outer(outer_chain, inner_chain):
42 43 try:
43 44 inner(inner_chain)
44 45 except {pre_catch}BaseExceptionGroup as e:
45 46 if outer_chain == "none":
46 47 raise
47 48 if outer_chain == "from":
48 49 raise IndexError() from e
49 50 else:
50 51 raise IndexError
51 52
52 53
53 54 outer("{outer_chain}", "{inner_chain}")
54 55 """
55 56 with capture_output() as cap:
56 57 ip.run_cell(filestr)
57 58
58 59 match_lines = []
59 60 if inner_chain == "another":
60 61 match_lines += [
61 62 "During handling of the above exception, another exception occurred:",
62 63 ]
63 elif inner_chain == 'from':
64 elif inner_chain == "from":
64 65 match_lines += [
65 66 "The above exception was the direct cause of the following exception:",
66 67 ]
67 68
68 69 match_lines += [
69 70 " + Exception Group Traceback (most recent call last):",
70 71 f" | {pre_catch}BaseExceptionGroup: Oops (2 sub-exceptions)",
71 72 " | ValueError: From f()",
72 73 " | BaseException: From g()",
73 74 ]
74 75
75 76 if outer_chain == "another":
76 77 match_lines += [
77 78 "During handling of the above exception, another exception occurred:",
78 79 "IndexError",
79 80 ]
80 81 elif outer_chain == "from":
81 82 match_lines += [
82 83 "The above exception was the direct cause of the following exception:",
83 84 "IndexError",
84 85 ]
85 86
86 87 error_lines = cap.stderr.split("\n")
87 88
88 89 err_index = match_index = 0
89 90 for expected in match_lines:
90 91 for i,actual in enumerate(error_lines):
91 92 if actual == expected:
92 93 error_lines = error_lines[i+1:]
93 94 break
94 95 else:
95 assert False, f'{expected} not found in cap.stderr'
96 assert False, f"{expected} not found in cap.stderr"
97
96 98
97 99 @pytest.mark.skipif(
98 100 sys.version_info < (3, 11), reason="Native ExceptionGroup not implemented"
99 101 )
100 102 @pytest.mark.parametrize("outer_chain", ["none", "from", "another"])
101 103 @pytest.mark.parametrize("inner_chain", ["none", "from", "another"])
102 104 def test_native_exceptiongroup(outer_chain, inner_chain) -> None:
103 105 _exceptiongroup_common(outer_chain, inner_chain, native=True)
104 106
107
105 108 @pytest.mark.parametrize("outer_chain", ["none", "from", "another"])
106 109 @pytest.mark.parametrize("inner_chain", ["none", "from", "another"])
107 110 def test_native_exceptiongroup(outer_chain, inner_chain) -> None:
108 111 pytest.importorskip("exceptiongroup")
109 112 _exceptiongroup_common(outer_chain, inner_chain, native=False)
General Comments 0
You need to be logged in to leave comments. Login now