@@ -28,12 +28,56 @@ struct OverallResultsCases {
2828 [[= xml::attribute]] unsigned skips = 0 ;
2929};
3030
31+ struct StdOut {
32+ [[= xml::attribute]] std::optional<std::string> filename;
33+ [[= xml::attribute]] std::optional<unsigned > line;
34+ [[= xml::raw]] std::string value;
35+ };
36+ struct StdErr {
37+ [[= xml::attribute]] std::optional<std::string> filename;
38+ [[= xml::attribute]] std::optional<unsigned > line;
39+ [[= xml::raw]] std::string value;
40+ };
41+ struct Exception {
42+ [[= xml::attribute]] std::optional<std::string> filename;
43+ [[= xml::attribute]] std::optional<unsigned > line;
44+ [[= xml::raw]] std::string value;
45+ };
46+ struct FatalErrorCondition {
47+ [[= xml::attribute]] std::optional<std::string> filename;
48+ [[= xml::attribute]] std::optional<unsigned > line;
49+ [[= xml::raw]] std::string value;
50+ };
51+ struct Failure {
52+ [[= xml::attribute]] std::optional<std::string> filename;
53+ [[= xml::attribute]] std::optional<unsigned > line;
54+ [[= xml::raw]] std::string value;
55+ };
56+ struct Warning {
57+ [[= xml::attribute]] std::optional<std::string> filename;
58+ [[= xml::attribute]] std::optional<unsigned > line;
59+ [[= xml::raw]] std::string value;
60+ };
61+ struct Info {
62+ [[= xml::attribute]] std::optional<std::string> filename;
63+ [[= xml::attribute]] std::optional<unsigned > line;
64+ [[= xml::raw]] std::string value;
65+ };
66+
3167struct Section {
3268 [[= xml::attribute]] std::string name;
3369 [[= xml::attribute]] std::optional<std::string> filename;
3470 [[= xml::attribute]] std::optional<unsigned > line;
35- [[=xml::node]] std::vector<Section> sections;
36- [[=xml::node]] OverallResults results;
71+ [[= xml::node]] std::vector<Section> sections;
72+ [[= xml::node]] OverallResults results;
73+
74+ [[= xml::node]] std::optional<StdOut> stdout;
75+ [[= xml::node]] std::optional<StdErr> stderr;
76+ [[= xml::node]] std::optional<Exception> exception;
77+ [[= xml::node]] std::optional<FatalErrorCondition> fatal_ec;
78+ [[= xml::node]] std::optional<Failure> failure;
79+ [[= xml::node]] std::optional<Warning> warning;
80+ [[= xml::node]] std::optional<Info> info;
3781
3882 void update_results () {
3983 for (auto & section : sections) {
@@ -51,8 +95,8 @@ struct TestCase {
5195 [[= xml::attribute]] std::optional<std::string> filename;
5296 [[= xml::attribute]] std::optional<unsigned > line;
5397
54- [[=xml::node]] std::vector<Section> sections;
55- [[=xml::node]] OverallResult result;
98+ [[= xml::node]] std::vector<Section> sections;
99+ [[= xml::node]] OverallResult result;
56100
57101 void update_results () {
58102 for (auto & section : sections) {
@@ -67,9 +111,9 @@ struct Catch2TestRun {
67111 [[= xml::attribute]] std::size_t xml_format_version = 3 ;
68112 [[= xml::attribute]] std::string catch2_version = " 3.8.1" ;
69113
70- [[=xml::node]] std::vector<TestCase> tests;
71- [[=xml::node]] OverallResults test_results;
72- [[=xml::node]] OverallResultsCases case_results;
114+ [[= xml::node]] std::vector<TestCase> tests;
115+ [[= xml::node]] OverallResults test_results;
116+ [[= xml::node]] OverallResultsCases case_results;
73117
74118 TestCase& get_tc (std::string_view name) {
75119 for (auto & test : tests) {
@@ -103,37 +147,54 @@ struct Catch2TestRun {
103147 }
104148};
105149
150+ struct Name {
151+ [[= xml::raw]] std::string value;
152+ };
153+
106154struct MatchingTests {
107155 struct TestCase {
108- [[= xml::raw]] std::string Name;
156+ Name name ;
109157 };
110- [[=xml::node]] std::vector<MatchingTests::TestCase> tests;
158+ [[= xml::node]] std::vector<MatchingTests::TestCase> tests;
111159};
112160
113161class [[= rename(" xml" )]] Catch2XmlReporter : public Reporter::Registrar<Catch2XmlReporter> {
114162 Catch2TestRun report;
115-
163+
116164public:
117165 void before_test (rsl::testing::TestCase const & run) override {}
118166 void after_test (TestResult const & result) override {
119- TestCase& tc = report.get_tc (result.test ->full_name [0 ]);
167+ TestCase& tc = report.get_tc (result.test ->full_name [0 ]);
120168 Section* section = nullptr ;
121169
122170 if (result.test ->full_name .size () >= 2 ) {
123- section = &tc.sections .emplace_back (result.test ->full_name [1 ]);
171+ section = &tc.sections .emplace_back (result.test ->full_name [1 ]);
124172 for (auto const & part : result.test ->full_name | std::views::drop (2 )) {
125173 section = §ion->sections .emplace_back (part);
126174 }
127- section->sections .emplace_back (result.name , result.test ->sloc .file_name (), result.test ->sloc .line ());
175+ section->sections .emplace_back (result.name ,
176+ result.test ->sloc .file_name (),
177+ result.test ->sloc .line ());
128178 section = §ion->sections .back ();
129179 } else {
130- tc.sections .emplace_back (result.name , result.test ->sloc .file_name (), result.test ->sloc .line ());
180+ tc.sections .emplace_back (result.name ,
181+ result.test ->sloc .file_name (),
182+ result.test ->sloc .line ());
131183 section = &tc.sections .back ();
132184 }
133185
186+ if (!result.stdout .empty ()) {
187+ section->stdout = {.value =result.stdout };
188+ }
189+
190+ if (!result.stderr .empty ()) {
191+ section->stderr = {.value =result.stderr };
192+ }
193+
134194 if (result.passed ) {
135195 ++section->results .successes ;
136196 } else {
197+ section->failure = {.value =result.error };
137198 ++section->results .failures ;
138199 }
139200 section->results .durationInSeconds += result.duration_ms / 1000 .;
@@ -154,11 +215,11 @@ class[[= rename("xml")]] Catch2XmlReporter : public Reporter::Registrar<Catch2Xm
154215 void list_tests (TestNamespace const & tests) override {
155216 MatchingTests matching{};
156217 for (auto const & ns : tests.children ) {
157- matching.tests .emplace_back ( std::string (ns.name ));
218+ matching.tests .push_back (MatchingTests::TestCase{ std::string (ns.name )} );
158219 }
159220
160221 for (auto const & test : tests.tests ) {
161- matching.tests .emplace_back ( std::string (test.name ));
222+ matching.tests .push_back (MatchingTests::TestCase{ std::string (test.name )} );
162223 }
163224 // todo use Output instead
164225 std::println (" {}" , rsl::to_xml (matching));
0 commit comments