13 static auto the() -> TestManager& {
14 static TestManager s_the;
34 "Output a simple machine readable list of test cases"_sv)
35 .option<&Args::suite_name>(
's',
"suite"_tsv,
"Specifc test suite to run"_sv)
36 .option<&
Args::case_name>(
't',
"test-case"_tsv,
"Specific case to run in the format ([suite:]case)"_sv);
41 auto [list_simple, suite_name, case_name, _] = args;
44 if (suite_name && *suite_name != test_case.suite_name()) {
48 auto [colon_it, colon_it_end] = case_name->find(
':');
49 if (colon_it != colon_it_end) {
50 return test_case.suite_name() != case_name->substr(case_name->begin(), colon_it) ||
51 test_case.case_name() != case_name->substr(colon_it_end);
53 return test_case.case_name() != *case_name;
57 m_test_cases.erase(first_to_remove, last_to_remove);
59 if (m_test_cases.empty() && (suite_name || case_name)) {
61 m_writer,
"No test cases match filter: [suite={}] [case={}]"_sv, suite_name, case_name);
66 for (
auto& test_case : m_test_cases) {
68 test_case.case_name());
73 execute_remaining_tests();
80 print_failure_message();
81 ++m_current_test_index;
88 void print_failure_message() {
89 auto& test_case = m_test_cases[m_current_test_index];
91 m_writer,
"{}: {}: {}"_sv,
di::Styled(
"FAIL"_sv, di::FormatEffect::Bold | di::FormatColor::Red),
92 di::Styled(test_case.suite_name(), di::FormatEffect::Bold), test_case.case_name());
96 void print_success_message() {
97 auto& test_case = m_test_cases[m_current_test_index];
100 m_writer,
"{}: {}: {}"_sv,
di::Styled(
"PASS"_sv, di::FormatEffect::Bold | di::FormatColor::Green),
101 di::Styled(test_case.suite_name(), di::FormatEffect::Bold), test_case.case_name());
105 void run_current_test() {
106 auto& test_case = m_test_cases[m_current_test_index];
108 print_success_message();
111 void execute_remaining_tests() {
112 while (m_current_test_index < m_test_cases.size()) {
114 m_current_test_index++;
119 void final_report() {
120 auto tests_skipped = m_test_cases.size() - m_current_test_index;
123 di::Styled(m_success_count, di::FormatEffect::Bold),
124 di::Styled(m_test_cases.size(), di::FormatEffect::Bold));
127 di::Styled(m_fail_count, di::FormatEffect::Bold),
128 di::Styled(tests_skipped, di::FormatEffect::Bold));
132 m_fail_count ? di::Styled(
"Tests Failed"_sv, di::FormatEffect::Bold | di::FormatColor::Red)
133 : di::Styled(
"Tests Passed"_sv, di::FormatEffect::Bold | di::FormatColor::Green));
135 auto result = int(m_fail_count > 0);
137 m_did_finish(result);
141 di::Function<void(
int)> m_did_finish;
142 di::Vector<TestCase> m_test_cases;
143 usize m_current_test_index { 0 };
144 usize m_fail_count { 0 };
145 usize m_success_count { 0 };
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition function.h:365
Definition test_manager.h:11
void register_test_case(TestCase test_case)
Definition test_manager.h:18
void set_did_finish(di::Function< void(i32)> did_finish)
Definition test_manager.h:22
auto is_test_application() const -> bool
Definition test_manager.h:78
void handle_assertion_failure()
Definition test_manager.h:79
void set_writer(di::Any< di::Writer > writer)
Definition test_manager.h:20
auto run_tests(Args &args) -> di::Result< void >
Definition test_manager.h:40
static auto the() -> TestManager &
Definition test_manager.h:13
Definition optional_forward_declaration.h:5
Definition unexpected.h:14
meta::Type< AnyT< UserInterface, Storage, VTablePolicy > > Any
Definition any.h:302
constexpr auto remove_if
Definition remove_if.h:38
size_t usize
Definition integers.h:33
__INT32_TYPE__ i32
Definition integers.h:16
Expected< T, Error > Result
Definition result.h:8
constexpr auto writer_print
Definition writer_print.h:20
constexpr auto writer_println
Definition writer_println.h:21
constexpr auto cli_parser(StringView app_name, StringView description)
Definition parser.h:331
Definition test_manager.h:24
bool help
Definition test_manager.h:28
di::Optional< di::TransparentStringView > case_name
Definition test_manager.h:27
di::Optional< di::TransparentStringView > suite_name
Definition test_manager.h:26
static constexpr auto get_cli_parser()
Definition test_manager.h:30
bool list_simple
Definition test_manager.h:25