diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-02-20 23:13:37 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-02-20 23:13:37 +0100 |
commit | 409ef997e2ff99b2bbea89ea61d10fc8e26dac96 (patch) | |
tree | 103225ce6af074120731ce9bb3c16a3778687d6c /asl | |
parent | 6fd19d6dfe2c9780ce268de4205300ede4a16b89 (diff) |
Add customizable assert failure handler
Diffstat (limited to 'asl')
-rw-r--r-- | asl/base/assert.cpp | 18 | ||||
-rw-r--r-- | asl/base/assert.hpp | 6 | ||||
-rw-r--r-- | asl/testing/testing.cpp | 14 | ||||
-rw-r--r-- | asl/testing/testing.hpp | 6 |
4 files changed, 33 insertions, 11 deletions
diff --git a/asl/base/assert.cpp b/asl/base/assert.cpp index 2383e9e..c3e0c69 100644 --- a/asl/base/assert.cpp +++ b/asl/base/assert.cpp @@ -1,12 +1,18 @@ #include "asl/base/assert.hpp" -// #include "asl/io/print.hpp" +static asl::AssertFailureHandler* s_handler = nullptr; +static void* s_user = nullptr; + +void asl::set_assert_failure_handler(AssertFailureHandler handler, void* user) +{ + s_handler = handler; + s_user = user; +} void asl::report_assert_failure(const char* msg, const source_location& sl) { - // @Todo(org) - // eprint("------------------------------------------------------------\n"); - // eprint("Assertion failure at {}, line {}:\n", sl.file, sl.line); - // eprint("{}\n", msg); - // eprint("------------------------------------------------------------\n"); + if (s_handler != nullptr) + { + s_handler(msg, sl, s_user); + } } diff --git a/asl/base/assert.hpp b/asl/base/assert.hpp index 42e8635..d23e897 100644 --- a/asl/base/assert.hpp +++ b/asl/base/assert.hpp @@ -6,6 +6,10 @@ namespace asl { +using AssertFailureHandler = void (const char* msg, const source_location&, void* user); + +void set_assert_failure_handler(AssertFailureHandler handler, void* user); + void report_assert_failure(const char* msg, const source_location& sl = source_location{}); } // namespace asl @@ -16,6 +20,8 @@ void report_assert_failure(const char* msg, const source_location& sl = source_l #define ASL_DEBUG_BREAK() __builtin_debugtrap() #endif +// @Todo Configure asserts at build time + #define ASL_ASSERT(...) \ if (__VA_ARGS__) {} \ else \ diff --git a/asl/testing/testing.cpp b/asl/testing/testing.cpp index 623d87b..a4eecd7 100644 --- a/asl/testing/testing.cpp +++ b/asl/testing/testing.cpp @@ -21,21 +21,31 @@ void asl::testing::register_test(Test* test) static bool g_current_test_fail = false; -void asl::testing::report_failure(const char* msg, const char* file, int line) +void asl::testing::report_failure(const char* msg, const asl::source_location& sl) { asl::eprint("--------------------------------------------------------------\n"); - asl::eprint("Test assertion failed at {}, line {}:\n", file, line); + asl::eprint("Test assertion failed at {}, line {}:\n", sl.file, sl.line); asl::eprint(" {}\n", msg); asl::eprint("--------------------------------------------------------------\n"); g_current_test_fail = true; } +static void report_assert_failure(const char* msg, const asl::source_location& sl, void*) +{ + asl::eprint("------------------------------------------------------------\n"); + asl::eprint("Assertion failure at {}, line {}:\n", sl.file, sl.line); + asl::eprint("{}\n", msg); + asl::eprint("------------------------------------------------------------\n"); +} + #define RESET "\x1b[0m" #define RED(S) "\x1b[0;31m" S RESET #define GREEN(S) "\x1b[0;32m" S RESET int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[]) { + asl::set_assert_failure_handler(report_assert_failure, nullptr); + int fail = 0; int pass = 0; diff --git a/asl/testing/testing.hpp b/asl/testing/testing.hpp index b47c416..c3214a5 100644 --- a/asl/testing/testing.hpp +++ b/asl/testing/testing.hpp @@ -9,7 +9,7 @@ struct Test; void register_test(Test*); -void report_failure(const char* msg, const char* file, int line); +void report_failure(const char* msg, const asl::source_location& = asl::source_location{}); using TestFunction = void(); @@ -39,8 +39,8 @@ struct Test #define ASL_TEST_ASSERT(EXPR) \ if (EXPR) {} \ - else { ::asl::testing::report_failure(#EXPR, __FILE__, __LINE__); return; } + else { ::asl::testing::report_failure(#EXPR); return; } #define ASL_TEST_EXPECT(EXPR) \ if (EXPR) {} \ - else { ::asl::testing::report_failure(#EXPR, __FILE__, __LINE__); } + else { ::asl::testing::report_failure(#EXPR); } |