| 94 | # ============== TEST UTILITIES ============== |
| 95 | |
| 96 | class TestResult: |
| 97 | def __init__(self): |
| 98 | self.passed = 0 |
| 99 | self.failed = 0 |
| 100 | self.errors = [] |
| 101 | |
| 102 | def ok(self, name): |
| 103 | self.passed += 1 |
| 104 | print(f" ✓ {name}") |
| 105 | |
| 106 | def fail(self, name, expected, actual): |
| 107 | self.failed += 1 |
| 108 | self.errors.append((name, expected, actual)) |
| 109 | print(f" ✗ {name}: expected {expected!r}, got {actual!r}") |
| 110 | |
| 111 | def error(self, name, exc): |
| 112 | self.failed += 1 |
| 113 | self.errors.append((name, "no error", str(exc))) |
| 114 | print(f" ✗ {name}: {exc}") |
| 115 | |
| 116 | def summary(self): |
| 117 | total = self.passed + self.failed |
| 118 | print(f"\n{'='*50}") |
| 119 | print(f"Results: {self.passed}/{total} passed") |
| 120 | if self.failed: |
| 121 | print(f"Failed tests: {self.failed}") |
| 122 | |
| 123 | results = TestResult() |
| 124 |
no outgoing calls
no test coverage detected