diff --git a/docs/deprecations.md b/docs/deprecations.md index 366d6426..8dbb3956 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -29,13 +29,6 @@ method will be removed. ## Planned changes -### Output format of `--list-*` command line parameters - -The various list operations will be piped through reporters. This means -that e.g. XML reporter will write the output as machine-parseable XML, -while the Console reporter will keep the current, human-oriented output. - - ### `CHECKED_IF` and `CHECKED_ELSE` To make the `CHECKED_IF` and `CHECKED_ELSE` macros more useful, they will diff --git a/docs/release-notes.md b/docs/release-notes.md index cb389512..08c8a710 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -37,6 +37,9 @@ * `--list*` commands no longer have non-zero return code (#1410) * `--list-test-names-only` has been removed (#1190) * You should use verbosity-modifiers for `--list-tests` instead +* `--list*` commands are now piped through the reporters + * The top-level reporter interface provides default implementation that works just as the old one + * XmlReporter outputs a machine-parseable XML ### Fixes * The `INFO` macro no longer contains superfluous semicolon (#1456) diff --git a/include/reporters/catch_reporter_bases.hpp b/include/reporters/catch_reporter_bases.hpp index 7bedd086..a0ff487f 100644 --- a/include/reporters/catch_reporter_bases.hpp +++ b/include/reporters/catch_reporter_bases.hpp @@ -261,6 +261,11 @@ namespace Catch { void assertionStarting(AssertionInfo const&) override; bool assertionEnded(AssertionStats const&) override; + + // Event listeners should not use the default listing impl + void listReporters(std::vector const&, Config const&) override {} + void listTests(std::vector const&, Config const&) override {} + void listTags(std::vector const&, Config const&) override {} }; } // end namespace Catch diff --git a/include/reporters/catch_reporter_listening.cpp b/include/reporters/catch_reporter_listening.cpp index 32ee54ac..2f43b978 100644 --- a/include/reporters/catch_reporter_listening.cpp +++ b/include/reporters/catch_reporter_listening.cpp @@ -36,13 +36,13 @@ namespace Catch { } m_reporter->noMatchingTestCases( spec ); } - + void ListeningReporter::reportInvalidArguments(std::string const&arg){ for ( auto const& listener : m_listeners ) { listener->reportInvalidArguments( arg ); } m_reporter->reportInvalidArguments( arg ); - } + } #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) void ListeningReporter::benchmarkPreparing( std::string const& name ) { @@ -156,4 +156,25 @@ namespace Catch { return true; } -} // end namespace Catch \ No newline at end of file + void ListeningReporter::listReporters(std::vector const& descriptions, Config const& config) { + for (auto const& listener : m_listeners) { + listener->listReporters(descriptions, config); + } + m_reporter->listReporters(descriptions, config); + } + + void ListeningReporter::listTests(std::vector const& tests, Config const& config) { + for (auto const& listener : m_listeners) { + listener->listTests(tests, config); + } + m_reporter->listTests(tests, config); + } + + void ListeningReporter::listTags(std::vector const& tags, Config const& config) { + for (auto const& listener : m_listeners) { + listener->listTags(tags, config); + } + m_reporter->listTags(tags, config); + } + +} // end namespace Catch diff --git a/include/reporters/catch_reporter_listening.h b/include/reporters/catch_reporter_listening.h index 7fbd7af5..027f66df 100644 --- a/include/reporters/catch_reporter_listening.h +++ b/include/reporters/catch_reporter_listening.h @@ -54,6 +54,11 @@ namespace Catch { void skipTest( TestCaseInfo const& testInfo ) override; bool isMulti() const override; + void listReporters(std::vector const& descriptions, Config const& config) override; + void listTests(std::vector const& tests, Config const& config) override; + void listTags(std::vector const& tags, Config const& config) override; + + }; } // end namespace Catch diff --git a/include/reporters/catch_reporter_xml.cpp b/include/reporters/catch_reporter_xml.cpp index e110317c..8e89eb82 100644 --- a/include/reporters/catch_reporter_xml.cpp +++ b/include/reporters/catch_reporter_xml.cpp @@ -10,6 +10,7 @@ #include "../internal/catch_capture.hpp" #include "../internal/catch_reporter_registrars.hpp" +#include "../internal/catch_list.h" #if defined(_MSC_VER) #pragma warning(push) @@ -264,6 +265,64 @@ namespace Catch { } #endif // CATCH_CONFIG_ENABLE_BENCHMARKING + void XmlReporter::listReporters(std::vector const& descriptions, Config const&) { + auto outerTag = m_xml.scopedElement("AvailableReporters"); + for (auto const& reporter : descriptions) { + auto inner = m_xml.scopedElement("Reporter"); + m_xml.startElement("Name", XmlFormatting::Indent) + .writeText(reporter.name, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + m_xml.startElement("Description", XmlFormatting::Indent) + .writeText(reporter.description, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + } + } + + void XmlReporter::listTests(std::vector const& tests, Config const&) { + auto outerTag = m_xml.scopedElement("MatchingTests"); + for (auto const& test : tests) { + auto innerTag = m_xml.scopedElement("TestCase"); + auto const& testInfo = test.getTestCaseInfo(); + m_xml.startElement("Name", XmlFormatting::Indent) + .writeText(testInfo.name, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + m_xml.startElement("ClassName", XmlFormatting::Indent) + .writeText(testInfo.className, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + m_xml.startElement("Description", XmlFormatting::Indent) + .writeText(testInfo.description, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + m_xml.startElement("Tags", XmlFormatting::Indent) + .writeText(testInfo.tagsAsString(), XmlFormatting::None) + .endElement(XmlFormatting::Newline); + + auto sourceTag = m_xml.scopedElement("SourceInfo"); + m_xml.startElement("File", XmlFormatting::Indent) + .writeText(testInfo.lineInfo.file, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + m_xml.startElement("Line", XmlFormatting::Indent) + .writeText(std::to_string(testInfo.lineInfo.line), XmlFormatting::None) + .endElement(XmlFormatting::Newline); + } + } + + void XmlReporter::listTags(std::vector const& tags, Config const&) { + auto outerTag = m_xml.scopedElement("TagsFromMatchingTests"); + for (auto const& tag : tags) { + auto innerTag = m_xml.scopedElement("Tag"); + m_xml.startElement("Count", XmlFormatting::Indent) + .writeText(std::to_string(tag.count), XmlFormatting::None) + .endElement(XmlFormatting::Newline); + auto aliasTag = m_xml.scopedElement("Aliases"); + for (auto const& alias : tag.spellings) { + m_xml.startElement("Alias", XmlFormatting::Indent) + .writeText(alias, XmlFormatting::None) + .endElement(XmlFormatting::Newline); + } + } + } + + CATCH_REGISTER_REPORTER( "xml", XmlReporter ) } // end namespace Catch diff --git a/include/reporters/catch_reporter_xml.h b/include/reporters/catch_reporter_xml.h index 5b6ba310..0013d2ee 100644 --- a/include/reporters/catch_reporter_xml.h +++ b/include/reporters/catch_reporter_xml.h @@ -57,6 +57,10 @@ namespace Catch { void benchmarkFailed(std::string const&) override; #endif // CATCH_CONFIG_ENABLE_BENCHMARKING + void listReporters(std::vector const& descriptions, Config const& config) override; + void listTests(std::vector const& tests, Config const& config) override; + void listTags(std::vector const& tags, Config const& config) override; + private: Timer m_testCaseTimer; XmlWriter m_xml; diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt index d3556cee..6d068703 100644 --- a/projects/CMakeLists.txt +++ b/projects/CMakeLists.txt @@ -385,16 +385,32 @@ set_tests_properties(List::Tests::Output PROPERTIES FAIL_REGULAR_EXPRESSION "Hidden Test" ) add_test(NAME List::Tests::ExitCode COMMAND $ --list-tests --verbosity high) +add_test(NAME List::Tests::XmlOutput COMMAND $ --list-tests --verbosity high -r xml) +set_tests_properties(List::Tests::XmlOutput PROPERTIES + PASS_REGULAR_EXPRESSION "[0-9]+" + FAIL_REGULAR_EXPRESSION "[0-9]+ test cases" +) add_test(NAME List::Tags::Output COMMAND $ --list-tags) set_tests_properties(List::Tags::Output PROPERTIES PASS_REGULAR_EXPRESSION "[0-9]+ tags" FAIL_REGULAR_EXPRESSION "\\[\\.\\]") add_test(NAME List::Tags::ExitCode COMMAND $ --list-tags) +add_test(NAME List::Tags::XmlOutput COMMAND $ --list-tags -r xml) +set_tests_properties(List::Tags::XmlOutput PROPERTIES + PASS_REGULAR_EXPRESSION "18" + FAIL_REGULAR_EXPRESSION "[0-9]+ tags" +) + add_test(NAME List::Reporters::Output COMMAND $ --list-reporters) set_tests_properties(List::Reporters::Output PROPERTIES PASS_REGULAR_EXPRESSION "Available reporters:") add_test(NAME List::Reporters::ExitCode COMMAND $ --list-reporters) +add_test(NAME List::Reporters::XmlOutput COMMAND $ --list-reporters -r xml) +set_tests_properties(List::Reporters::XmlOutput PROPERTIES + PASS_REGULAR_EXPRESSION "compact" + FAIL_REGULAR_EXPRESSION "Available reporters:" +)