1 #include "UnitTest++/Config.h"
2 #ifndef UNITTEST_NO_DEFERRED_REPORTER
3
4 #include "UnitTest++/UnitTestPP.h"
5 #include "UnitTest++/XmlTestReporter.h"
6
7 #include <sstream>
8
9 using namespace UnitTest;
10 using std::ostringstream;
11
12 namespace
13 {
14
15 #ifndef UNITTEST_MEMORYOUTSTREAM_IS_STD_OSTRINGSTREAM
16
17 // Overload to let MemoryOutStream accept std::string
operator <<(MemoryOutStream & s,const std::string & value)18 MemoryOutStream& operator<<(MemoryOutStream& s, const std::string& value)
19 {
20 s << value.c_str();
21 return s;
22 }
23
24 #endif
25
26 struct XmlTestReporterFixture
27 {
XmlTestReporterFixture__anon23abe5d20111::XmlTestReporterFixture28 XmlTestReporterFixture()
29 : reporter(output)
30 {
31 }
32
33 ostringstream output;
34 XmlTestReporter reporter;
35 };
36
TEST_FIXTURE(XmlTestReporterFixture,MultipleCharactersAreEscaped)37 TEST_FIXTURE(XmlTestReporterFixture, MultipleCharactersAreEscaped)
38 {
39 TestDetails const details("TestName", "suite", "filename.h", 4321);
40
41 reporter.ReportTestStart(details);
42 reporter.ReportFailure(details, "\"\"\'\'&&<<>>");
43 reporter.ReportTestFinish(details, 0.1f);
44 reporter.ReportSummary(1, 2, 3, 0.1f);
45
46 char const* expected =
47 "<?xml version=\"1.0\"?>"
48 "<unittest-results tests=\"1\" failedtests=\"2\" failures=\"3\" time=\"0.1\">"
49 "<test suite=\"suite\" name=\"TestName\" time=\"0.1\">"
50 "<failure message=\"filename.h(4321) : "
51 """''&&<<>>\"/>"
52 "</test>"
53 "</unittest-results>";
54
55 CHECK_EQUAL(expected, output.str().c_str());
56 }
57
TEST_FIXTURE(XmlTestReporterFixture,OutputIsCachedUntilReportSummaryIsCalled)58 TEST_FIXTURE(XmlTestReporterFixture, OutputIsCachedUntilReportSummaryIsCalled)
59 {
60 TestDetails const details("", "", "", 0);
61
62 reporter.ReportTestStart(details);
63 reporter.ReportFailure(details, "message");
64 reporter.ReportTestFinish(details, 1.0F);
65 CHECK(output.str().empty());
66
67 reporter.ReportSummary(1, 1, 1, 1.0f);
68 CHECK(!output.str().empty());
69 }
70
TEST_FIXTURE(XmlTestReporterFixture,EmptyReportSummaryFormat)71 TEST_FIXTURE(XmlTestReporterFixture, EmptyReportSummaryFormat)
72 {
73 reporter.ReportSummary(0, 0, 0, 0.1f);
74
75 const char *expected =
76 "<?xml version=\"1.0\"?>"
77 "<unittest-results tests=\"0\" failedtests=\"0\" failures=\"0\" time=\"0.1\">"
78 "</unittest-results>";
79
80 CHECK_EQUAL(expected, output.str().c_str());
81 }
82
TEST_FIXTURE(XmlTestReporterFixture,SingleSuccessfulTestReportSummaryFormat)83 TEST_FIXTURE(XmlTestReporterFixture, SingleSuccessfulTestReportSummaryFormat)
84 {
85 TestDetails const details("TestName", "DefaultSuite", "", 0);
86
87 reporter.ReportTestStart(details);
88 reporter.ReportSummary(1, 0, 0, 0.1f);
89
90 const char *expected =
91 "<?xml version=\"1.0\"?>"
92 "<unittest-results tests=\"1\" failedtests=\"0\" failures=\"0\" time=\"0.1\">"
93 "<test suite=\"DefaultSuite\" name=\"TestName\" time=\"0\"/>"
94 "</unittest-results>";
95
96 CHECK_EQUAL(expected, output.str().c_str());
97 }
98
TEST_FIXTURE(XmlTestReporterFixture,SingleFailedTestReportSummaryFormat)99 TEST_FIXTURE(XmlTestReporterFixture, SingleFailedTestReportSummaryFormat)
100 {
101 TestDetails const details("A Test", "suite", "A File", 4321);
102
103 reporter.ReportTestStart(details);
104 reporter.ReportFailure(details, "A Failure");
105 reporter.ReportSummary(1, 1, 1, 0.1f);
106
107 const char *expected =
108 "<?xml version=\"1.0\"?>"
109 "<unittest-results tests=\"1\" failedtests=\"1\" failures=\"1\" time=\"0.1\">"
110 "<test suite=\"suite\" name=\"A Test\" time=\"0\">"
111 "<failure message=\"A File(4321) : A Failure\"/>"
112 "</test>"
113 "</unittest-results>";
114
115 CHECK_EQUAL(expected, output.str().c_str());
116 }
117
TEST_FIXTURE(XmlTestReporterFixture,FailureMessageIsXMLEscaped)118 TEST_FIXTURE(XmlTestReporterFixture, FailureMessageIsXMLEscaped)
119 {
120 TestDetails const details("TestName", "suite", "filename.h", 4321);
121
122 reporter.ReportTestStart(details);
123 reporter.ReportFailure(details, "\"\'&<>");
124 reporter.ReportTestFinish(details, 0.1f);
125 reporter.ReportSummary(1, 1, 1, 0.1f);
126
127 char const* expected =
128 "<?xml version=\"1.0\"?>"
129 "<unittest-results tests=\"1\" failedtests=\"1\" failures=\"1\" time=\"0.1\">"
130 "<test suite=\"suite\" name=\"TestName\" time=\"0.1\">"
131 "<failure message=\"filename.h(4321) : "'&<>\"/>"
132 "</test>"
133 "</unittest-results>";
134
135 CHECK_EQUAL(expected, output.str().c_str());
136 }
137
TEST_FIXTURE(XmlTestReporterFixture,OneFailureAndOneSuccess)138 TEST_FIXTURE(XmlTestReporterFixture, OneFailureAndOneSuccess)
139 {
140 TestDetails const failedDetails("FailedTest", "suite", "fail.h", 1);
141 reporter.ReportTestStart(failedDetails);
142 reporter.ReportFailure(failedDetails, "expected 1 but was 2");
143 reporter.ReportTestFinish(failedDetails, 0.1f);
144
145 TestDetails const succeededDetails("SucceededTest", "suite", "", 0);
146 reporter.ReportTestStart(succeededDetails);
147 reporter.ReportTestFinish(succeededDetails, 1.0f);
148 reporter.ReportSummary(2, 1, 1, 1.1f);
149
150 char const* expected =
151 "<?xml version=\"1.0\"?>"
152 "<unittest-results tests=\"2\" failedtests=\"1\" failures=\"1\" time=\"1.1\">"
153 "<test suite=\"suite\" name=\"FailedTest\" time=\"0.1\">"
154 "<failure message=\"fail.h(1) : expected 1 but was 2\"/>"
155 "</test>"
156 "<test suite=\"suite\" name=\"SucceededTest\" time=\"1\"/>"
157 "</unittest-results>";
158
159 CHECK_EQUAL(expected, output.str().c_str());
160 }
161
TEST_FIXTURE(XmlTestReporterFixture,MultipleFailures)162 TEST_FIXTURE(XmlTestReporterFixture, MultipleFailures)
163 {
164 TestDetails const failedDetails1("FailedTest", "suite", "fail.h", 1);
165 TestDetails const failedDetails2("FailedTest", "suite", "fail.h", 31);
166
167 reporter.ReportTestStart(failedDetails1);
168 reporter.ReportFailure(failedDetails1, "expected 1 but was 2");
169 reporter.ReportFailure(failedDetails2, "expected one but was two");
170 reporter.ReportTestFinish(failedDetails1, 0.1f);
171
172 reporter.ReportSummary(1, 1, 2, 1.1f);
173
174 char const* expected =
175 "<?xml version=\"1.0\"?>"
176 "<unittest-results tests=\"1\" failedtests=\"1\" failures=\"2\" time=\"1.1\">"
177 "<test suite=\"suite\" name=\"FailedTest\" time=\"0.1\">"
178 "<failure message=\"fail.h(1) : expected 1 but was 2\"/>"
179 "<failure message=\"fail.h(31) : expected one but was two\"/>"
180 "</test>"
181 "</unittest-results>";
182
183 CHECK_EQUAL(expected, output.str().c_str());
184 }
185
186 }
187
188 #endif
189