diff --git a/tests/test-jinja.cpp b/tests/test-jinja.cpp index 9208ff4ac9..316c67697f 100644 --- a/tests/test-jinja.cpp +++ b/tests/test-jinja.cpp @@ -2165,8 +2165,7 @@ static void test_template_cpp(testing & t, const std::string & name, const std:: t.log("Actual : " + json(rendered).dump()); } } catch (const jinja::not_implemented_exception & e) { - // TODO @ngxson : remove this when the test framework supports skipping tests - t.log("Skipped: " + std::string(e.what())); + t.skip(e.what()); } }); } diff --git a/tests/testing.h b/tests/testing.h index 79494834a6..5fb43a1948 100644 --- a/tests/testing.h +++ b/tests/testing.h @@ -21,6 +21,11 @@ struct testing { int failures = 0; int unnamed = 0; int exceptions = 0; + int skipped = 0; + + // set by skip(), consumed by the innermost enclosing test() + bool skip_current = false; + std::string skip_reason; static constexpr std::size_t status_column = 80; @@ -78,7 +83,12 @@ struct testing { } } - void print_result(const std::string &label, int new_failures, int new_assertions, const std::string &extra = "") const { + void skip(const std::string &reason = "") { + skip_current = true; + skip_reason = reason; + } + + void print_result(const std::string &label, int new_failures, int new_assertions, const std::string &extra = "", bool was_skipped = false) const { std::string line = indent() + label; std::string details; @@ -101,7 +111,7 @@ struct testing { line += " (" + details + ")"; } - std::string status = (new_failures == 0) ? "[PASS]" : "[FAIL]"; + std::string status = new_failures != 0 ? "[FAIL]" : (was_skipped ? "[SKIP]" : "[PASS]"); if (line.size() + 1 < status_column) { line.append(status_column - line.size(), ' '); @@ -126,12 +136,26 @@ struct testing { int before_failures = failures; int before_assertions = assertions; + // save/restore, so that a skipped subtest does not mark its parent as skipped + bool outer_skip = skip_current; + std::string outer_skip_reason = skip_reason; + skip_current = false; + skip_reason.clear(); + run_with_exceptions([&] { f(*this); }, "test"); int new_failures = failures - before_failures; int new_assertions = assertions - before_assertions; - print_result(name, new_failures, new_assertions); + bool was_skipped = skip_current && new_failures == 0; + if (was_skipped) { + ++skipped; + } + + print_result(name, new_failures, new_assertions, was_skipped ? skip_reason : "", was_skipped); + + skip_current = outer_skip; + skip_reason = outer_skip_reason; stack.pop_back(); } @@ -238,6 +262,7 @@ struct testing { out << "assertions : " << assertions << "\n"; out << "failures : " << failures << "\n"; out << "exceptions : " << exceptions << "\n"; + out << "skipped : " << skipped << "\n"; return failures == 0 ? 0 : 1; } };