feat: test executables will exit with failing code if any tests fails
Some checks failed
continuous-integration/drone/pr Build is failing
Some checks failed
continuous-integration/drone/pr Build is failing
This commit is contained in:
parent
5f1c65d72d
commit
c76d6e8019
2 changed files with 58 additions and 37 deletions
|
@ -26,6 +26,62 @@ concept test = requires(T test) {
|
|||
} // namespace concepts
|
||||
|
||||
|
||||
namespace details {
|
||||
|
||||
|
||||
class Registry
|
||||
{
|
||||
public:
|
||||
using Suite = void (*)();
|
||||
|
||||
static void register_suite(Suite suite)
|
||||
{
|
||||
instance().m_suites.emplace_back(suite);
|
||||
}
|
||||
|
||||
static auto run_all() -> int32_t
|
||||
{
|
||||
for (auto &test : instance().m_suites)
|
||||
{
|
||||
test();
|
||||
}
|
||||
|
||||
std::cout << "_________________________[TEST RESULTS]_________________________";
|
||||
std::cout << "Ran " << instance().m_failed_count + instance().m_pasesed_count << " tests:\n"
|
||||
<< "Passed: " << instance().m_pasesed_count << '\n'
|
||||
<< "Failed: " << instance().m_failed_count << '\n';
|
||||
|
||||
return instance().m_failed_count;
|
||||
}
|
||||
|
||||
static void increment_passed_count()
|
||||
{
|
||||
++instance().m_pasesed_count;
|
||||
}
|
||||
|
||||
static void increment_failed_count()
|
||||
{
|
||||
++instance().m_failed_count;
|
||||
}
|
||||
|
||||
private:
|
||||
Registry() = default;
|
||||
|
||||
[[nodiscard]] static auto instance() -> Registry &
|
||||
{
|
||||
static auto registry = Registry {};
|
||||
return registry;
|
||||
}
|
||||
|
||||
std::vector<void (*)()> m_suites;
|
||||
|
||||
int32_t m_pasesed_count {};
|
||||
int32_t m_failed_count {};
|
||||
};
|
||||
|
||||
|
||||
} // namespace details
|
||||
|
||||
struct Case
|
||||
{
|
||||
auto operator=(std::invocable auto test) -> void // NOLINT
|
||||
|
@ -40,6 +96,7 @@ struct Case
|
|||
{
|
||||
std::cout << " --> FAIL !" << '\n';
|
||||
std::cout << exp.what() << "\n\n";
|
||||
details::Registry::increment_failed_count();
|
||||
return; // TODO(Light): Should we run the remaining tests after a failure?
|
||||
}
|
||||
|
||||
|
@ -49,42 +106,6 @@ struct Case
|
|||
std::string_view name;
|
||||
};
|
||||
|
||||
namespace details {
|
||||
|
||||
|
||||
class Registry
|
||||
{
|
||||
public:
|
||||
using Suite = void (*)();
|
||||
|
||||
static void register_suite(Suite suite)
|
||||
{
|
||||
instance().m_suites.emplace_back(suite);
|
||||
}
|
||||
|
||||
static void run_all()
|
||||
{
|
||||
for (auto &test : instance().m_suites)
|
||||
{
|
||||
test();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Registry() = default;
|
||||
|
||||
[[nodiscard]] static auto instance() -> Registry &
|
||||
{
|
||||
static auto registry = Registry {};
|
||||
return registry;
|
||||
}
|
||||
|
||||
std::vector<void (*)()> m_suites;
|
||||
};
|
||||
|
||||
|
||||
} // namespace details
|
||||
|
||||
struct TestSuite
|
||||
{
|
||||
template<class TSuite>
|
||||
|
|
|
@ -6,7 +6,7 @@ try
|
|||
using namespace ::lt::test;
|
||||
using namespace ::lt::test::details;
|
||||
|
||||
Registry::run_all();
|
||||
return Registry::run_all();
|
||||
}
|
||||
catch (const std::exception &exp)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue