srctree

Robin Linden parent f677fb8b 29eb6d66
etest: Print failed expects/requires if supported

inlinesplit
etest/etest.cpp added: 51, removed: 4, total 47
@@ -4,6 +4,7 @@
#include <exception>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>
 
namespace etest {
@@ -23,6 +24,8 @@ std::vector<Test> &registry() {
 
struct test_failure : public std::exception {};
 
std::stringstream test_log{};
 
} // namespace
 
int run_all_tests() noexcept {
@@ -32,6 +35,7 @@ int run_all_tests() noexcept {
 
for (auto const &test : registry()) {
std::cout << std::left << std::setw(longest_name->name.size()) << test.name << ": ";
test_log = std::stringstream{};
 
const int before = assertion_failures;
 
@@ -41,8 +45,12 @@ int run_all_tests() noexcept {
++assertion_failures;
}
 
std::cout << (before == assertion_failures ?
"\u001b[32mPASSED\u001b[0m\n" : "\u001b[31;1mFAILED\u001b[0m\n");
if (before == assertion_failures) {
std::cout << "\u001b[32mPASSED\u001b[0m\n";
} else {
std::cout << "\u001b[31;1mFAILED\u001b[0m\n";
std::cout << test_log.str();
}
}
 
return assertion_failures > 0 ? 1 : 0;
@@ -53,6 +61,7 @@ int test(std::string_view name, std::function<void()> body) noexcept {
return 0;
}
 
#ifndef ETEST_WITH_SRC_LOC
void expect(bool b) noexcept {
if (!b) { ++assertion_failures; }
}
@@ -60,5 +69,26 @@ void expect(bool b) noexcept {
void require(bool b) {
if (!b) { throw test_failure{}; }
}
#else
void expect(bool b, std::source_location const &loc) noexcept {
if (!b) {
++assertion_failures;
test_log << " expectation failure at "
<< loc.file_name() << "("
<< loc.line() << ":"
<< loc.column() << ")\n";
}
}
 
void require(bool b, std::source_location const &loc) {
if (!b) {
test_log << " requirement failure at "
<< loc.file_name() << "("
<< loc.line() << ":"
<< loc.column() << ")\n";
throw test_failure{};
}
}
#endif
 
} // namespace etest
 
etest/etest.h added: 51, removed: 4, total 47
@@ -1,19 +1,36 @@
#ifndef ETEST_TEST_H_
#define ETEST_TEST_H_
 
// Clang has the header, but it doesn't yet contain std::source_location.
#if __has_include(<source_location>) && !defined(__clang__)
#define ETEST_WITH_SRC_LOC
#endif
 
#include <functional>
#include <string_view>
 
#ifdef ETEST_WITH_SRC_LOC
#include <source_location>
#endif
 
namespace etest {
 
int run_all_tests() noexcept;
int test(std::string_view name, std::function<void()> body) noexcept;
 
// Weak test requirement. Allows the test to continue even if the check fails.
#ifndef ETEST_WITH_SRC_LOC
void expect(bool) noexcept;
#else
void expect(bool, std::source_location const &loc = std::source_location::current()) noexcept;
#endif
 
// Hard test requirement. Stops the test (using an exception) if the check fails.
#ifndef ETEST_WITH_SRC_LOC
void require(bool);
#else
void require(bool, std::source_location const &loc = std::source_location::current());
#endif
 
} // namespace etest