summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/fud_assert.hpp13
-rw-r--r--source/fud_assert.cpp19
-rw-r--r--test/.clang-tidy2
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/test_assert.cpp29
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