Container for results of checking exceptions. Used in RaisesGroup._check_exceptions and possible_match.
| 1450 | |
| 1451 | |
| 1452 | class ResultHolder: |
| 1453 | """Container for results of checking exceptions. |
| 1454 | Used in RaisesGroup._check_exceptions and possible_match. |
| 1455 | """ |
| 1456 | |
| 1457 | def __init__( |
| 1458 | self, |
| 1459 | expected_exceptions: tuple[ |
| 1460 | type[BaseException] | AbstractRaises[BaseException], ... |
| 1461 | ], |
| 1462 | actual_exceptions: Sequence[BaseException], |
| 1463 | ) -> None: |
| 1464 | self.results: list[list[str | type[NotChecked] | None]] = [ |
| 1465 | [NotChecked for _ in expected_exceptions] for _ in actual_exceptions |
| 1466 | ] |
| 1467 | |
| 1468 | def set_result(self, expected: int, actual: int, result: str | None) -> None: |
| 1469 | self.results[actual][expected] = result |
| 1470 | |
| 1471 | def get_result(self, expected: int, actual: int) -> str | None: |
| 1472 | res = self.results[actual][expected] |
| 1473 | assert res is not NotChecked |
| 1474 | return res |
| 1475 | |
| 1476 | def has_result(self, expected: int, actual: int) -> bool: |
| 1477 | return self.results[actual][expected] is not NotChecked |
| 1478 | |
| 1479 | def no_match_for_expected(self, expected: list[int]) -> bool: |
| 1480 | for i in expected: |
| 1481 | for actual_results in self.results: |
| 1482 | assert actual_results[i] is not NotChecked |
| 1483 | if actual_results[i] is None: |
| 1484 | return False |
| 1485 | return True |
| 1486 | |
| 1487 | def no_match_for_actual(self, actual: list[int]) -> bool: |
| 1488 | for i in actual: |
| 1489 | for res in self.results[i]: |
| 1490 | assert res is not NotChecked |
| 1491 | if res is None: |
| 1492 | return False |
| 1493 | return True |
| 1494 | |
| 1495 | |
| 1496 | def possible_match(results: ResultHolder, used: set[int] | None = None) -> bool: |