Iros
 
Loading...
Searching...
No Matches
unit_test.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/util/prelude.h"
6
7namespace iris::test {
8using TestCaseFunction = void (*)();
9
10class TestCase {
11public:
14 : m_suite_name(di::move(suite_name)), m_case_name(di::move(case_name)), m_function(function) {}
15
16 constexpr auto suite_name() const -> di::TransparentStringView { return m_suite_name; }
17 constexpr auto case_name() const -> di::TransparentStringView { return m_case_name; }
18
19 constexpr void execute() const { m_function(); }
20
21private:
22 constexpr friend auto operator==(TestCase const& a, TestCase const& b) -> bool {
23 return di::make_tuple(a.suite_name(), a.case_name()) == di::make_tuple(b.suite_name(), b.case_name());
24 }
25
26 constexpr friend auto operator<=>(TestCase const& a, TestCase const& b) -> di::strong_ordering {
27 return di::make_tuple(a.suite_name(), a.case_name()) <=> di::make_tuple(b.suite_name(), b.case_name());
28 }
29
30 di::TransparentStringView m_suite_name;
31 di::TransparentStringView m_case_name;
32 TestCaseFunction m_function;
33};
34
36public:
37 static auto the() -> TestManager&;
38
40 void run_tests();
41
42private:
43 di::Vector<TestCase> m_test_cases;
44};
45}
46
47#define IRIS_TEST(suite_name, case_name) \
48 static void suite_name##_##case_name(); \
49 static void register_##suite_name##_##case_name() { \
50 iris::test::TestManager::the().register_test_case( \
51 iris::test::TestCase("" #suite_name ""_tsv, "" #case_name ""_tsv, suite_name##_##case_name)); \
52 } \
53 [[maybe_unused]] [[gnu::section(".unit_test_init_array")]] static void ( \
54 *__unit_test_##suite_name##_##case_name)() = register_##suite_name##_##case_name; \
55 static void suite_name##_##case_name() { \
56 case_name(); \
57 }
58
59#define TEST IRIS_TEST
Definition vector_forward_declaration.h:8
Definition unit_test.h:10
constexpr TestCase(di::TransparentStringView suite_name, di::TransparentStringView case_name, TestCaseFunction function)
Definition unit_test.h:12
constexpr auto suite_name() const -> di::TransparentStringView
Definition unit_test.h:16
constexpr auto case_name() const -> di::TransparentStringView
Definition unit_test.h:17
constexpr friend auto operator==(TestCase const &a, TestCase const &b) -> bool
Definition unit_test.h:22
constexpr friend auto operator<=>(TestCase const &a, TestCase const &b) -> di::strong_ordering
Definition unit_test.h:26
constexpr void execute() const
Definition unit_test.h:19
Definition unit_test.h:35
void run_tests()
Definition unit_test.cpp:28
void register_test_case(TestCase)
Definition unit_test.cpp:10
static auto the() -> TestManager &
Definition unit_test.cpp:6
string::StringViewImpl< string::TransparentEncoding > TransparentStringView
Definition string_view.h:13
Definition as_bool.h:8
Definition zstring_parser.h:9
constexpr auto make_tuple(Args &&... args)
Definition make_tuple.h:9
Definition unit_test.cpp:5
void(*)() TestCaseFunction
Definition unit_test.h:8