17db96d56Sopenharmony_ciimport sys
27db96d56Sopenharmony_ciimport unittest
37db96d56Sopenharmony_ciimport textwrap
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciclass TestInvalidExceptStar(unittest.TestCase):
67db96d56Sopenharmony_ci    def test_mixed_except_and_except_star_is_syntax_error(self):
77db96d56Sopenharmony_ci        errors = [
87db96d56Sopenharmony_ci            "try: pass\nexcept ValueError: pass\nexcept* TypeError: pass\n",
97db96d56Sopenharmony_ci            "try: pass\nexcept* ValueError: pass\nexcept TypeError: pass\n",
107db96d56Sopenharmony_ci            "try: pass\nexcept ValueError as e: pass\nexcept* TypeError: pass\n",
117db96d56Sopenharmony_ci            "try: pass\nexcept* ValueError as e: pass\nexcept TypeError: pass\n",
127db96d56Sopenharmony_ci            "try: pass\nexcept ValueError: pass\nexcept* TypeError as e: pass\n",
137db96d56Sopenharmony_ci            "try: pass\nexcept* ValueError: pass\nexcept TypeError as e: pass\n",
147db96d56Sopenharmony_ci            "try: pass\nexcept ValueError: pass\nexcept*: pass\n",
157db96d56Sopenharmony_ci            "try: pass\nexcept* ValueError: pass\nexcept: pass\n",
167db96d56Sopenharmony_ci        ]
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci        for err in errors:
197db96d56Sopenharmony_ci            with self.assertRaises(SyntaxError):
207db96d56Sopenharmony_ci                compile(err, "<string>", "exec")
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    def test_except_star_ExceptionGroup_is_runtime_error_single(self):
237db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
247db96d56Sopenharmony_ci            try:
257db96d56Sopenharmony_ci                raise OSError("blah")
267db96d56Sopenharmony_ci            except* ExceptionGroup as e:
277db96d56Sopenharmony_ci                pass
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    def test_except_star_ExceptionGroup_is_runtime_error_tuple(self):
307db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
317db96d56Sopenharmony_ci            try:
327db96d56Sopenharmony_ci                raise ExceptionGroup("eg", [ValueError(42)])
337db96d56Sopenharmony_ci            except* (TypeError, ExceptionGroup):
347db96d56Sopenharmony_ci                pass
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci    def test_except_star_invalid_exception_type(self):
377db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
387db96d56Sopenharmony_ci            try:
397db96d56Sopenharmony_ci                raise ValueError
407db96d56Sopenharmony_ci            except* 42:
417db96d56Sopenharmony_ci                pass
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
447db96d56Sopenharmony_ci            try:
457db96d56Sopenharmony_ci                raise ValueError
467db96d56Sopenharmony_ci            except* (ValueError, 42):
477db96d56Sopenharmony_ci                pass
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ciclass TestBreakContinueReturnInExceptStarBlock(unittest.TestCase):
517db96d56Sopenharmony_ci    MSG = (r"'break', 'continue' and 'return'"
527db96d56Sopenharmony_ci           r" cannot appear in an except\* block")
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    def check_invalid(self, src):
557db96d56Sopenharmony_ci        with self.assertRaisesRegex(SyntaxError, self.MSG):
567db96d56Sopenharmony_ci            compile(textwrap.dedent(src), "<string>", "exec")
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def test_break_in_except_star(self):
597db96d56Sopenharmony_ci        self.check_invalid(
607db96d56Sopenharmony_ci            """
617db96d56Sopenharmony_ci            try:
627db96d56Sopenharmony_ci                raise ValueError
637db96d56Sopenharmony_ci            except* Exception as e:
647db96d56Sopenharmony_ci                break
657db96d56Sopenharmony_ci            """)
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci        self.check_invalid(
687db96d56Sopenharmony_ci            """
697db96d56Sopenharmony_ci            for i in range(5):
707db96d56Sopenharmony_ci                try:
717db96d56Sopenharmony_ci                    pass
727db96d56Sopenharmony_ci                except* Exception as e:
737db96d56Sopenharmony_ci                    if i == 2:
747db96d56Sopenharmony_ci                        break
757db96d56Sopenharmony_ci            """)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci        self.check_invalid(
787db96d56Sopenharmony_ci            """
797db96d56Sopenharmony_ci            for i in range(5):
807db96d56Sopenharmony_ci                try:
817db96d56Sopenharmony_ci                    pass
827db96d56Sopenharmony_ci                except* Exception as e:
837db96d56Sopenharmony_ci                    if i == 2:
847db96d56Sopenharmony_ci                        break
857db96d56Sopenharmony_ci                finally:
867db96d56Sopenharmony_ci                    return 0
877db96d56Sopenharmony_ci            """)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    def test_continue_in_except_star_block_invalid(self):
917db96d56Sopenharmony_ci        self.check_invalid(
927db96d56Sopenharmony_ci            """
937db96d56Sopenharmony_ci            for i in range(5):
947db96d56Sopenharmony_ci                try:
957db96d56Sopenharmony_ci                    raise ValueError
967db96d56Sopenharmony_ci                except* Exception as e:
977db96d56Sopenharmony_ci                    continue
987db96d56Sopenharmony_ci            """)
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci        self.check_invalid(
1017db96d56Sopenharmony_ci            """
1027db96d56Sopenharmony_ci            for i in range(5):
1037db96d56Sopenharmony_ci                try:
1047db96d56Sopenharmony_ci                    pass
1057db96d56Sopenharmony_ci                except* Exception as e:
1067db96d56Sopenharmony_ci                    if i == 2:
1077db96d56Sopenharmony_ci                        continue
1087db96d56Sopenharmony_ci            """)
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        self.check_invalid(
1117db96d56Sopenharmony_ci            """
1127db96d56Sopenharmony_ci            for i in range(5):
1137db96d56Sopenharmony_ci                try:
1147db96d56Sopenharmony_ci                    pass
1157db96d56Sopenharmony_ci                except* Exception as e:
1167db96d56Sopenharmony_ci                    if i == 2:
1177db96d56Sopenharmony_ci                        continue
1187db96d56Sopenharmony_ci                finally:
1197db96d56Sopenharmony_ci                    return 0
1207db96d56Sopenharmony_ci            """)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    def test_return_in_except_star_block_invalid(self):
1237db96d56Sopenharmony_ci        self.check_invalid(
1247db96d56Sopenharmony_ci            """
1257db96d56Sopenharmony_ci            def f():
1267db96d56Sopenharmony_ci                try:
1277db96d56Sopenharmony_ci                    raise ValueError
1287db96d56Sopenharmony_ci                except* Exception as e:
1297db96d56Sopenharmony_ci                    return 42
1307db96d56Sopenharmony_ci            """)
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci        self.check_invalid(
1337db96d56Sopenharmony_ci            """
1347db96d56Sopenharmony_ci            def f():
1357db96d56Sopenharmony_ci                try:
1367db96d56Sopenharmony_ci                    pass
1377db96d56Sopenharmony_ci                except* Exception as e:
1387db96d56Sopenharmony_ci                    return 42
1397db96d56Sopenharmony_ci                finally:
1407db96d56Sopenharmony_ci                    finished = True
1417db96d56Sopenharmony_ci            """)
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci    def test_break_continue_in_except_star_block_valid(self):
1447db96d56Sopenharmony_ci        try:
1457db96d56Sopenharmony_ci            raise ValueError(42)
1467db96d56Sopenharmony_ci        except* Exception as e:
1477db96d56Sopenharmony_ci            count = 0
1487db96d56Sopenharmony_ci            for i in range(5):
1497db96d56Sopenharmony_ci                if i == 0:
1507db96d56Sopenharmony_ci                    continue
1517db96d56Sopenharmony_ci                if i == 4:
1527db96d56Sopenharmony_ci                    break
1537db96d56Sopenharmony_ci                count += 1
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci            self.assertEqual(count, 3)
1567db96d56Sopenharmony_ci            self.assertEqual(i, 4)
1577db96d56Sopenharmony_ci            exc = e
1587db96d56Sopenharmony_ci        self.assertIsInstance(exc, ExceptionGroup)
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci    def test_return_in_except_star_block_valid(self):
1617db96d56Sopenharmony_ci        try:
1627db96d56Sopenharmony_ci            raise ValueError(42)
1637db96d56Sopenharmony_ci        except* Exception as e:
1647db96d56Sopenharmony_ci            def f(x):
1657db96d56Sopenharmony_ci                return 2*x
1667db96d56Sopenharmony_ci            r = f(3)
1677db96d56Sopenharmony_ci            exc = e
1687db96d56Sopenharmony_ci        self.assertEqual(r, 6)
1697db96d56Sopenharmony_ci        self.assertIsInstance(exc, ExceptionGroup)
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ciclass ExceptStarTest(unittest.TestCase):
1737db96d56Sopenharmony_ci    def assertExceptionIsLike(self, exc, template):
1747db96d56Sopenharmony_ci        if exc is None and template is None:
1757db96d56Sopenharmony_ci            return
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci        if template is None:
1787db96d56Sopenharmony_ci            self.fail(f"unexpected exception: {exc}")
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci        if exc is None:
1817db96d56Sopenharmony_ci            self.fail(f"expected an exception like {template!r}, got None")
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci        if not isinstance(exc, ExceptionGroup):
1847db96d56Sopenharmony_ci            self.assertEqual(exc.__class__, template.__class__)
1857db96d56Sopenharmony_ci            self.assertEqual(exc.args[0], template.args[0])
1867db96d56Sopenharmony_ci        else:
1877db96d56Sopenharmony_ci            self.assertEqual(exc.message, template.message)
1887db96d56Sopenharmony_ci            self.assertEqual(len(exc.exceptions), len(template.exceptions))
1897db96d56Sopenharmony_ci            for e, t in zip(exc.exceptions, template.exceptions):
1907db96d56Sopenharmony_ci                self.assertExceptionIsLike(e, t)
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    def assertMetadataEqual(self, e1, e2):
1937db96d56Sopenharmony_ci        if e1 is None or e2 is None:
1947db96d56Sopenharmony_ci            self.assertTrue(e1 is None and e2 is None)
1957db96d56Sopenharmony_ci        else:
1967db96d56Sopenharmony_ci            self.assertEqual(e1.__context__, e2.__context__)
1977db96d56Sopenharmony_ci            self.assertEqual(e1.__cause__, e2.__cause__)
1987db96d56Sopenharmony_ci            self.assertEqual(e1.__traceback__, e2.__traceback__)
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci    def assertMetadataNotEqual(self, e1, e2):
2017db96d56Sopenharmony_ci        if e1 is None or e2 is None:
2027db96d56Sopenharmony_ci            self.assertNotEqual(e1, e2)
2037db96d56Sopenharmony_ci        else:
2047db96d56Sopenharmony_ci            return not (e1.__context__ == e2.__context__
2057db96d56Sopenharmony_ci                        and e1.__cause__ == e2.__cause__
2067db96d56Sopenharmony_ci                        and e1.__traceback__ == e2.__traceback__)
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ciclass TestExceptStarSplitSemantics(ExceptStarTest):
2107db96d56Sopenharmony_ci    def doSplitTestNamed(self, exc, T, match_template, rest_template):
2117db96d56Sopenharmony_ci        initial_sys_exception = sys.exception()
2127db96d56Sopenharmony_ci        sys_exception = match = rest = None
2137db96d56Sopenharmony_ci        try:
2147db96d56Sopenharmony_ci            try:
2157db96d56Sopenharmony_ci                raise exc
2167db96d56Sopenharmony_ci            except* T as e:
2177db96d56Sopenharmony_ci                sys_exception = sys.exception()
2187db96d56Sopenharmony_ci                match = e
2197db96d56Sopenharmony_ci        except BaseException as e:
2207db96d56Sopenharmony_ci            rest = e
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci        self.assertEqual(sys_exception, match)
2237db96d56Sopenharmony_ci        self.assertExceptionIsLike(match, match_template)
2247db96d56Sopenharmony_ci        self.assertExceptionIsLike(rest, rest_template)
2257db96d56Sopenharmony_ci        self.assertEqual(sys.exception(), initial_sys_exception)
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci    def doSplitTestUnnamed(self, exc, T, match_template, rest_template):
2287db96d56Sopenharmony_ci        initial_sys_exception = sys.exception()
2297db96d56Sopenharmony_ci        sys_exception = match = rest = None
2307db96d56Sopenharmony_ci        try:
2317db96d56Sopenharmony_ci            try:
2327db96d56Sopenharmony_ci                raise exc
2337db96d56Sopenharmony_ci            except* T:
2347db96d56Sopenharmony_ci                sys_exception = match = sys.exception()
2357db96d56Sopenharmony_ci            else:
2367db96d56Sopenharmony_ci                if rest_template:
2377db96d56Sopenharmony_ci                    self.fail("Exception not raised")
2387db96d56Sopenharmony_ci        except BaseException as e:
2397db96d56Sopenharmony_ci            rest = e
2407db96d56Sopenharmony_ci        self.assertExceptionIsLike(match, match_template)
2417db96d56Sopenharmony_ci        self.assertExceptionIsLike(rest, rest_template)
2427db96d56Sopenharmony_ci        self.assertEqual(sys.exception(), initial_sys_exception)
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci    def doSplitTestInExceptHandler(self, exc, T, match_template, rest_template):
2457db96d56Sopenharmony_ci        try:
2467db96d56Sopenharmony_ci            raise ExceptionGroup('eg', [TypeError(1), ValueError(2)])
2477db96d56Sopenharmony_ci        except Exception:
2487db96d56Sopenharmony_ci            self.doSplitTestNamed(exc, T, match_template, rest_template)
2497db96d56Sopenharmony_ci            self.doSplitTestUnnamed(exc, T, match_template, rest_template)
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci    def doSplitTestInExceptStarHandler(self, exc, T, match_template, rest_template):
2527db96d56Sopenharmony_ci        try:
2537db96d56Sopenharmony_ci            raise ExceptionGroup('eg', [TypeError(1), ValueError(2)])
2547db96d56Sopenharmony_ci        except* Exception:
2557db96d56Sopenharmony_ci            self.doSplitTestNamed(exc, T, match_template, rest_template)
2567db96d56Sopenharmony_ci            self.doSplitTestUnnamed(exc, T, match_template, rest_template)
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci    def doSplitTest(self, exc, T, match_template, rest_template):
2597db96d56Sopenharmony_ci        self.doSplitTestNamed(exc, T, match_template, rest_template)
2607db96d56Sopenharmony_ci        self.doSplitTestUnnamed(exc, T, match_template, rest_template)
2617db96d56Sopenharmony_ci        self.doSplitTestInExceptHandler(exc, T, match_template, rest_template)
2627db96d56Sopenharmony_ci        self.doSplitTestInExceptStarHandler(exc, T, match_template, rest_template)
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci    def test_no_match_single_type(self):
2657db96d56Sopenharmony_ci        self.doSplitTest(
2667db96d56Sopenharmony_ci            ExceptionGroup("test1", [ValueError("V"), TypeError("T")]),
2677db96d56Sopenharmony_ci            SyntaxError,
2687db96d56Sopenharmony_ci            None,
2697db96d56Sopenharmony_ci            ExceptionGroup("test1", [ValueError("V"), TypeError("T")]))
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci    def test_match_single_type(self):
2727db96d56Sopenharmony_ci        self.doSplitTest(
2737db96d56Sopenharmony_ci            ExceptionGroup("test2", [ValueError("V1"), ValueError("V2")]),
2747db96d56Sopenharmony_ci            ValueError,
2757db96d56Sopenharmony_ci            ExceptionGroup("test2", [ValueError("V1"), ValueError("V2")]),
2767db96d56Sopenharmony_ci            None)
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci    def test_match_single_type_partial_match(self):
2797db96d56Sopenharmony_ci        self.doSplitTest(
2807db96d56Sopenharmony_ci            ExceptionGroup(
2817db96d56Sopenharmony_ci                "test3",
2827db96d56Sopenharmony_ci                [ValueError("V1"), OSError("OS"), ValueError("V2")]),
2837db96d56Sopenharmony_ci            ValueError,
2847db96d56Sopenharmony_ci            ExceptionGroup("test3", [ValueError("V1"), ValueError("V2")]),
2857db96d56Sopenharmony_ci            ExceptionGroup("test3", [OSError("OS")]))
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci    def test_match_single_type_nested(self):
2887db96d56Sopenharmony_ci        self.doSplitTest(
2897db96d56Sopenharmony_ci            ExceptionGroup(
2907db96d56Sopenharmony_ci                "g1", [
2917db96d56Sopenharmony_ci                ValueError("V1"),
2927db96d56Sopenharmony_ci                OSError("OS1"),
2937db96d56Sopenharmony_ci                ExceptionGroup(
2947db96d56Sopenharmony_ci                    "g2", [
2957db96d56Sopenharmony_ci                    OSError("OS2"),
2967db96d56Sopenharmony_ci                    ValueError("V2"),
2977db96d56Sopenharmony_ci                    TypeError("T")])]),
2987db96d56Sopenharmony_ci            ValueError,
2997db96d56Sopenharmony_ci            ExceptionGroup(
3007db96d56Sopenharmony_ci                "g1", [
3017db96d56Sopenharmony_ci                ValueError("V1"),
3027db96d56Sopenharmony_ci                ExceptionGroup("g2", [ValueError("V2")])]),
3037db96d56Sopenharmony_ci            ExceptionGroup("g1", [
3047db96d56Sopenharmony_ci                OSError("OS1"),
3057db96d56Sopenharmony_ci                ExceptionGroup("g2", [
3067db96d56Sopenharmony_ci                    OSError("OS2"), TypeError("T")])]))
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci    def test_match_type_tuple_nested(self):
3097db96d56Sopenharmony_ci        self.doSplitTest(
3107db96d56Sopenharmony_ci            ExceptionGroup(
3117db96d56Sopenharmony_ci                "h1", [
3127db96d56Sopenharmony_ci                ValueError("V1"),
3137db96d56Sopenharmony_ci                OSError("OS1"),
3147db96d56Sopenharmony_ci                ExceptionGroup(
3157db96d56Sopenharmony_ci                    "h2", [OSError("OS2"), ValueError("V2"), TypeError("T")])]),
3167db96d56Sopenharmony_ci            (ValueError, TypeError),
3177db96d56Sopenharmony_ci            ExceptionGroup(
3187db96d56Sopenharmony_ci                "h1", [
3197db96d56Sopenharmony_ci                ValueError("V1"),
3207db96d56Sopenharmony_ci                ExceptionGroup("h2", [ValueError("V2"), TypeError("T")])]),
3217db96d56Sopenharmony_ci            ExceptionGroup(
3227db96d56Sopenharmony_ci                "h1", [
3237db96d56Sopenharmony_ci                OSError("OS1"),
3247db96d56Sopenharmony_ci                ExceptionGroup("h2", [OSError("OS2")])]))
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci    def test_empty_groups_removed(self):
3277db96d56Sopenharmony_ci        self.doSplitTest(
3287db96d56Sopenharmony_ci            ExceptionGroup(
3297db96d56Sopenharmony_ci                "eg", [
3307db96d56Sopenharmony_ci                ExceptionGroup("i1", [ValueError("V1")]),
3317db96d56Sopenharmony_ci                ExceptionGroup("i2", [ValueError("V2"), TypeError("T1")]),
3327db96d56Sopenharmony_ci                ExceptionGroup("i3", [TypeError("T2")])]),
3337db96d56Sopenharmony_ci            TypeError,
3347db96d56Sopenharmony_ci            ExceptionGroup("eg", [
3357db96d56Sopenharmony_ci                ExceptionGroup("i2", [TypeError("T1")]),
3367db96d56Sopenharmony_ci                ExceptionGroup("i3", [TypeError("T2")])]),
3377db96d56Sopenharmony_ci            ExceptionGroup("eg", [
3387db96d56Sopenharmony_ci                    ExceptionGroup("i1", [ValueError("V1")]),
3397db96d56Sopenharmony_ci                    ExceptionGroup("i2", [ValueError("V2")])]))
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci    def test_singleton_groups_are_kept(self):
3427db96d56Sopenharmony_ci        self.doSplitTest(
3437db96d56Sopenharmony_ci            ExceptionGroup("j1", [
3447db96d56Sopenharmony_ci                ExceptionGroup("j2", [
3457db96d56Sopenharmony_ci                    ExceptionGroup("j3", [ValueError("V1")]),
3467db96d56Sopenharmony_ci                    ExceptionGroup("j4", [TypeError("T")])])]),
3477db96d56Sopenharmony_ci            TypeError,
3487db96d56Sopenharmony_ci            ExceptionGroup(
3497db96d56Sopenharmony_ci                "j1",
3507db96d56Sopenharmony_ci                [ExceptionGroup("j2", [ExceptionGroup("j4", [TypeError("T")])])]),
3517db96d56Sopenharmony_ci            ExceptionGroup(
3527db96d56Sopenharmony_ci                "j1",
3537db96d56Sopenharmony_ci                [ExceptionGroup("j2", [ExceptionGroup("j3", [ValueError("V1")])])]))
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci    def test_naked_exception_matched_wrapped1(self):
3567db96d56Sopenharmony_ci        self.doSplitTest(
3577db96d56Sopenharmony_ci            ValueError("V"),
3587db96d56Sopenharmony_ci            ValueError,
3597db96d56Sopenharmony_ci            ExceptionGroup("", [ValueError("V")]),
3607db96d56Sopenharmony_ci            None)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci    def test_naked_exception_matched_wrapped2(self):
3637db96d56Sopenharmony_ci        self.doSplitTest(
3647db96d56Sopenharmony_ci            ValueError("V"),
3657db96d56Sopenharmony_ci            Exception,
3667db96d56Sopenharmony_ci            ExceptionGroup("", [ValueError("V")]),
3677db96d56Sopenharmony_ci            None)
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci    def test_exception_group_except_star_Exception_not_wrapped(self):
3707db96d56Sopenharmony_ci        self.doSplitTest(
3717db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError("V")]),
3727db96d56Sopenharmony_ci            Exception,
3737db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError("V")]),
3747db96d56Sopenharmony_ci            None)
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci    def test_plain_exception_not_matched(self):
3777db96d56Sopenharmony_ci        self.doSplitTest(
3787db96d56Sopenharmony_ci            ValueError("V"),
3797db96d56Sopenharmony_ci            TypeError,
3807db96d56Sopenharmony_ci            None,
3817db96d56Sopenharmony_ci            ValueError("V"))
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci    def test_match__supertype(self):
3847db96d56Sopenharmony_ci        self.doSplitTest(
3857db96d56Sopenharmony_ci            ExceptionGroup("st", [BlockingIOError("io"), TypeError("T")]),
3867db96d56Sopenharmony_ci            OSError,
3877db96d56Sopenharmony_ci            ExceptionGroup("st", [BlockingIOError("io")]),
3887db96d56Sopenharmony_ci            ExceptionGroup("st", [TypeError("T")]))
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci    def test_multiple_matches_named(self):
3917db96d56Sopenharmony_ci        try:
3927db96d56Sopenharmony_ci            raise ExceptionGroup("mmn", [OSError("os"), BlockingIOError("io")])
3937db96d56Sopenharmony_ci        except* BlockingIOError as e:
3947db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
3957db96d56Sopenharmony_ci                ExceptionGroup("mmn", [BlockingIOError("io")]))
3967db96d56Sopenharmony_ci        except* OSError as e:
3977db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
3987db96d56Sopenharmony_ci                ExceptionGroup("mmn", [OSError("os")]))
3997db96d56Sopenharmony_ci        else:
4007db96d56Sopenharmony_ci            self.fail("Exception not raised")
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci    def test_multiple_matches_unnamed(self):
4037db96d56Sopenharmony_ci        try:
4047db96d56Sopenharmony_ci            raise ExceptionGroup("mmu", [OSError("os"), BlockingIOError("io")])
4057db96d56Sopenharmony_ci        except* BlockingIOError:
4067db96d56Sopenharmony_ci            e = sys.exception()
4077db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
4087db96d56Sopenharmony_ci                ExceptionGroup("mmu", [BlockingIOError("io")]))
4097db96d56Sopenharmony_ci        except* OSError:
4107db96d56Sopenharmony_ci            e = sys.exception()
4117db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
4127db96d56Sopenharmony_ci                ExceptionGroup("mmu", [OSError("os")]))
4137db96d56Sopenharmony_ci        else:
4147db96d56Sopenharmony_ci            self.fail("Exception not raised")
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci    def test_first_match_wins_named(self):
4177db96d56Sopenharmony_ci        try:
4187db96d56Sopenharmony_ci            raise ExceptionGroup("fst", [BlockingIOError("io")])
4197db96d56Sopenharmony_ci        except* OSError as e:
4207db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
4217db96d56Sopenharmony_ci                ExceptionGroup("fst", [BlockingIOError("io")]))
4227db96d56Sopenharmony_ci        except* BlockingIOError:
4237db96d56Sopenharmony_ci            self.fail("Should have been matched as OSError")
4247db96d56Sopenharmony_ci        else:
4257db96d56Sopenharmony_ci            self.fail("Exception not raised")
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci    def test_first_match_wins_unnamed(self):
4287db96d56Sopenharmony_ci        try:
4297db96d56Sopenharmony_ci            raise ExceptionGroup("fstu", [BlockingIOError("io")])
4307db96d56Sopenharmony_ci        except* OSError:
4317db96d56Sopenharmony_ci            e = sys.exception()
4327db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
4337db96d56Sopenharmony_ci                ExceptionGroup("fstu", [BlockingIOError("io")]))
4347db96d56Sopenharmony_ci        except* BlockingIOError:
4357db96d56Sopenharmony_ci            pass
4367db96d56Sopenharmony_ci        else:
4377db96d56Sopenharmony_ci            self.fail("Exception not raised")
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci    def test_nested_except_stars(self):
4407db96d56Sopenharmony_ci        try:
4417db96d56Sopenharmony_ci            raise ExceptionGroup("n", [BlockingIOError("io")])
4427db96d56Sopenharmony_ci        except* BlockingIOError:
4437db96d56Sopenharmony_ci            try:
4447db96d56Sopenharmony_ci                raise ExceptionGroup("n", [ValueError("io")])
4457db96d56Sopenharmony_ci            except* ValueError:
4467db96d56Sopenharmony_ci                pass
4477db96d56Sopenharmony_ci            else:
4487db96d56Sopenharmony_ci                self.fail("Exception not raised")
4497db96d56Sopenharmony_ci            e = sys.exception()
4507db96d56Sopenharmony_ci            self.assertExceptionIsLike(e,
4517db96d56Sopenharmony_ci                 ExceptionGroup("n", [BlockingIOError("io")]))
4527db96d56Sopenharmony_ci        else:
4537db96d56Sopenharmony_ci            self.fail("Exception not raised")
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci    def test_nested_in_loop(self):
4567db96d56Sopenharmony_ci        for _ in range(2):
4577db96d56Sopenharmony_ci            try:
4587db96d56Sopenharmony_ci                raise ExceptionGroup("nl", [BlockingIOError("io")])
4597db96d56Sopenharmony_ci            except* BlockingIOError:
4607db96d56Sopenharmony_ci                pass
4617db96d56Sopenharmony_ci            else:
4627db96d56Sopenharmony_ci                self.fail("Exception not raised")
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ciclass TestExceptStarReraise(ExceptStarTest):
4667db96d56Sopenharmony_ci    def test_reraise_all_named(self):
4677db96d56Sopenharmony_ci        try:
4687db96d56Sopenharmony_ci            try:
4697db96d56Sopenharmony_ci                raise ExceptionGroup(
4707db96d56Sopenharmony_ci                    "eg", [TypeError(1), ValueError(2), OSError(3)])
4717db96d56Sopenharmony_ci            except* TypeError as e:
4727db96d56Sopenharmony_ci                raise
4737db96d56Sopenharmony_ci            except* ValueError as e:
4747db96d56Sopenharmony_ci                raise
4757db96d56Sopenharmony_ci            # OSError not handled
4767db96d56Sopenharmony_ci        except ExceptionGroup as e:
4777db96d56Sopenharmony_ci            exc = e
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci        self.assertExceptionIsLike(
4807db96d56Sopenharmony_ci            exc,
4817db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2), OSError(3)]))
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci    def test_reraise_all_unnamed(self):
4847db96d56Sopenharmony_ci        try:
4857db96d56Sopenharmony_ci            try:
4867db96d56Sopenharmony_ci                raise ExceptionGroup(
4877db96d56Sopenharmony_ci                    "eg", [TypeError(1), ValueError(2), OSError(3)])
4887db96d56Sopenharmony_ci            except* TypeError:
4897db96d56Sopenharmony_ci                raise
4907db96d56Sopenharmony_ci            except* ValueError:
4917db96d56Sopenharmony_ci                raise
4927db96d56Sopenharmony_ci            # OSError not handled
4937db96d56Sopenharmony_ci        except ExceptionGroup as e:
4947db96d56Sopenharmony_ci            exc = e
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci        self.assertExceptionIsLike(
4977db96d56Sopenharmony_ci            exc,
4987db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2), OSError(3)]))
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci    def test_reraise_some_handle_all_named(self):
5017db96d56Sopenharmony_ci        try:
5027db96d56Sopenharmony_ci            try:
5037db96d56Sopenharmony_ci                raise ExceptionGroup(
5047db96d56Sopenharmony_ci                    "eg", [TypeError(1), ValueError(2), OSError(3)])
5057db96d56Sopenharmony_ci            except* TypeError as e:
5067db96d56Sopenharmony_ci                raise
5077db96d56Sopenharmony_ci            except* ValueError as e:
5087db96d56Sopenharmony_ci                pass
5097db96d56Sopenharmony_ci            # OSError not handled
5107db96d56Sopenharmony_ci        except ExceptionGroup as e:
5117db96d56Sopenharmony_ci            exc = e
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5147db96d56Sopenharmony_ci            exc, ExceptionGroup("eg", [TypeError(1), OSError(3)]))
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci    def test_reraise_partial_handle_all_unnamed(self):
5177db96d56Sopenharmony_ci        try:
5187db96d56Sopenharmony_ci            try:
5197db96d56Sopenharmony_ci                raise ExceptionGroup(
5207db96d56Sopenharmony_ci                    "eg", [TypeError(1), ValueError(2)])
5217db96d56Sopenharmony_ci            except* TypeError:
5227db96d56Sopenharmony_ci                raise
5237db96d56Sopenharmony_ci            except* ValueError:
5247db96d56Sopenharmony_ci                pass
5257db96d56Sopenharmony_ci        except ExceptionGroup as e:
5267db96d56Sopenharmony_ci            exc = e
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5297db96d56Sopenharmony_ci            exc, ExceptionGroup("eg", [TypeError(1)]))
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci    def test_reraise_partial_handle_some_named(self):
5327db96d56Sopenharmony_ci        try:
5337db96d56Sopenharmony_ci            try:
5347db96d56Sopenharmony_ci                raise ExceptionGroup(
5357db96d56Sopenharmony_ci                    "eg", [TypeError(1), ValueError(2), OSError(3)])
5367db96d56Sopenharmony_ci            except* TypeError as e:
5377db96d56Sopenharmony_ci                raise
5387db96d56Sopenharmony_ci            except* ValueError as e:
5397db96d56Sopenharmony_ci                pass
5407db96d56Sopenharmony_ci            # OSError not handled
5417db96d56Sopenharmony_ci        except ExceptionGroup as e:
5427db96d56Sopenharmony_ci            exc = e
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5457db96d56Sopenharmony_ci            exc, ExceptionGroup("eg", [TypeError(1), OSError(3)]))
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci    def test_reraise_partial_handle_some_unnamed(self):
5487db96d56Sopenharmony_ci        try:
5497db96d56Sopenharmony_ci            try:
5507db96d56Sopenharmony_ci                raise ExceptionGroup(
5517db96d56Sopenharmony_ci                    "eg", [TypeError(1), ValueError(2), OSError(3)])
5527db96d56Sopenharmony_ci            except* TypeError:
5537db96d56Sopenharmony_ci                raise
5547db96d56Sopenharmony_ci            except* ValueError:
5557db96d56Sopenharmony_ci                pass
5567db96d56Sopenharmony_ci        except ExceptionGroup as e:
5577db96d56Sopenharmony_ci            exc = e
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5607db96d56Sopenharmony_ci            exc, ExceptionGroup("eg", [TypeError(1), OSError(3)]))
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci    def test_reraise_plain_exception_named(self):
5637db96d56Sopenharmony_ci        try:
5647db96d56Sopenharmony_ci            try:
5657db96d56Sopenharmony_ci                raise ValueError(42)
5667db96d56Sopenharmony_ci            except* ValueError as e:
5677db96d56Sopenharmony_ci                raise
5687db96d56Sopenharmony_ci        except ExceptionGroup as e:
5697db96d56Sopenharmony_ci            exc = e
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5727db96d56Sopenharmony_ci            exc, ExceptionGroup("", [ValueError(42)]))
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci    def test_reraise_plain_exception_unnamed(self):
5757db96d56Sopenharmony_ci        try:
5767db96d56Sopenharmony_ci            try:
5777db96d56Sopenharmony_ci                raise ValueError(42)
5787db96d56Sopenharmony_ci            except* ValueError:
5797db96d56Sopenharmony_ci                raise
5807db96d56Sopenharmony_ci        except ExceptionGroup as e:
5817db96d56Sopenharmony_ci            exc = e
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5847db96d56Sopenharmony_ci            exc, ExceptionGroup("", [ValueError(42)]))
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ciclass TestExceptStarRaise(ExceptStarTest):
5887db96d56Sopenharmony_ci    def test_raise_named(self):
5897db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [ValueError(1), OSError(2)])
5907db96d56Sopenharmony_ci        try:
5917db96d56Sopenharmony_ci            try:
5927db96d56Sopenharmony_ci                raise orig
5937db96d56Sopenharmony_ci            except* OSError as e:
5947db96d56Sopenharmony_ci                raise TypeError(3)
5957db96d56Sopenharmony_ci        except ExceptionGroup as e:
5967db96d56Sopenharmony_ci            exc = e
5977db96d56Sopenharmony_ci
5987db96d56Sopenharmony_ci        self.assertExceptionIsLike(
5997db96d56Sopenharmony_ci            exc,
6007db96d56Sopenharmony_ci            ExceptionGroup(
6017db96d56Sopenharmony_ci                "", [TypeError(3), ExceptionGroup("eg", [ValueError(1)])]))
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6047db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
6057db96d56Sopenharmony_ci            ExceptionGroup("eg", [OSError(2)]))
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
6087db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ci    def test_raise_unnamed(self):
6117db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [ValueError(1), OSError(2)])
6127db96d56Sopenharmony_ci        try:
6137db96d56Sopenharmony_ci            try:
6147db96d56Sopenharmony_ci                raise orig
6157db96d56Sopenharmony_ci            except* OSError:
6167db96d56Sopenharmony_ci                raise TypeError(3)
6177db96d56Sopenharmony_ci        except ExceptionGroup as e:
6187db96d56Sopenharmony_ci            exc = e
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6217db96d56Sopenharmony_ci            exc,
6227db96d56Sopenharmony_ci            ExceptionGroup(
6237db96d56Sopenharmony_ci                "", [TypeError(3), ExceptionGroup("eg", [ValueError(1)])]))
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6267db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
6277db96d56Sopenharmony_ci            ExceptionGroup("eg", [OSError(2)]))
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
6307db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci    def test_raise_handle_all_raise_one_named(self):
6337db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
6347db96d56Sopenharmony_ci        try:
6357db96d56Sopenharmony_ci            try:
6367db96d56Sopenharmony_ci                raise orig
6377db96d56Sopenharmony_ci            except* (TypeError, ValueError) as e:
6387db96d56Sopenharmony_ci                raise SyntaxError(3)
6397db96d56Sopenharmony_ci        except SyntaxError as e:
6407db96d56Sopenharmony_ci            exc = e
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc, SyntaxError(3))
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6457db96d56Sopenharmony_ci            exc.__context__,
6467db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2)]))
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
6497db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.__context__)
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ci    def test_raise_handle_all_raise_one_unnamed(self):
6527db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
6537db96d56Sopenharmony_ci        try:
6547db96d56Sopenharmony_ci            try:
6557db96d56Sopenharmony_ci                raise orig
6567db96d56Sopenharmony_ci            except* (TypeError, ValueError) as e:
6577db96d56Sopenharmony_ci                raise SyntaxError(3)
6587db96d56Sopenharmony_ci        except SyntaxError as e:
6597db96d56Sopenharmony_ci            exc = e
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc, SyntaxError(3))
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6647db96d56Sopenharmony_ci            exc.__context__,
6657db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2)]))
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
6687db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.__context__)
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci    def test_raise_handle_all_raise_two_named(self):
6717db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
6727db96d56Sopenharmony_ci        try:
6737db96d56Sopenharmony_ci            try:
6747db96d56Sopenharmony_ci                raise orig
6757db96d56Sopenharmony_ci            except* TypeError as e:
6767db96d56Sopenharmony_ci                raise SyntaxError(3)
6777db96d56Sopenharmony_ci            except* ValueError as e:
6787db96d56Sopenharmony_ci                raise SyntaxError(4)
6797db96d56Sopenharmony_ci        except ExceptionGroup as e:
6807db96d56Sopenharmony_ci            exc = e
6817db96d56Sopenharmony_ci
6827db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6837db96d56Sopenharmony_ci            exc, ExceptionGroup("", [SyntaxError(3), SyntaxError(4)]))
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6867db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
6877db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1)]))
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci        self.assertExceptionIsLike(
6907db96d56Sopenharmony_ci            exc.exceptions[1].__context__,
6917db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError(2)]))
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
6947db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
6957db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[1].__context__)
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci    def test_raise_handle_all_raise_two_unnamed(self):
6987db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
6997db96d56Sopenharmony_ci        try:
7007db96d56Sopenharmony_ci            try:
7017db96d56Sopenharmony_ci                raise orig
7027db96d56Sopenharmony_ci            except* TypeError:
7037db96d56Sopenharmony_ci                raise SyntaxError(3)
7047db96d56Sopenharmony_ci            except* ValueError:
7057db96d56Sopenharmony_ci                raise SyntaxError(4)
7067db96d56Sopenharmony_ci        except ExceptionGroup as e:
7077db96d56Sopenharmony_ci            exc = e
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7107db96d56Sopenharmony_ci            exc, ExceptionGroup("", [SyntaxError(3), SyntaxError(4)]))
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7137db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
7147db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1)]))
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7177db96d56Sopenharmony_ci            exc.exceptions[1].__context__,
7187db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError(2)]))
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
7217db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
7227db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[1].__context__)
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ciclass TestExceptStarRaiseFrom(ExceptStarTest):
7267db96d56Sopenharmony_ci    def test_raise_named(self):
7277db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [ValueError(1), OSError(2)])
7287db96d56Sopenharmony_ci        try:
7297db96d56Sopenharmony_ci            try:
7307db96d56Sopenharmony_ci                raise orig
7317db96d56Sopenharmony_ci            except* OSError as e:
7327db96d56Sopenharmony_ci                raise TypeError(3) from e
7337db96d56Sopenharmony_ci        except ExceptionGroup as e:
7347db96d56Sopenharmony_ci            exc = e
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7377db96d56Sopenharmony_ci            exc,
7387db96d56Sopenharmony_ci            ExceptionGroup(
7397db96d56Sopenharmony_ci                "", [TypeError(3), ExceptionGroup("eg", [ValueError(1)])]))
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7427db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
7437db96d56Sopenharmony_ci            ExceptionGroup("eg", [OSError(2)]))
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7467db96d56Sopenharmony_ci            exc.exceptions[0].__cause__,
7477db96d56Sopenharmony_ci            ExceptionGroup("eg", [OSError(2)]))
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
7507db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
7517db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__cause__)
7527db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc.exceptions[1].__context__)
7537db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc.exceptions[1].__cause__)
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci    def test_raise_unnamed(self):
7567db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [ValueError(1), OSError(2)])
7577db96d56Sopenharmony_ci        try:
7587db96d56Sopenharmony_ci            try:
7597db96d56Sopenharmony_ci                raise orig
7607db96d56Sopenharmony_ci            except* OSError:
7617db96d56Sopenharmony_ci                e = sys.exception()
7627db96d56Sopenharmony_ci                raise TypeError(3) from e
7637db96d56Sopenharmony_ci        except ExceptionGroup as e:
7647db96d56Sopenharmony_ci            exc = e
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7677db96d56Sopenharmony_ci            exc,
7687db96d56Sopenharmony_ci            ExceptionGroup(
7697db96d56Sopenharmony_ci                "", [TypeError(3), ExceptionGroup("eg", [ValueError(1)])]))
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7727db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
7737db96d56Sopenharmony_ci            ExceptionGroup("eg", [OSError(2)]))
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7767db96d56Sopenharmony_ci            exc.exceptions[0].__cause__,
7777db96d56Sopenharmony_ci            ExceptionGroup("eg", [OSError(2)]))
7787db96d56Sopenharmony_ci
7797db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
7807db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
7817db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__cause__)
7827db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc.exceptions[1].__context__)
7837db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc.exceptions[1].__cause__)
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci    def test_raise_handle_all_raise_one_named(self):
7867db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
7877db96d56Sopenharmony_ci        try:
7887db96d56Sopenharmony_ci            try:
7897db96d56Sopenharmony_ci                raise orig
7907db96d56Sopenharmony_ci            except* (TypeError, ValueError) as e:
7917db96d56Sopenharmony_ci                raise SyntaxError(3) from e
7927db96d56Sopenharmony_ci        except SyntaxError as e:
7937db96d56Sopenharmony_ci            exc = e
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc, SyntaxError(3))
7967db96d56Sopenharmony_ci
7977db96d56Sopenharmony_ci        self.assertExceptionIsLike(
7987db96d56Sopenharmony_ci            exc.__context__,
7997db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2)]))
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8027db96d56Sopenharmony_ci            exc.__cause__,
8037db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2)]))
8047db96d56Sopenharmony_ci
8057db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
8067db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.__context__)
8077db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.__cause__)
8087db96d56Sopenharmony_ci
8097db96d56Sopenharmony_ci    def test_raise_handle_all_raise_one_unnamed(self):
8107db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
8117db96d56Sopenharmony_ci        try:
8127db96d56Sopenharmony_ci            try:
8137db96d56Sopenharmony_ci                raise orig
8147db96d56Sopenharmony_ci            except* (TypeError, ValueError) as e:
8157db96d56Sopenharmony_ci                e = sys.exception()
8167db96d56Sopenharmony_ci                raise SyntaxError(3) from e
8177db96d56Sopenharmony_ci        except SyntaxError as e:
8187db96d56Sopenharmony_ci            exc = e
8197db96d56Sopenharmony_ci
8207db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc, SyntaxError(3))
8217db96d56Sopenharmony_ci
8227db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8237db96d56Sopenharmony_ci            exc.__context__,
8247db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2)]))
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8277db96d56Sopenharmony_ci            exc.__cause__,
8287db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1), ValueError(2)]))
8297db96d56Sopenharmony_ci
8307db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
8317db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.__context__)
8327db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.__cause__)
8337db96d56Sopenharmony_ci
8347db96d56Sopenharmony_ci    def test_raise_handle_all_raise_two_named(self):
8357db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
8367db96d56Sopenharmony_ci        try:
8377db96d56Sopenharmony_ci            try:
8387db96d56Sopenharmony_ci                raise orig
8397db96d56Sopenharmony_ci            except* TypeError as e:
8407db96d56Sopenharmony_ci                raise SyntaxError(3) from e
8417db96d56Sopenharmony_ci            except* ValueError as e:
8427db96d56Sopenharmony_ci                raise SyntaxError(4) from e
8437db96d56Sopenharmony_ci        except ExceptionGroup as e:
8447db96d56Sopenharmony_ci            exc = e
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8477db96d56Sopenharmony_ci            exc, ExceptionGroup("", [SyntaxError(3), SyntaxError(4)]))
8487db96d56Sopenharmony_ci
8497db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8507db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
8517db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1)]))
8527db96d56Sopenharmony_ci
8537db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8547db96d56Sopenharmony_ci            exc.exceptions[0].__cause__,
8557db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1)]))
8567db96d56Sopenharmony_ci
8577db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8587db96d56Sopenharmony_ci            exc.exceptions[1].__context__,
8597db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError(2)]))
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8627db96d56Sopenharmony_ci            exc.exceptions[1].__cause__,
8637db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError(2)]))
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
8667db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
8677db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__cause__)
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci    def test_raise_handle_all_raise_two_unnamed(self):
8707db96d56Sopenharmony_ci        orig = ExceptionGroup("eg", [TypeError(1), ValueError(2)])
8717db96d56Sopenharmony_ci        try:
8727db96d56Sopenharmony_ci            try:
8737db96d56Sopenharmony_ci                raise orig
8747db96d56Sopenharmony_ci            except* TypeError:
8757db96d56Sopenharmony_ci                e = sys.exception()
8767db96d56Sopenharmony_ci                raise SyntaxError(3) from e
8777db96d56Sopenharmony_ci            except* ValueError:
8787db96d56Sopenharmony_ci                e = sys.exception()
8797db96d56Sopenharmony_ci                raise SyntaxError(4) from e
8807db96d56Sopenharmony_ci        except ExceptionGroup as e:
8817db96d56Sopenharmony_ci            exc = e
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8847db96d56Sopenharmony_ci            exc, ExceptionGroup("", [SyntaxError(3), SyntaxError(4)]))
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8877db96d56Sopenharmony_ci            exc.exceptions[0].__context__,
8887db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1)]))
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8917db96d56Sopenharmony_ci            exc.exceptions[0].__cause__,
8927db96d56Sopenharmony_ci            ExceptionGroup("eg", [TypeError(1)]))
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8957db96d56Sopenharmony_ci            exc.exceptions[1].__context__,
8967db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError(2)]))
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ci        self.assertExceptionIsLike(
8997db96d56Sopenharmony_ci            exc.exceptions[1].__cause__,
9007db96d56Sopenharmony_ci            ExceptionGroup("eg", [ValueError(2)]))
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci        self.assertMetadataNotEqual(orig, exc)
9037db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__context__)
9047db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[0].__cause__)
9057db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[1].__context__)
9067db96d56Sopenharmony_ci        self.assertMetadataEqual(orig, exc.exceptions[1].__cause__)
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ciclass TestExceptStarExceptionGroupSubclass(ExceptStarTest):
9107db96d56Sopenharmony_ci    def test_except_star_EG_subclass(self):
9117db96d56Sopenharmony_ci        class EG(ExceptionGroup):
9127db96d56Sopenharmony_ci            def __new__(cls, message, excs, code):
9137db96d56Sopenharmony_ci                obj = super().__new__(cls, message, excs)
9147db96d56Sopenharmony_ci                obj.code = code
9157db96d56Sopenharmony_ci                return obj
9167db96d56Sopenharmony_ci
9177db96d56Sopenharmony_ci            def derive(self, excs):
9187db96d56Sopenharmony_ci                return EG(self.message, excs, self.code)
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci        try:
9217db96d56Sopenharmony_ci            try:
9227db96d56Sopenharmony_ci                try:
9237db96d56Sopenharmony_ci                    try:
9247db96d56Sopenharmony_ci                        raise TypeError(2)
9257db96d56Sopenharmony_ci                    except TypeError as te:
9267db96d56Sopenharmony_ci                        raise EG("nested", [te], 101) from None
9277db96d56Sopenharmony_ci                except EG as nested:
9287db96d56Sopenharmony_ci                    try:
9297db96d56Sopenharmony_ci                        raise ValueError(1)
9307db96d56Sopenharmony_ci                    except ValueError as ve:
9317db96d56Sopenharmony_ci                        raise EG("eg", [ve, nested], 42)
9327db96d56Sopenharmony_ci            except* ValueError as eg:
9337db96d56Sopenharmony_ci                veg = eg
9347db96d56Sopenharmony_ci        except EG as eg:
9357db96d56Sopenharmony_ci            teg = eg
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci        self.assertIsInstance(veg, EG)
9387db96d56Sopenharmony_ci        self.assertIsInstance(teg, EG)
9397db96d56Sopenharmony_ci        self.assertIsInstance(teg.exceptions[0], EG)
9407db96d56Sopenharmony_ci        self.assertMetadataEqual(veg, teg)
9417db96d56Sopenharmony_ci        self.assertEqual(veg.code, 42)
9427db96d56Sopenharmony_ci        self.assertEqual(teg.code, 42)
9437db96d56Sopenharmony_ci        self.assertEqual(teg.exceptions[0].code, 101)
9447db96d56Sopenharmony_ci
9457db96d56Sopenharmony_ci    def test_falsy_exception_group_subclass(self):
9467db96d56Sopenharmony_ci        class FalsyEG(ExceptionGroup):
9477db96d56Sopenharmony_ci            def __bool__(self):
9487db96d56Sopenharmony_ci                return False
9497db96d56Sopenharmony_ci
9507db96d56Sopenharmony_ci            def derive(self, excs):
9517db96d56Sopenharmony_ci                return FalsyEG(self.message, excs)
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci        try:
9547db96d56Sopenharmony_ci            try:
9557db96d56Sopenharmony_ci                raise FalsyEG("eg", [TypeError(1), ValueError(2)])
9567db96d56Sopenharmony_ci            except *TypeError as e:
9577db96d56Sopenharmony_ci                tes = e
9587db96d56Sopenharmony_ci                raise
9597db96d56Sopenharmony_ci            except *ValueError as e:
9607db96d56Sopenharmony_ci                ves = e
9617db96d56Sopenharmony_ci                pass
9627db96d56Sopenharmony_ci        except Exception as e:
9637db96d56Sopenharmony_ci            exc = e
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci        for e in [tes, ves, exc]:
9667db96d56Sopenharmony_ci            self.assertFalse(e)
9677db96d56Sopenharmony_ci            self.assertIsInstance(e, FalsyEG)
9687db96d56Sopenharmony_ci
9697db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc, FalsyEG("eg", [TypeError(1)]))
9707db96d56Sopenharmony_ci        self.assertExceptionIsLike(tes, FalsyEG("eg", [TypeError(1)]))
9717db96d56Sopenharmony_ci        self.assertExceptionIsLike(ves, FalsyEG("eg", [ValueError(2)]))
9727db96d56Sopenharmony_ci
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ciclass TestExceptStarCleanup(ExceptStarTest):
9757db96d56Sopenharmony_ci    def test_sys_exception_restored(self):
9767db96d56Sopenharmony_ci        try:
9777db96d56Sopenharmony_ci            try:
9787db96d56Sopenharmony_ci                raise ValueError(42)
9797db96d56Sopenharmony_ci            except:
9807db96d56Sopenharmony_ci                try:
9817db96d56Sopenharmony_ci                    raise TypeError(int)
9827db96d56Sopenharmony_ci                except* Exception:
9837db96d56Sopenharmony_ci                    pass
9847db96d56Sopenharmony_ci                1/0
9857db96d56Sopenharmony_ci        except Exception as e:
9867db96d56Sopenharmony_ci            exc = e
9877db96d56Sopenharmony_ci
9887db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc, ZeroDivisionError('division by zero'))
9897db96d56Sopenharmony_ci        self.assertExceptionIsLike(exc.__context__, ValueError(42))
9907db96d56Sopenharmony_ci        self.assertEqual(sys.exception(), None)
9917db96d56Sopenharmony_ci
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ciclass TestExceptStar_WeirdLeafExceptions(ExceptStarTest):
9947db96d56Sopenharmony_ci    # Test that except* works when leaf exceptions are
9957db96d56Sopenharmony_ci    # unhashable or have a bad custom __eq__
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci    class UnhashableExc(ValueError):
9987db96d56Sopenharmony_ci        __hash__ = None
9997db96d56Sopenharmony_ci
10007db96d56Sopenharmony_ci    class AlwaysEqualExc(ValueError):
10017db96d56Sopenharmony_ci        def __eq__(self, other):
10027db96d56Sopenharmony_ci            return True
10037db96d56Sopenharmony_ci
10047db96d56Sopenharmony_ci    class NeverEqualExc(ValueError):
10057db96d56Sopenharmony_ci        def __eq__(self, other):
10067db96d56Sopenharmony_ci            return False
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci    class BrokenEqualExc(ValueError):
10097db96d56Sopenharmony_ci        def __eq__(self, other):
10107db96d56Sopenharmony_ci            raise RuntimeError()
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci    def setUp(self):
10137db96d56Sopenharmony_ci        self.bad_types = [self.UnhashableExc,
10147db96d56Sopenharmony_ci                          self.AlwaysEqualExc,
10157db96d56Sopenharmony_ci                          self.NeverEqualExc,
10167db96d56Sopenharmony_ci                          self.BrokenEqualExc]
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci    def except_type(self, eg, type):
10197db96d56Sopenharmony_ci        match, rest = None, None
10207db96d56Sopenharmony_ci        try:
10217db96d56Sopenharmony_ci            try:
10227db96d56Sopenharmony_ci                raise eg
10237db96d56Sopenharmony_ci            except* type  as e:
10247db96d56Sopenharmony_ci                match = e
10257db96d56Sopenharmony_ci        except Exception as e:
10267db96d56Sopenharmony_ci            rest = e
10277db96d56Sopenharmony_ci        return match, rest
10287db96d56Sopenharmony_ci
10297db96d56Sopenharmony_ci    def test_catch_unhashable_leaf_exception(self):
10307db96d56Sopenharmony_ci        for Bad in self.bad_types:
10317db96d56Sopenharmony_ci            with self.subTest(Bad):
10327db96d56Sopenharmony_ci                eg = ExceptionGroup("eg", [TypeError(1), Bad(2)])
10337db96d56Sopenharmony_ci                match, rest = self.except_type(eg, Bad)
10347db96d56Sopenharmony_ci                self.assertExceptionIsLike(
10357db96d56Sopenharmony_ci                    match, ExceptionGroup("eg", [Bad(2)]))
10367db96d56Sopenharmony_ci                self.assertExceptionIsLike(
10377db96d56Sopenharmony_ci                    rest, ExceptionGroup("eg", [TypeError(1)]))
10387db96d56Sopenharmony_ci
10397db96d56Sopenharmony_ci    def test_propagate_unhashable_leaf(self):
10407db96d56Sopenharmony_ci        for Bad in self.bad_types:
10417db96d56Sopenharmony_ci            with self.subTest(Bad):
10427db96d56Sopenharmony_ci                eg = ExceptionGroup("eg", [TypeError(1), Bad(2)])
10437db96d56Sopenharmony_ci                match, rest = self.except_type(eg, TypeError)
10447db96d56Sopenharmony_ci                self.assertExceptionIsLike(
10457db96d56Sopenharmony_ci                    match, ExceptionGroup("eg", [TypeError(1)]))
10467db96d56Sopenharmony_ci                self.assertExceptionIsLike(
10477db96d56Sopenharmony_ci                    rest, ExceptionGroup("eg", [Bad(2)]))
10487db96d56Sopenharmony_ci
10497db96d56Sopenharmony_ci    def test_catch_nothing_unhashable_leaf(self):
10507db96d56Sopenharmony_ci        for Bad in self.bad_types:
10517db96d56Sopenharmony_ci            with self.subTest(Bad):
10527db96d56Sopenharmony_ci                eg = ExceptionGroup("eg", [TypeError(1), Bad(2)])
10537db96d56Sopenharmony_ci                match, rest = self.except_type(eg, OSError)
10547db96d56Sopenharmony_ci                self.assertIsNone(match)
10557db96d56Sopenharmony_ci                self.assertExceptionIsLike(rest, eg)
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci    def test_catch_everything_unhashable_leaf(self):
10587db96d56Sopenharmony_ci        for Bad in self.bad_types:
10597db96d56Sopenharmony_ci            with self.subTest(Bad):
10607db96d56Sopenharmony_ci                eg = ExceptionGroup("eg", [TypeError(1), Bad(2)])
10617db96d56Sopenharmony_ci                match, rest = self.except_type(eg, Exception)
10627db96d56Sopenharmony_ci                self.assertExceptionIsLike(match, eg)
10637db96d56Sopenharmony_ci                self.assertIsNone(rest)
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ci    def test_reraise_unhashable_leaf(self):
10667db96d56Sopenharmony_ci        for Bad in self.bad_types:
10677db96d56Sopenharmony_ci            with self.subTest(Bad):
10687db96d56Sopenharmony_ci                eg = ExceptionGroup(
10697db96d56Sopenharmony_ci                    "eg", [TypeError(1), Bad(2), ValueError(3)])
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci                try:
10727db96d56Sopenharmony_ci                    try:
10737db96d56Sopenharmony_ci                        raise eg
10747db96d56Sopenharmony_ci                    except* TypeError:
10757db96d56Sopenharmony_ci                        pass
10767db96d56Sopenharmony_ci                    except* Bad:
10777db96d56Sopenharmony_ci                        raise
10787db96d56Sopenharmony_ci                except Exception as e:
10797db96d56Sopenharmony_ci                    exc = e
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci                self.assertExceptionIsLike(
10827db96d56Sopenharmony_ci                    exc, ExceptionGroup("eg", [Bad(2), ValueError(3)]))
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_ci
10857db96d56Sopenharmony_ciclass TestExceptStar_WeirdExceptionGroupSubclass(ExceptStarTest):
10867db96d56Sopenharmony_ci    # Test that except* works with exception groups that are
10877db96d56Sopenharmony_ci    # unhashable or have a bad custom __eq__
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci    class UnhashableEG(ExceptionGroup):
10907db96d56Sopenharmony_ci        __hash__ = None
10917db96d56Sopenharmony_ci
10927db96d56Sopenharmony_ci        def derive(self, excs):
10937db96d56Sopenharmony_ci            return type(self)(self.message, excs)
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ci    class AlwaysEqualEG(ExceptionGroup):
10967db96d56Sopenharmony_ci        def __eq__(self, other):
10977db96d56Sopenharmony_ci            return True
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci        def derive(self, excs):
11007db96d56Sopenharmony_ci            return type(self)(self.message, excs)
11017db96d56Sopenharmony_ci
11027db96d56Sopenharmony_ci    class NeverEqualEG(ExceptionGroup):
11037db96d56Sopenharmony_ci        def __eq__(self, other):
11047db96d56Sopenharmony_ci            return False
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci        def derive(self, excs):
11077db96d56Sopenharmony_ci            return type(self)(self.message, excs)
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci    class BrokenEqualEG(ExceptionGroup):
11107db96d56Sopenharmony_ci        def __eq__(self, other):
11117db96d56Sopenharmony_ci            raise RuntimeError()
11127db96d56Sopenharmony_ci
11137db96d56Sopenharmony_ci        def derive(self, excs):
11147db96d56Sopenharmony_ci            return type(self)(self.message, excs)
11157db96d56Sopenharmony_ci
11167db96d56Sopenharmony_ci    def setUp(self):
11177db96d56Sopenharmony_ci        self.bad_types = [self.UnhashableEG,
11187db96d56Sopenharmony_ci                          self.AlwaysEqualEG,
11197db96d56Sopenharmony_ci                          self.NeverEqualEG,
11207db96d56Sopenharmony_ci                          self.BrokenEqualEG]
11217db96d56Sopenharmony_ci
11227db96d56Sopenharmony_ci    def except_type(self, eg, type):
11237db96d56Sopenharmony_ci        match, rest = None, None
11247db96d56Sopenharmony_ci        try:
11257db96d56Sopenharmony_ci            try:
11267db96d56Sopenharmony_ci                raise eg
11277db96d56Sopenharmony_ci            except* type  as e:
11287db96d56Sopenharmony_ci                match = e
11297db96d56Sopenharmony_ci        except Exception as e:
11307db96d56Sopenharmony_ci            rest = e
11317db96d56Sopenharmony_ci        return match, rest
11327db96d56Sopenharmony_ci
11337db96d56Sopenharmony_ci    def test_catch_some_unhashable_exception_group_subclass(self):
11347db96d56Sopenharmony_ci        for BadEG in self.bad_types:
11357db96d56Sopenharmony_ci            with self.subTest(BadEG):
11367db96d56Sopenharmony_ci                eg = BadEG("eg",
11377db96d56Sopenharmony_ci                           [TypeError(1),
11387db96d56Sopenharmony_ci                            BadEG("nested", [ValueError(2)])])
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci                match, rest = self.except_type(eg, TypeError)
11417db96d56Sopenharmony_ci                self.assertExceptionIsLike(match, BadEG("eg", [TypeError(1)]))
11427db96d56Sopenharmony_ci                self.assertExceptionIsLike(rest,
11437db96d56Sopenharmony_ci                    BadEG("eg", [BadEG("nested", [ValueError(2)])]))
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci    def test_catch_none_unhashable_exception_group_subclass(self):
11467db96d56Sopenharmony_ci        for BadEG in self.bad_types:
11477db96d56Sopenharmony_ci            with self.subTest(BadEG):
11487db96d56Sopenharmony_ci
11497db96d56Sopenharmony_ci                eg = BadEG("eg",
11507db96d56Sopenharmony_ci                           [TypeError(1),
11517db96d56Sopenharmony_ci                            BadEG("nested", [ValueError(2)])])
11527db96d56Sopenharmony_ci
11537db96d56Sopenharmony_ci                match, rest = self.except_type(eg, OSError)
11547db96d56Sopenharmony_ci                self.assertIsNone(match)
11557db96d56Sopenharmony_ci                self.assertExceptionIsLike(rest, eg)
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ci    def test_catch_all_unhashable_exception_group_subclass(self):
11587db96d56Sopenharmony_ci        for BadEG in self.bad_types:
11597db96d56Sopenharmony_ci            with self.subTest(BadEG):
11607db96d56Sopenharmony_ci
11617db96d56Sopenharmony_ci                eg = BadEG("eg",
11627db96d56Sopenharmony_ci                           [TypeError(1),
11637db96d56Sopenharmony_ci                            BadEG("nested", [ValueError(2)])])
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci                match, rest = self.except_type(eg, Exception)
11667db96d56Sopenharmony_ci                self.assertExceptionIsLike(match, eg)
11677db96d56Sopenharmony_ci                self.assertIsNone(rest)
11687db96d56Sopenharmony_ci
11697db96d56Sopenharmony_ci    def test_reraise_unhashable_eg(self):
11707db96d56Sopenharmony_ci        for BadEG in self.bad_types:
11717db96d56Sopenharmony_ci            with self.subTest(BadEG):
11727db96d56Sopenharmony_ci
11737db96d56Sopenharmony_ci                eg = BadEG("eg",
11747db96d56Sopenharmony_ci                           [TypeError(1), ValueError(2),
11757db96d56Sopenharmony_ci                            BadEG("nested", [ValueError(3), OSError(4)])])
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci                try:
11787db96d56Sopenharmony_ci                    try:
11797db96d56Sopenharmony_ci                        raise eg
11807db96d56Sopenharmony_ci                    except* ValueError:
11817db96d56Sopenharmony_ci                        pass
11827db96d56Sopenharmony_ci                    except* OSError:
11837db96d56Sopenharmony_ci                        raise
11847db96d56Sopenharmony_ci                except Exception as e:
11857db96d56Sopenharmony_ci                    exc = e
11867db96d56Sopenharmony_ci
11877db96d56Sopenharmony_ci                self.assertExceptionIsLike(
11887db96d56Sopenharmony_ci                    exc, BadEG("eg", [TypeError(1),
11897db96d56Sopenharmony_ci                               BadEG("nested", [OSError(4)])]))
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ciif __name__ == '__main__':
11937db96d56Sopenharmony_ci    unittest.main()
1194