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