summaryrefslogtreecommitdiffstats
path: root/Lib/test/support/testcase.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/support/testcase.py')
-rw-r--r--Lib/test/support/testcase.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/Lib/test/support/testcase.py b/Lib/test/support/testcase.py
new file mode 100644
index 0000000..1e4363b
--- /dev/null
+++ b/Lib/test/support/testcase.py
@@ -0,0 +1,25 @@
+class ExceptionIsLikeMixin:
+ def assertExceptionIsLike(self, exc, template):
+ """
+ Passes when the provided `exc` matches the structure of `template`.
+ Individual exceptions don't have to be the same objects or even pass
+ an equality test: they only need to be the same type and contain equal
+ `exc_obj.args`.
+ """
+ if exc is None and template is None:
+ return
+
+ if template is None:
+ self.fail(f"unexpected exception: {exc}")
+
+ if exc is None:
+ self.fail(f"expected an exception like {template!r}, got None")
+
+ if not isinstance(exc, ExceptionGroup):
+ self.assertEqual(exc.__class__, template.__class__)
+ self.assertEqual(exc.args[0], template.args[0])
+ else:
+ self.assertEqual(exc.message, template.message)
+ self.assertEqual(len(exc.exceptions), len(template.exceptions))
+ for e, t in zip(exc.exceptions, template.exceptions):
+ self.assertExceptionIsLike(e, t)