Blame src/cppunit/XmlOutputter.cpp

Packit 8c9aa0
#include <cppunit/Exception.h>
Packit 8c9aa0
#include <cppunit/Test.h>
Packit 8c9aa0
#include <cppunit/TestFailure.h>
Packit 8c9aa0
#include <cppunit/TestResultCollector.h>
Packit 8c9aa0
#include <cppunit/XmlOutputter.h>
Packit 8c9aa0
#include <cppunit/XmlOutputterHook.h>
Packit 8c9aa0
#include <cppunit/tools/XmlDocument.h>
Packit 8c9aa0
#include <cppunit/tools/XmlElement.h>
Packit 8c9aa0
#include <stdlib.h>
Packit 8c9aa0
#include <algorithm>
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
XmlOutputter::XmlOutputter( TestResultCollector *result,
Packit 8c9aa0
                            OStream &stream,
Packit 8c9aa0
                            const std::string& encoding )
Packit 8c9aa0
  : m_result( result )
Packit 8c9aa0
  , m_stream( stream )
Packit 8c9aa0
  , m_encoding( encoding )
Packit 8c9aa0
  , m_styleSheet()
Packit 8c9aa0
  , m_xml( new XmlDocument( encoding ) )
Packit 8c9aa0
  , m_hooks()
