1 #include <cppunit/TestListener.h>
   2 #include <cppunit/BriefTestProgressListener.h>
   3 #include <cppunit/CompilerOutputter.h>
   4 #include <cppunit/extensions/TestFactoryRegistry.h>
   5 #include <cppunit/TestResult.h>
   6 #include <cppunit/TestResultCollector.h>
   7 #include <cppunit/TestRunner.h>
   8 
   9 class CoverageScannerListener : public CppUnit::TestListener
  10 {
  11 public:
  12   void startTest( CppUnit::Test *test )
  13   {
  14     m_testFailed=false;
  15 #ifdef __COVERAGESCANNER__
  16     int pos;
  17     // Adjusting the name of the test to display the tests
  18     // in a tree view in CoverageBrowser
  19     std::string testname = "CppUnit/" + test->getName();
  20     while ( (pos=testname.find("::",0)) != std::string::npos )
  21       testname.replace(pos,2,"/");
  22 
  23     // Reset the code coverage data to get only the code coverage 
  24     // of the actual unit test.
  25     __coveragescanner_clear();
  26     __coveragescanner_testname(testname.c_str()) ;
  27 #endif
  28   }
  29 
  30   void addFailure( const CppUnit::TestFailure &failure ) { m_testFailed=true; }
  31 
  32   void endTest( CppUnit::Test *test )
  33   {
  34 #ifdef __COVERAGESCANNER__
  35     // Recording the execution state in the coverage report
  36     if (m_testFailed)
  37       __coveragescanner_teststate("FAILED");
  38     else
  39       __coveragescanner_teststate("PASSED");
  40 
  41     // Saving the code coverage report of the unit test
  42     __coveragescanner_save();
  43     __coveragescanner_testname("");
  44 #endif
  45   }
  46 
  47 private:
  48   bool m_testFailed;
  49   // Prevents the use of the copy constructor and operator.
  50   CoverageScannerListener( const CoverageScannerListener &copy );
  51   void operator =( const CoverageScannerListener &copy );
  52 };
  53 
  54 int main( int argc, char* argv[] )
  55 {
  56 #ifdef __COVERAGESCANNER__
  57     __coveragescanner_install(argv[0]);
  58 #endif
  59   // Create the event manager and test controller
  60   CPPUNIT_NS::TestResult controller;
  61 
  62   // Add a listener that colllects test result
  63   CPPUNIT_NS::TestResultCollector result;
  64   controller.addListener( &result );
  65 
  66   // Add a listener that print dots as test run.
  67   CPPUNIT_NS::BriefTestProgressListener progress;
  68   controller.addListener( &progress );
  69 
  70   // Add a listener that saves the code coverage information
  71   CoverageScannerListener coveragescannerlistener;
  72   controller.addListener( &coveragescannerlistener );
  73 
  74   // Add the top suite to the test runner
  75   CPPUNIT_NS::TestRunner runner;
  76   runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
  77   runner.run( controller );
  78 
  79   return result.wasSuccessful() ? 0 : 1;
  80 }