Skip to content

Commit edf057e

Browse files
Add assert almost equal macros (#4)
* Add assert almost equal macros * Fix linux compiler error
1 parent 5da3398 commit edf057e

File tree

4 files changed

+69
-3
lines changed

4 files changed

+69
-3
lines changed

src/amulet/test_utils/test_utils.hpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ std::string cast_to_string(const T& obj)
1414
}
1515
}
1616

17-
#define _ASSERT_COMPARE(CLS, A, B, OP) \
17+
#define _ASSERT_COMPARE_2(CLS, A, B, OP_FUNC, OP) \
1818
{ \
1919
CLS assert_comp_a = [&]() { \
2020
try { \
@@ -48,10 +48,10 @@ std::string cast_to_string(const T& obj)
4848
throw std::runtime_error(assert_comp_msg); \
4949
} \
5050
}(); \
51-
if (!(assert_comp_a OP assert_comp_b)) { \
51+
if (!(OP_FUNC)) { \
5252
std::string assert_comp_msg; \
5353
assert_comp_msg.reserve(200); \
54-
assert_comp_msg += "A " #OP " B failed in file "; \
54+
assert_comp_msg += "A " OP " B failed in file "; \
5555
assert_comp_msg += __FILE__; \
5656
assert_comp_msg += " at line "; \
5757
assert_comp_msg += std::to_string(__LINE__); \
@@ -68,6 +68,8 @@ std::string cast_to_string(const T& obj)
6868
} \
6969
}
7070

71+
#define _ASSERT_COMPARE(CLS, A, B, OP) _ASSERT_COMPARE_2(CLS, A, B, assert_comp_a OP assert_comp_b, #OP)
72+
7173
#define ASSERT_EQUAL(CLS, A, B) _ASSERT_COMPARE(CLS, A, B, ==)
7274
#define ASSERT_NOT_EQUAL(CLS, A, B) _ASSERT_COMPARE(CLS, A, B, !=)
7375
#define ASSERT_LESS(CLS, A, B) _ASSERT_COMPARE(CLS, A, B, <)
@@ -103,3 +105,8 @@ std::string cast_to_string(const T& obj)
103105
throw std::runtime_error(assert_raise_msg); \
104106
} \
105107
}
108+
109+
#define ASSERT_ALMOST_EQUAL_2(CLS, A, B, ERR) _ASSERT_COMPARE_2(CLS, A, B, std::abs(assert_comp_a - assert_comp_b) <= ERR, "")
110+
#define ASSERT_ALMOST_EQUAL(CLS, A, B) ASSERT_ALMOST_EQUAL_2(CLS, A, B, 0.000001)
111+
#define ASSERT_NOT_ALMOST_EQUAL_2(CLS, A, B, ERR) _ASSERT_COMPARE_2(CLS, A, B, std::abs(assert_comp_a - assert_comp_b) > ERR, "")
112+
#define ASSERT_NOT_ALMOST_EQUAL(CLS, A, B) ASSERT_NOT_ALMOST_EQUAL_2(CLS, A, B, 0.000001)

tests/test_amulet_test_utils/_test_test_utils.py.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,22 @@ static void test_assert_raises_3() {
7373
ASSERT_RAISES(std::runtime_error, throw std::invalid_argument(""))
7474
}
7575

76+
static void test_assert_almost_equal(double a, double b){
77+
ASSERT_ALMOST_EQUAL(double, a, b);
78+
}
79+
80+
static void test_assert_almost_equal_2(double a, double b, double err){
81+
ASSERT_ALMOST_EQUAL_2(double, a, b, err);
82+
}
83+
84+
static void test_assert_not_almost_equal(double a, double b){
85+
ASSERT_NOT_ALMOST_EQUAL(double, a, b);
86+
}
87+
88+
static void test_assert_not_almost_equal_2(double a, double b, double err){
89+
ASSERT_NOT_ALMOST_EQUAL_2(double, a, b, err);
90+
}
91+
7692
PYBIND11_MODULE(_test_test_utils, m)
7793
{
7894
m.def("test_assert_equal_1", &test_assert_equal_1);
@@ -89,4 +105,8 @@ PYBIND11_MODULE(_test_test_utils, m)
89105
m.def("test_assert_raises_1", &test_assert_raises_1);
90106
m.def("test_assert_raises_2", &test_assert_raises_2);
91107
m.def("test_assert_raises_3", &test_assert_raises_3);
108+
m.def("test_assert_almost_equal", &test_assert_almost_equal);
109+
m.def("test_assert_almost_equal_2", &test_assert_almost_equal_2);
110+
m.def("test_assert_not_almost_equal", &test_assert_not_almost_equal);
111+
m.def("test_assert_not_almost_equal_2", &test_assert_not_almost_equal_2);
92112
}

tests/test_amulet_test_utils/_test_test_utils.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ def test_assert_greater_equal(a: int, b: int) -> None: ...
1212
def test_assert_raises_1() -> None: ...
1313
def test_assert_raises_2() -> None: ...
1414
def test_assert_raises_3() -> None: ...
15+
def test_assert_almost_equal(a: float, b: float) -> None: ...
16+
def test_assert_almost_equal_2(a: float, b: float, err: float) -> None: ...
17+
def test_assert_not_almost_equal(a: float, b: float) -> None: ...
18+
def test_assert_not_almost_equal_2(a: float, b: float, err: float) -> None: ...

tests/test_amulet_test_utils/test_test_utils.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,38 @@ def test_assert_raises(self) -> None:
6868
test_assert_raises_2()
6969
with self.assertRaises(RuntimeError):
7070
test_assert_raises_3()
71+
72+
def test_almost_equal(self) -> None:
73+
from test_amulet_test_utils._test_test_utils import (
74+
test_assert_almost_equal,
75+
test_assert_almost_equal_2,
76+
test_assert_not_almost_equal,
77+
test_assert_not_almost_equal_2
78+
)
79+
test_assert_almost_equal(5.5, 5.50000001)
80+
test_assert_almost_equal(5.50000001, 5.5)
81+
with self.assertRaises(RuntimeError):
82+
test_assert_almost_equal(5.5, 5.50001)
83+
with self.assertRaises(RuntimeError):
84+
test_assert_almost_equal(5.50001, 5.5)
85+
86+
test_assert_almost_equal_2(5.5, 5.501, 0.01)
87+
test_assert_almost_equal_2(5.501, 5.5, 0.01)
88+
with self.assertRaises(RuntimeError):
89+
test_assert_almost_equal_2(5.5, 5.52, 0.01)
90+
with self.assertRaises(RuntimeError):
91+
test_assert_almost_equal_2(5.52, 5.5, 0.01)
92+
93+
test_assert_not_almost_equal(5.5, 5.501)
94+
test_assert_not_almost_equal(5.501, 5.5)
95+
with self.assertRaises(RuntimeError):
96+
test_assert_not_almost_equal(5.5, 5.50000001)
97+
with self.assertRaises(RuntimeError):
98+
test_assert_not_almost_equal(5.50000001, 5.5)
99+
100+
test_assert_not_almost_equal_2(5.5, 6.6, 1)
101+
test_assert_not_almost_equal_2(6.6, 5.5, 1)
102+
with self.assertRaises(RuntimeError):
103+
test_assert_not_almost_equal_2(5.5, 5.6, 1)
104+
with self.assertRaises(RuntimeError):
105+
test_assert_not_almost_equal_2(5.6, 5.5, 1)

0 commit comments

Comments
 (0)