1 #include <cppunit/config/SourcePrefix.h>
2 #include <cppunit/XmlOutputter.h>
3 #include <cppunit/TestFailure.h>
4 #include <cppunit/XmlOutputter.h>
5 #include <cppunit/XmlOutputterHook.h>
6 #include "OutputSuite.h"
7 #include "XmlOutputterTest.h"
8 #include "XmlUniformiser.h"
9
10
11 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( XmlOutputterTest,
12 outputSuiteName() );
13
14
XmlOutputterTest()15 XmlOutputterTest::XmlOutputterTest()
16 {
17 }
18
19
~XmlOutputterTest()20 XmlOutputterTest::~XmlOutputterTest()
21 {
22 }
23
24
25 void
setUp()26 XmlOutputterTest::setUp()
27 {
28 m_dummyTests.clear();
29 m_result = new CPPUNIT_NS::TestResultCollector();
30 }
31
32
33 void
tearDown()34 XmlOutputterTest::tearDown()
35 {
36 delete m_result;
37 for ( unsigned int index =0; index < m_dummyTests.size(); ++index )
38 delete m_dummyTests[index];
39 m_dummyTests.clear();
40 }
41
42
43 void
testWriteXmlResultWithNoTest()44 XmlOutputterTest::testWriteXmlResultWithNoTest()
45 {
46 CPPUNIT_NS::OStringStream stream;
47 CPPUNIT_NS::XmlOutputter outputter( m_result, stream );
48 outputter.write();
49
50 std::string actualXml = stream.str();
51 std::string expectedXml =
52 "<TestRun>"
53 "<FailedTests></FailedTests>"
54 "<SuccessfulTests></SuccessfulTests>"
55 "<Statistics>"
56 "<Tests>0</Tests>"
57 "<FailuresTotal>0</FailuresTotal>"
58 "<Errors>0</Errors>"
59 "<Failures>0</Failures>"
60 "</Statistics>"
61 "</TestRun>";
62 CPPUNITTEST_ASSERT_XML_EQUAL( expectedXml, actualXml );
63 }
64
65
66 void
testWriteXmlResultWithOneFailure()67 XmlOutputterTest::testWriteXmlResultWithOneFailure()
68 {
69 addTestFailure( "test1", "message failure1", CPPUNIT_NS::SourceLine( "test.cpp", 3 ) );
70
71 CPPUNIT_NS::OStringStream stream;
72 CPPUNIT_NS::XmlOutputter outputter( m_result, stream );
73 outputter.write();
74
75 std::string actualXml = stream.str();
76 std::string expectedXml =
77 "<TestRun>"
78 "<FailedTests>"
79 "<FailedTest id=\"1\">"
80 "<Name>test1</Name>"
81 "<FailureType>Assertion</FailureType>"
82 "<Location>"
83 "<File>test.cpp</File>"
84 "<Line>3</Line>"
85 "</Location>"
86 "<Message>message failure1</Message>"
87 "</FailedTest>"
88 "</FailedTests>"
89 "<SuccessfulTests></SuccessfulTests>"
90 "<Statistics>"
91 "<Tests>1</Tests>"
92 "<FailuresTotal>1</FailuresTotal>"
93 "<Errors>0</Errors>"
94 "<Failures>1</Failures>"
95 "</Statistics>"
96 "</TestRun>";
97 CPPUNITTEST_ASSERT_XML_EQUAL( expectedXml, actualXml );
98 }
99
100
101 void
testWriteXmlResultWithOneError()102 XmlOutputterTest::testWriteXmlResultWithOneError()
103 {
104 addTestError( "test1", "message error1" );
105
106 CPPUNIT_NS::OStringStream stream;
107 CPPUNIT_NS::XmlOutputter outputter( m_result, stream );
108 outputter.write();
109
110 std::string actualXml = stream.str();
111 std::string expectedXml =
112 "<TestRun>"
113 "<FailedTests>"
114 "<FailedTest id=\"1\">"
115 "<Name>test1</Name>"
116 "<FailureType>Error</FailureType>"
117 "<Message>message error1</Message>"
118 "</FailedTest>"
119 "</FailedTests>"
120 "<SuccessfulTests></SuccessfulTests>"
121 "<Statistics>"
122 "<Tests>1</Tests>"
123 "<FailuresTotal>1</FailuresTotal>"
124 "<Errors>1</Errors>"
125 "<Failures>0</Failures>"
126 "</Statistics>"
127 "</TestRun>";
128 CPPUNITTEST_ASSERT_XML_EQUAL( expectedXml, actualXml );
129 }
130
131
132 void
testWriteXmlResultWithOneSuccess()133 XmlOutputterTest::testWriteXmlResultWithOneSuccess()
134 {
135 addTest( "test1" );
136
137 CPPUNIT_NS::OStringStream stream;
138 CPPUNIT_NS::XmlOutputter outputter( m_result, stream );
139 outputter.write();
140
141 std::string actualXml = stream.str();
142 std::string expectedXml =
143 "<TestRun>"
144 "<FailedTests></FailedTests>"
145 "<SuccessfulTests>"
146 "<Test id=\"1\">"
147 "<Name>test1</Name>"
148 "</Test>"
149 "</SuccessfulTests>"
150 "<Statistics>"
151 "<Tests>1</Tests>"
152 "<FailuresTotal>0</FailuresTotal>"
153 "<Errors>0</Errors>"
154 "<Failures>0</Failures>"
155 "</Statistics>"
156 "</TestRun>";
157 CPPUNITTEST_ASSERT_XML_EQUAL( expectedXml, actualXml );
158 }
159
160
161 void
testWriteXmlResultWithThreeFailureTwoErrorsAndTwoSuccess()162 XmlOutputterTest::testWriteXmlResultWithThreeFailureTwoErrorsAndTwoSuccess()
163 {
164 addTestFailure( "test1", "failure1" );
165 addTestError( "test2", "error1" );
166 addTestFailure( "test3", "failure2" );
167 addTestFailure( "test4", "failure3" );
168 addTest( "test5" );
169 addTestError( "test6", "error2" );
170 addTest( "test7" );
171
172 CPPUNIT_NS::OStringStream stream;
173 CPPUNIT_NS::XmlOutputter outputter( m_result, stream );
174 outputter.write();
175
176 std::string actualXml = stream.str();
177 std::string expectedXml =
178 "<TestRun>"
179 "<FailedTests>"
180 "<FailedTest id=\"1\">"
181 "<Name>test1</Name>"
182 "<FailureType>Assertion</FailureType>"
183 "<Message>failure1</Message>"
184 "</FailedTest>"
185 "<FailedTest id=\"2\">"
186 "<Name>test2</Name>"
187 "<FailureType>Error</FailureType>"
188 "<Message>error1</Message>"
189 "</FailedTest>"
190 "<FailedTest id=\"3\">"
191 "<Name>test3</Name>"
192 "<FailureType>Assertion</FailureType>"
193 "<Message>failure2</Message>"
194 "</FailedTest>"
195 "<FailedTest id=\"4\">"
196 "<Name>test4</Name>"
197 "<FailureType>Assertion</FailureType>"
198 "<Message>failure3</Message>"
199 "</FailedTest>"
200 "<FailedTest id=\"6\">"
201 "<Name>test6</Name>"
202 "<FailureType>Error</FailureType>"
203 "<Message>error2</Message>"
204 "</FailedTest>"
205 "</FailedTests>"
206 "<SuccessfulTests>"
207 "<Test id=\"5\">"
208 "<Name>test5</Name>"
209 "</Test>"
210 "<Test id=\"7\">"
211 "<Name>test7</Name>"
212 "</Test>"
213 "</SuccessfulTests>"
214 "<Statistics>"
215 "<Tests>7</Tests>"
216 "<FailuresTotal>5</FailuresTotal>"
217 "<Errors>2</Errors>"
218 "<Failures>3</Failures>"
219 "</Statistics>"
220 "</TestRun>";
221 CPPUNITTEST_ASSERT_XML_EQUAL( expectedXml, actualXml );
222 }
223
224
225 class XmlOutputterTest::MockHook : public CPPUNIT_NS::XmlOutputterHook
226 {
227 public:
MockHook(int & beginCalls,int & endCalls,int & statisticsCalls,int & successfulTestCalls,int & failedTestCalls)228 MockHook( int &beginCalls,
229 int &endCalls,
230 int &statisticsCalls,
231 int &successfulTestCalls,
232 int &failedTestCalls )
233 : m_beginCalls( beginCalls )
234 , m_endCalls( endCalls )
235 , m_statisticsCalls( statisticsCalls )
236 , m_successfulTestCalls( successfulTestCalls )
237 , m_failedTestCalls( failedTestCalls )
238 {
239 }
240
beginDocument(CPPUNIT_NS::XmlDocument *)241 void beginDocument( CPPUNIT_NS::XmlDocument * )
242 {
243 ++m_beginCalls;
244 }
245
endDocument(CPPUNIT_NS::XmlDocument *)246 void endDocument( CPPUNIT_NS::XmlDocument * )
247 {
248 ++m_endCalls;
249 }
250
failTestAdded(CPPUNIT_NS::XmlDocument *,CPPUNIT_NS::XmlElement *,CPPUNIT_NS::Test *,CPPUNIT_NS::TestFailure *)251 void failTestAdded( CPPUNIT_NS::XmlDocument *,
252 CPPUNIT_NS::XmlElement *,
253 CPPUNIT_NS::Test *,
254 CPPUNIT_NS::TestFailure * )
255 {
256 ++m_failedTestCalls;
257 }
258
successfulTestAdded(CPPUNIT_NS::XmlDocument *,CPPUNIT_NS::XmlElement *,CPPUNIT_NS::Test *)259 void successfulTestAdded( CPPUNIT_NS::XmlDocument *,
260 CPPUNIT_NS::XmlElement *,
261 CPPUNIT_NS::Test * )
262 {
263 ++m_successfulTestCalls;
264 }
265
statisticsAdded(CPPUNIT_NS::XmlDocument *,CPPUNIT_NS::XmlElement *)266 void statisticsAdded( CPPUNIT_NS::XmlDocument *,
267 CPPUNIT_NS::XmlElement * )
268 {
269 ++m_statisticsCalls;
270 }
271
272 private:
273 int &m_beginCalls;
274 int &m_endCalls;
275 int &m_statisticsCalls;
276 int &m_successfulTestCalls;
277 int &m_failedTestCalls;
278 };
279
280
281 void
testHook()282 XmlOutputterTest::testHook()
283 {
284 int begin =0, end =0, statistics =0, successful =0, failed =0;
285 MockHook hook( begin, end, statistics, successful, failed );
286
287 addTest( "test1" );
288 addTest( "test2" );
289 addTest( "test3" );
290 addTestFailure( "testfail1", "assertion failed" );
291 addTestError( "testerror1", "exception" );
292
293 CPPUNIT_NS::OStringStream stream;
294 CPPUNIT_NS::XmlOutputter outputter( m_result, stream );
295 outputter.addHook( &hook );
296 outputter.write();
297
298 CPPUNIT_ASSERT_EQUAL( 1, begin );
299 CPPUNIT_ASSERT_EQUAL( 1, end );
300 CPPUNIT_ASSERT_EQUAL( 1, statistics );
301 CPPUNIT_ASSERT_EQUAL( 3, successful );
302 CPPUNIT_ASSERT_EQUAL( 2, failed );
303 }
304
305
306 void
addTest(std::string testName)307 XmlOutputterTest::addTest( std::string testName )
308 {
309 CPPUNIT_NS::Test *test = makeDummyTest( testName );
310 m_result->startTest( test );
311 m_result->endTest( test );
312 }
313
314
315 void
addTestFailure(std::string testName,std::string message,CPPUNIT_NS::SourceLine sourceLine)316 XmlOutputterTest::addTestFailure( std::string testName,
317 std::string message,
318 CPPUNIT_NS::SourceLine sourceLine )
319 {
320 addGenericTestFailure( testName, CPPUNIT_NS::Message(message), sourceLine, false );
321 }
322
323
324 void
addTestError(std::string testName,std::string message,CPPUNIT_NS::SourceLine sourceLine)325 XmlOutputterTest::addTestError( std::string testName,
326 std::string message,
327 CPPUNIT_NS::SourceLine sourceLine )
328 {
329 addGenericTestFailure( testName, CPPUNIT_NS::Message(message), sourceLine, true );
330 }
331
332
333 void
addGenericTestFailure(std::string testName,CPPUNIT_NS::Message message,CPPUNIT_NS::SourceLine sourceLine,bool isError)334 XmlOutputterTest::addGenericTestFailure( std::string testName,
335 CPPUNIT_NS::Message message,
336 CPPUNIT_NS::SourceLine sourceLine,
337 bool isError )
338 {
339 CPPUNIT_NS::Test *test = makeDummyTest( testName );
340 m_result->startTest( test );
341 CPPUNIT_NS::TestFailure failure( test,
342 new CPPUNIT_NS::Exception( message, sourceLine ),
343 isError );
344 m_result->addFailure( failure );
345 m_result->endTest( test );
346 }
347
348
349 CPPUNIT_NS::Test *
makeDummyTest(std::string testName)350 XmlOutputterTest::makeDummyTest( std::string testName )
351 {
352 CPPUNIT_NS::Test *test = new CPPUNIT_NS::TestCase( testName );
353 m_dummyTests.push_back( test );
354 return test;
355 }
356
357