Specialize XML reporter's --list output

This commit is contained in:
Martin Hořeňovský
2019-06-22 15:31:11 +02:00
parent 85b129c741
commit be44cfa63b
8 changed files with 116 additions and 10 deletions

View File

@@ -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<ReporterDescription> const&, Config const&) override {}
void listTests(std::vector<TestCase> const&, Config const&) override {}
void listTags(std::vector<TagInfo> const&, Config const&) override {}
};
} // end namespace Catch

View File

@@ -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
void ListeningReporter::listReporters(std::vector<ReporterDescription> 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<TestCase> 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<TagInfo> const& tags, Config const& config) {
for (auto const& listener : m_listeners) {
listener->listTags(tags, config);
}
m_reporter->listTags(tags, config);
}
} // end namespace Catch

View File

@@ -54,6 +54,11 @@ namespace Catch {
void skipTest( TestCaseInfo const& testInfo ) override;
bool isMulti() const override;
void listReporters(std::vector<ReporterDescription> const& descriptions, Config const& config) override;
void listTests(std::vector<TestCase> const& tests, Config const& config) override;
void listTags(std::vector<TagInfo> const& tags, Config const& config) override;
};
} // end namespace Catch

View File

@@ -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<ReporterDescription> 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<TestCase> 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<TagInfo> 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

View File

@@ -57,6 +57,10 @@ namespace Catch {
void benchmarkFailed(std::string const&) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
void listReporters(std::vector<ReporterDescription> const& descriptions, Config const& config) override;
void listTests(std::vector<TestCase> const& tests, Config const& config) override;
void listTags(std::vector<TagInfo> const& tags, Config const& config) override;
private:
Timer m_testCaseTimer;
XmlWriter m_xml;