⛏️ index : haiku.git

#include <cppunit/Exception.h>
#include <cppunit/NotEqualException.h>
#include <cppunit/Test.h>
#include <cppunit/TestFailure.h>
#include <cppunit/TextTestResult.h>
#include <iostream>


using std::cerr;
using std::endl;
using std::ostream;

namespace CppUnit {


TextTestResult::TextTestResult()
{
  addListener( this );
}


void
TextTestResult::addFailure( Test *test, Exception *e )
{
	TestResult::addFailure( test, e );
}


void
TextTestResult::addFailure( const TestFailure &failure )
{
  TestResultCollector::addFailure( failure );
  cerr << ( failure.isError() ? "E" : "F" );
}


void
TextTestResult::startTest( Test *test )
{
  TestResultCollector::startTest (test);
  cerr << ".";
}


void
TextTestResult::printFailures( ostream &stream )
{
  TestFailures::const_iterator itFailure = failures().begin();
  int failureNumber = 1;
  while ( itFailure != failures().end() )
  {
    stream  <<  endl;
    printFailure( *itFailure++, failureNumber++, stream );
  }
}


void
TextTestResult::printFailure( TestFailure *failure,
                              int failureNumber,
                              ostream &stream )
{
  printFailureListMark( failureNumber, stream );
  stream << ' ';
  printFailureTestName( failure, stream );
  stream << ' ';
  printFailureType( failure, stream );
  stream << ' ';
  printFailureLocation( failure->sourceLine(), stream );
  stream << endl;
  printFailureDetail( failure->thrownException(), stream );
  stream << endl;
}


void
TextTestResult::printFailureListMark( int failureNumber,
                                      ostream &stream )
{
  stream << failureNumber << ")";
}


void
TextTestResult::printFailureTestName( TestFailure *failure,
                                      ostream &stream )
{
  stream << "test: " << failure->failedTest()->getName();
}


void
TextTestResult::printFailureType( TestFailure *failure,
                                  ostream &stream )
{
  stream << "("
         << (failure->isError() ? "E" : "F")
         << ")";
}


void
TextTestResult::printFailureLocation( SourceLine sourceLine,
                                      ostream &stream )
{
  if ( !sourceLine.isValid() )
    return;

  stream << "line: " << sourceLine.lineNumber()
         << ' ' << sourceLine.fileName();
}


void
TextTestResult::printFailureDetail( Exception *thrownException,
                                    ostream &stream )
{
  if ( thrownException->isInstanceOf( NotEqualException::type() ) )
  {
    NotEqualException *e = (NotEqualException*)thrownException;
    stream << "expected: " << e->expectedValue() << endl
           << "but was:  " << e->actualValue();
    if ( !e->additionalMessage().empty() )
    {
      stream  << endl;
      stream  <<  "additional message:"  <<  endl
              <<  e->additionalMessage();
    }
  }
  else
  {
    stream << " \"" << thrownException->what() << "\"";
  }
}


void
TextTestResult::print( ostream& stream )
{
  printHeader( stream );
  stream << endl;
  printFailures( stream );
}


void
TextTestResult::printHeader( ostream &stream )
{
  if (wasSuccessful ())
    stream << endl << "OK (" << runTests () << " tests)"
           << endl;
  else
  {
    stream << endl;
    printFailureWarning( stream );
    printStatistics( stream );
  }
}


void
TextTestResult::printFailureWarning( ostream &stream )
{
  stream  << "!!!FAILURES!!!" << endl;
}


void
TextTestResult::printStatistics( ostream &stream )
{
  stream  << "Test Results:" << endl;

  stream  <<  "Run:  "  <<  runTests()
          <<  "   Failures: "  <<  testFailures()
          <<  "   Errors: "  <<  testErrors()
          <<  endl;
}


ostream &
operator <<( ostream &stream,
             TextTestResult &result )
{
  result.print (stream); return stream;
}


} // namespace CppUnit