Skip to content

Commit 11f0479

Browse files
committed
add Defer Assertion
1 parent 346d3f7 commit 11f0479

4 files changed

Lines changed: 87 additions & 1 deletion

File tree

examples/ExampleWithDeferAssert.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import sys
2+
3+
sys.path.append("..")
4+
5+
from hamcrest import *
6+
import unittest
7+
8+
9+
class ExampleWithDeferAssert(unittest.TestCase):
10+
def testUsingDeferAssertThat(self):
11+
with DeferAssertContextManager() as da:
12+
da.assert_that("xx", is_("xx"))
13+
14+
15+
16+
if __name__ == "__main__":
17+
unittest.main()

src/hamcrest/core/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ruff: noqa: F405, F403
22

3-
from hamcrest.core.assert_that import assert_that
3+
from hamcrest.core.assert_that import assert_that, DeferAssertContextManager
44
from hamcrest.core.core import *
55

66
__author__ = "Jon Reid"
@@ -23,4 +23,5 @@
2323
"not_none",
2424
"raises",
2525
"same_instance",
26+
"DeferAssertContextManager"
2627
]

src/hamcrest/core/assert_that.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,19 @@ def _assert_bool(assertion: bool, reason: Optional[str] = None) -> None:
7676
if not reason:
7777
reason = "Assertion failed"
7878
raise AssertionError(reason)
79+
80+
class DeferAssertContextManager:
81+
def __init__(self):
82+
self.exceptions = []
83+
84+
def assert_that(self, *args, **kwargs):
85+
try:
86+
assert_that(*args, **kwargs)
87+
except AssertionError as e:
88+
self.exceptions.append(e)
89+
def __enter__(self):
90+
return self
91+
92+
def __exit__(self, exc_type, exc_value, traceback):
93+
if len(self.exceptions) > 0:
94+
raise self.exceptions.pop(0)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# encoding: utf-8
2+
import unittest
3+
4+
from hamcrest.core.assert_that import DeferAssertContextManager
5+
from hamcrest.core.core.isequal import equal_to
6+
7+
class DeferAssertContextManagerTest(unittest.TestCase):
8+
def testAssertionSuccessfully(self):
9+
with DeferAssertContextManager() as da:
10+
da.assert_that(1, equal_to(1))
11+
12+
def testAssertionTeardownSuccessfully(self):
13+
actual = "ACTUAL"
14+
15+
with DeferAssertContextManager() as da:
16+
da.assert_that(actual, equal_to("ACTUAL"))
17+
actual = ""
18+
self.assertEqual(actual, "")
19+
20+
def testAssertionErrorShouldTeardownBeforeRaiseExeption(self):
21+
self.maxDiff = None
22+
expected = "EXPECTED"
23+
actual = "ACTUAL"
24+
25+
expectedMessage = "\nExpected: 'EXPECTED'\n but: was 'ACTUAL'\n"
26+
27+
with self.assertRaises(AssertionError) as e:
28+
with DeferAssertContextManager() as da:
29+
da.assert_that(actual, equal_to(expected))
30+
actual = ""
31+
self.assertEqual(actual, "")
32+
self.assertEqual(expectedMessage, str(e.exception))
33+
34+
35+
def testAssertionErrorShouldRaiseExceptionBeforeExitingContext(self):
36+
self.maxDiff = None
37+
expected = "EXPECTED"
38+
actual = "ACTUAL"
39+
40+
expectedMessage = "\nExpected: 'EXPECTED'\n but: was 'ACTUAL'\n"
41+
42+
with self.assertRaises(AssertionError) as e:
43+
with DeferAssertContextManager() as da:
44+
da.assert_that(actual, equal_to(expected))
45+
actual = ""
46+
self.assertNotEqual(actual, "")
47+
self.assertEqual(expectedMessage, str(e.exception))
48+
49+
50+
51+
if __name__ == "__main__":
52+
unittest.main()

0 commit comments

Comments
 (0)