Packit 8c9aa0
{
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
XmlOutputter::~XmlOutputter()
Packit 8c9aa0
{
Packit 8c9aa0
  delete m_xml;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlOutputter::addHook( XmlOutputterHook *hook )
Packit 8c9aa0
{
Packit 8c9aa0
  m_hooks.push_back( hook );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlOutputter::removeHook( XmlOutputterHook *hook )
Packit 8c9aa0
{
Packit 8c9aa0
  m_hooks.erase( std::find( m_hooks.begin(), m_hooks.end(), hook ) );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlOutputter::write()
Packit 8c9aa0
{
Packit 8c9aa0
  setRootNode();
Packit 8c9aa0
  m_stream  <<  m_xml->toString();
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlOutputter::setStyleSheet( const std::string &styleSheet )
Packit 8c9aa0
{
Packit 8c9aa0
  m_xml->setStyleSheet( styleSheet );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::setStandalone( bool standalone )
Packit 8c9aa0
{
Packit 8c9aa0
  m_xml->setStandalone( standalone );
Packit 8c9aa0
}
Packit 8c9aa0
 
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::setRootNode()
Packit 8c9aa0
{
Packit 8c9aa0
  XmlElement *rootNode = new XmlElement( "TestRun" );
Packit 8c9aa0
  m_xml->setRootElement( rootNode );
Packit 8c9aa0
Packit 8c9aa0
  for ( Hooks::iterator it = m_hooks.begin(); it != m_hooks.end(); ++it )
Packit 8c9aa0
    (*it)->beginDocument( m_xml );
Packit 8c9aa0
Packit 8c9aa0
  FailedTests failedTests;
Packit 8c9aa0
  fillFailedTestsMap( failedTests );
Packit 8c9aa0
Packit 8c9aa0
  addFailedTests( failedTests, rootNode );
Packit 8c9aa0
  addSuccessfulTests( failedTests, rootNode );
Packit 8c9aa0
  addStatistics( rootNode );
Packit 8c9aa0
Packit 8c9aa0
  for ( Hooks::iterator itEnd = m_hooks.begin(); itEnd != m_hooks.end(); ++itEnd )
Packit 8c9aa0
    (*itEnd)->endDocument( m_xml );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlOutputter::fillFailedTestsMap( FailedTests &failedTests )
Packit 8c9aa0
{
Packit 8c9aa0
  const TestResultCollector::TestFailures &failures = m_result->failures();
Packit 8c9aa0
  TestResultCollector::TestFailures::const_iterator itFailure = failures.begin();
Packit 8c9aa0
  while ( itFailure != failures.end() )
Packit 8c9aa0
  {
Packit 8c9aa0
    TestFailure *failure = *itFailure++;
Packit 8c9aa0
    failedTests.insert( std::pair<Test* const, TestFailure*>(failure->failedTest(), failure ) );
Packit 8c9aa0
  }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::addFailedTests( FailedTests &failedTests,
Packit 8c9aa0
                              XmlElement *rootNode )
Packit 8c9aa0
{
Packit 8c9aa0
  XmlElement *testsNode = new XmlElement( "FailedTests" );
Packit 8c9aa0
  rootNode->addElement( testsNode );
Packit 8c9aa0
Packit 8c9aa0
  const TestResultCollector::Tests &tests = m_result->tests();
Packit 8c9aa0
  for ( unsigned int testNumber = 0; testNumber < tests.size(); ++testNumber )
Packit 8c9aa0
  {
Packit 8c9aa0
    Test *test = tests[testNumber];
Packit 8c9aa0
    if ( failedTests.find( test ) != failedTests.end() )
Packit 8c9aa0
      addFailedTest( test, failedTests[test], testNumber+1, testsNode );
Packit 8c9aa0
  }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::addSuccessfulTests( FailedTests &failedTests,
Packit 8c9aa0
                                           XmlElement *rootNode )
Packit 8c9aa0
{
Packit 8c9aa0
  XmlElement *testsNode = new XmlElement( "SuccessfulTests" );
Packit 8c9aa0
  rootNode->addElement( testsNode );
Packit 8c9aa0
Packit 8c9aa0
  const TestResultCollector::Tests &tests = m_result->tests();
Packit 8c9aa0
  for ( unsigned int testNumber = 0; testNumber < tests.size(); ++testNumber )
Packit 8c9aa0
  {
Packit 8c9aa0
    Test *test = tests[testNumber];
Packit 8c9aa0
    if ( failedTests.find( test ) == failedTests.end() )
Packit 8c9aa0
      addSuccessfulTest( test, testNumber+1, testsNode );
Packit 8c9aa0
  }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::addStatistics( XmlElement *rootNode )
Packit 8c9aa0
{
Packit 8c9aa0
  XmlElement *statisticsElement = new XmlElement( "Statistics" );
Packit 8c9aa0
  rootNode->addElement( statisticsElement );
Packit 8c9aa0
  statisticsElement->addElement( new XmlElement( "Tests", m_result->runTests() ) );
Packit 8c9aa0
  statisticsElement->addElement( new XmlElement( "FailuresTotal", 
Packit 8c9aa0
                                                 m_result->testFailuresTotal() ) );
Packit 8c9aa0
  statisticsElement->addElement( new XmlElement( "Errors", m_result->testErrors() ) );
Packit 8c9aa0
  statisticsElement->addElement( new XmlElement( "Failures", m_result->testFailures() ) );
Packit 8c9aa0
Packit 8c9aa0
  for ( Hooks::iterator it = m_hooks.begin(); it != m_hooks.end(); ++it )
Packit 8c9aa0
    (*it)->statisticsAdded( m_xml, statisticsElement );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::addFailedTest( Test *test,
Packit 8c9aa0
                             TestFailure *failure,
Packit 8c9aa0
                             int testNumber,
Packit 8c9aa0
                             XmlElement *testsNode )
Packit 8c9aa0
{
Packit 8c9aa0
  Exception *thrownException = failure->thrownException();
Packit 8c9aa0
  
Packit 8c9aa0
  XmlElement *testElement = new XmlElement( "FailedTest" );
Packit 8c9aa0
  testsNode->addElement( testElement );
Packit 8c9aa0
  testElement->addAttribute( "id", testNumber );
Packit 8c9aa0
  testElement->addElement( new XmlElement( "Name", test->getName() ) );
Packit 8c9aa0
  testElement->addElement( new XmlElement( "FailureType", 
Packit 8c9aa0
                                           failure->isError() ? "Error" : 
Packit 8c9aa0
                                                                "Assertion" ) );
Packit 8c9aa0
Packit 8c9aa0
  if ( failure->sourceLine().isValid() )
Packit 8c9aa0
    addFailureLocation( failure, testElement );
Packit 8c9aa0
Packit 8c9aa0
  testElement->addElement( new XmlElement( "Message", thrownException->what() ) );
Packit 8c9aa0
Packit 8c9aa0
  for ( Hooks::iterator it = m_hooks.begin(); it != m_hooks.end(); ++it )
Packit 8c9aa0
    (*it)->failTestAdded( m_xml, testElement, test, failure );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::addFailureLocation( TestFailure *failure,
Packit 8c9aa0
                                  XmlElement *testElement )
Packit 8c9aa0
{
Packit 8c9aa0
  XmlElement *locationNode = new XmlElement( "Location" );
Packit 8c9aa0
  testElement->addElement( locationNode );
Packit 8c9aa0
  SourceLine sourceLine = failure->sourceLine();
Packit 8c9aa0
  locationNode->addElement( new XmlElement( "File", sourceLine.fileName() ) );
Packit 8c9aa0
  locationNode->addElement( new XmlElement( "Line", sourceLine.lineNumber() ) );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void
Packit 8c9aa0
XmlOutputter::addSuccessfulTest( Test *test, 
Packit 8c9aa0
                                 int testNumber,
Packit 8c9aa0
                                 XmlElement *testsNode )
Packit 8c9aa0
{
Packit 8c9aa0
  XmlElement *testElement = new XmlElement( "Test" );
Packit 8c9aa0
  testsNode->addElement( testElement );
Packit 8c9aa0
  testElement->addAttribute( "id", testNumber );
Packit 8c9aa0
  testElement->addElement( new XmlElement( "Name", test->getName() ) );
Packit 8c9aa0
Packit 8c9aa0
  for ( Hooks::iterator it = m_hooks.begin(); it != m_hooks.end(); ++it )
Packit 8c9aa0
    (*it)->successfulTestAdded( m_xml, testElement, test );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_END