diff --git a/Userland/Libraries/LibTest/TestRunner.h b/Userland/Libraries/LibTest/TestRunner.h index 558de184086..f91590bd99a 100644 --- a/Userland/Libraries/LibTest/TestRunner.h +++ b/Userland/Libraries/LibTest/TestRunner.h @@ -55,6 +55,7 @@ protected: virtual Vector get_test_paths() const = 0; virtual void do_run_single_test(const String&) = 0; + virtual const Vector* get_failed_test_names() const { return nullptr; } String m_test_root; bool m_print_times; @@ -214,6 +215,9 @@ inline void TestRunner::print_test_results() const } else { outln("{:>.3}s", m_total_elapsed_time_in_ms / 1000.0); } + if (auto* failed_tests = get_failed_test_names(); failed_tests && !failed_tests->is_empty()) { + outln("Failed tests: {}", *failed_tests); + } outln(); } diff --git a/Userland/Utilities/run-tests.cpp b/Userland/Utilities/run-tests.cpp index efc5b29111f..a4d721fc2ff 100644 --- a/Userland/Utilities/run-tests.cpp +++ b/Userland/Utilities/run-tests.cpp @@ -48,6 +48,7 @@ public: protected: virtual void do_run_single_test(const String& test_path) override; virtual Vector get_test_paths() const override; + virtual const Vector* get_failed_test_names() const override { return &m_failed_test_names; } virtual FileResult run_test_file(const String& test_path); @@ -57,6 +58,7 @@ protected: NonnullRefPtr m_config; Vector m_skip_directories; Vector m_skip_files; + Vector m_failed_test_names; Regex m_skip_regex; bool m_print_all_output { false }; }; @@ -120,6 +122,7 @@ void TestRunner::do_run_single_test(const String& test_path) bool crashed_or_failed = test_result.result == Test::Result::Fail || test_result.result == Test::Result::Crashed; bool print_stdout_stderr = crashed_or_failed || m_print_all_output; if (crashed_or_failed) { + m_failed_test_names.append(test_path); print_modifiers({ Test::BG_RED, Test::FG_BLACK, Test::FG_BOLD }); out("{}", test_result.result == Test::Result::Fail ? " FAIL " : "CRASHED"); print_modifiers({ Test::CLEAR });