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