diff --git a/src/Ensure.hpp b/src/Ensure.hpp index dca3240..6235f73 100644 --- a/src/Ensure.hpp +++ b/src/Ensure.hpp @@ -13,6 +13,41 @@ throw ArbUt::__ErrorHelpers::CreateEnsureError(#expr, std::source_location::current()); \ } +#define EnsureEquals(a, b) \ + if ((a) != (b)) { \ + std::stringstream error_ss; \ + error_ss << a << " was not equal to " << b; \ + throw ArbUt::__ErrorHelpers::CreateEnsureError(error_ss.str().c_str(), std::source_location::current()); \ + } + +#define EnsureGreater(a, b) \ + if ((a) <= (b)) { \ + std::stringstream error_ss; \ + error_ss << a << " was not equal to " << b; \ + throw ArbUt::__ErrorHelpers::CreateEnsureError(error_ss.str().c_str(), std::source_location::current()); \ + } + +#define EnsureGreaterOrEquals(a, b) \ + if ((a) < (b)) { \ + std::stringstream error_ss; \ + error_ss << a << " was not equal to " << b; \ + throw ArbUt::__ErrorHelpers::CreateEnsureError(error_ss.str().c_str(), std::source_location::current()); \ + } + +#define EnsureLess(a, b) \ + if ((a) >= (b)) { \ + std::stringstream error_ss; \ + error_ss << a << " was not equal to " << b; \ + throw ArbUt::__ErrorHelpers::CreateEnsureError(error_ss.str().c_str(), std::source_location::current()); \ + } + +#define EnsureLessOrEquals(a, b) \ + if ((a) > (b)) { \ + std::stringstream error_ss; \ + error_ss << a << " was not equal to " << b; \ + throw ArbUt::__ErrorHelpers::CreateEnsureError(error_ss.str().c_str(), std::source_location::current()); \ + } + /// @brief Ensures an expression is true for a range. The value in the range can be retrieved using ``item``. /// @ingroup Ensure #define EnsureForEach(iterator, assertion) \ @@ -23,6 +58,11 @@ #else // Ensure is empty if NO_ENSURE is defined. #define Ensure(expr) ; +#define EnsureEquals(a, b) ; +#define EnsureGreater(a, b) ; +#define EnsureGreaterOrEquals(a, b) ; +#define EnsureLess(a, b) ; +#define EnsureLessOrEquals(a, b) ; #define EnsureForEach(iterator, assertion) ; #endif diff --git a/tests/EnsureTests.cpp b/tests/EnsureTests.cpp index df64148..3f04c42 100644 --- a/tests/EnsureTests.cpp +++ b/tests/EnsureTests.cpp @@ -1,7 +1,12 @@ #include #include "../src/Ensure.hpp" void TestWrapper(bool wrapperExpression) { Ensure(wrapperExpression) } -void TestWrapperNotNull(void* value){EnsureNotNull(value)} +void TestWrapperNotNull(void* value) { EnsureNotNull(value) } +void TestWrapperEquals(int32_t a, int32_t b) { EnsureEquals(a, b) } +void TestWrapperGreater(int32_t a, int32_t b) { EnsureGreater(a, b) } +void TestWrapperGreaterEquals(int32_t a, int32_t b) { EnsureGreaterOrEquals(a, b) } +void TestWrapperLess(int32_t a, int32_t b) { EnsureLess(a, b) } +void TestWrapperLessEquals(int32_t a, int32_t b){EnsureLessOrEquals(a, b)} TEST_CASE("Ensure succeeds if true") { REQUIRE_NOTHROW(TestWrapper(true)); @@ -19,6 +24,36 @@ TEST_CASE("Ensure throws if false with message") { throw ArbUt::Exception("Didn't throw."); } +TEST_CASE("Ensure equals true") { REQUIRE_NOTHROW(TestWrapperEquals(10, 10)); } + +TEST_CASE("Ensure equals throws if false") { REQUIRE_THROWS(TestWrapperEquals(5, 10)); } + +TEST_CASE("Ensure greater true") { REQUIRE_NOTHROW(TestWrapperGreater(10, 5)); } + +TEST_CASE("Ensure greater throws if less than") { REQUIRE_THROWS(TestWrapperGreater(5, 10)); } + +TEST_CASE("Ensure greater throws if equals") { REQUIRE_THROWS(TestWrapperGreater(10, 10)); } + +TEST_CASE("Ensure greater or equals true") { + REQUIRE_NOTHROW(TestWrapperGreaterEquals(10, 5)); + REQUIRE_NOTHROW(TestWrapperGreaterEquals(10, 10)); +} + +TEST_CASE("Ensure greater or equals throws if less than") { REQUIRE_THROWS(TestWrapperGreaterEquals(5, 10)); } + +TEST_CASE("Ensure less true") { REQUIRE_NOTHROW(TestWrapperLess(5, 10)); } + +TEST_CASE("Ensure less throws if less than") { REQUIRE_THROWS(TestWrapperLess(10, 5)); } + +TEST_CASE("Ensure less throws if equals") { REQUIRE_THROWS(TestWrapperLess(10, 10)); } + +TEST_CASE("Ensure less or equals true") { + REQUIRE_NOTHROW(TestWrapperLessEquals(5, 10)); + REQUIRE_NOTHROW(TestWrapperLessEquals(10, 10)); +} + +TEST_CASE("Ensure less or equals throws if less than") { REQUIRE_THROWS(TestWrapperLessEquals(10, 5)); } + TEST_CASE("Multiple asserts"){Ensure(true) Ensure(true) Ensure(true)} TEST_CASE("EnsureNotNull throws if nullptr") {