diff options
-rw-r--r-- | include/fud_assert.hpp | 13 | ||||
-rw-r--r-- | source/fud_assert.cpp | 19 | ||||
-rw-r--r-- | test/.clang-tidy | 2 | ||||
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/test_assert.cpp | 29 |
5 files changed, 49 insertions, 15 deletions
diff --git a/include/fud_assert.hpp b/include/fud_assert.hpp index 8caf751..6b21fdc 100644 --- a/include/fud_assert.hpp +++ b/include/fud_assert.hpp @@ -18,17 +18,18 @@ #ifndef FUD_ASSERT_HPP #define FUD_ASSERT_HPP +/* TODO: Investigate stacktrace */ +// #include <stacktrace> + +#include <source_location> + namespace fud { -// clang-format off [[noreturn]] void assertFail( const char* assertion, - const char* file, - unsigned int line, - const char* function) noexcept(false); -// clang-format on + std::source_location sourceLocation = std::source_location::current()); -#define fudAssert(expr) ((expr) ? static_cast<void>(0) : assertFail(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__)) +#define fudAssert(expr) ((expr) ? static_cast<void>(0) : assertFail(#expr, std::source_location::current())) } // namespace fud diff --git a/source/fud_assert.cpp b/source/fud_assert.cpp index 9c2ec77..749aa6b 100644 --- a/source/fud_assert.cpp +++ b/source/fud_assert.cpp @@ -10,16 +10,16 @@ namespace fud { -void assertFail(const char* assertion, const char* file, unsigned int line, const char* function) noexcept(false) +[[noreturn]] void assertFail(const char* assertion, const std::source_location sourceLocation) { constexpr size_t MAX_FILE_CHARS = 256; constexpr size_t MAX_FUNCTION_CHARS = 256; constexpr size_t BITS_PER_OCTAL = 3; - constexpr auto MAX_LINE_CHARS = BITS_PER_OCTAL * sizeof(decltype(line)) + 3; + constexpr auto MAX_LINE_CHARS = BITS_PER_OCTAL * sizeof(decltype(sourceLocation.line())) + 3; constexpr size_t MAX_ASSERT_CHARS = 512 - MAX_LINE_CHARS; constexpr size_t ASSERT_MSG_SIZE = MAX_FILE_CHARS + MAX_LINE_CHARS + MAX_FUNCTION_CHARS + MAX_ASSERT_CHARS; - auto lengthResult = cStringLength(file); + auto lengthResult = cStringLength(sourceLocation.file_name()); size_t filenameLength = 0; auto badLength = lengthResult < 1 || lengthResult > SSIZE_MAX; if (!badLength) { @@ -32,7 +32,7 @@ void assertFail(const char* assertion, const char* file, unsigned int line, cons filenameLength = sizeof(invalidFile); filename = invalidFile; } else if (filenameLength > MAX_LINE_CHARS) { - filename = file + filenameLength - MAX_LINE_CHARS; + filename = sourceLocation.file_name() + filenameLength - MAX_LINE_CHARS; filenameLength = MAX_FILE_CHARS; } @@ -40,14 +40,15 @@ void assertFail(const char* assertion, const char* file, unsigned int line, cons // clang-format off static_cast<void>(std::format_to_n( buffer.data(), buffer.size() - 1U, - "{:.{}s}:{}: {:.{}s}: Assertion `{:.{}s}` failed", + "{:.{}s}:{}: {:.{}s}: Assertion `{:.{}s}` failed\n", filename, filenameLength, - line, - function, MAX_FUNCTION_CHARS, + sourceLocation.line(), + sourceLocation.function_name(), MAX_FUNCTION_CHARS, assertion, MAX_ASSERT_CHARS)); // clang-format on - - throw std::runtime_error(buffer.data()); + buffer[buffer.size() - 1] = '\0'; + fputs(buffer.data(), stderr); + std::abort(); } } // namespace fud diff --git a/test/.clang-tidy b/test/.clang-tidy new file mode 100644 index 0000000..97da183 --- /dev/null +++ b/test/.clang-tidy @@ -0,0 +1,2 @@ +Checks: -readability-function-cognitive-complexity +InheritParentConfig: true diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 19a5b98..a79bc40 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -53,6 +53,7 @@ function(fud_add_test test_name) endfunction() fud_add_test(test_fud SOURCES test_fud.cpp) +fud_add_test(test_assert SOURCES test_assert.cpp) fud_add_test(test_result SOURCES test_result.cpp) fud_add_test(test_string SOURCES test_string.cpp) fud_add_test(test_sqlite SOURCES test_sqlite.cpp) diff --git a/test/test_assert.cpp b/test/test_assert.cpp new file mode 100644 index 0000000..41cd20f --- /dev/null +++ b/test/test_assert.cpp @@ -0,0 +1,29 @@ +/* + * libfud + * Copyright 2024 Dominick Allen + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "fud_assert.hpp" + +#include "gtest/gtest.h" + +namespace fud { + +TEST(FudTest, FudFud) +{ + EXPECT_EXIT(fudAssert(false), ::testing::KilledBySignal(SIGABRT), ".*"); +} + +} // namespace fud |