• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

tut_reporter.h

Go to the documentation of this file.
00001 #ifndef TUT_REPORTER
00002 #define TUT_REPORTER
00003 
00004 #include <wibble/tests/tut.h>
00005 
00012 namespace
00013 {
00014   std::ostream& operator << (std::ostream& os,const tut::test_result& tr)
00015   {
00016     switch(tr.result)
00017     {
00018       case tut::test_result::ok: 
00019       os << '.'; 
00020       break;
00021 
00022       case tut::test_result::fail: 
00023       os << '[' << tr.test << "=F]";
00024       break;
00025 
00026       case tut::test_result::ex_ctor: 
00027       os << '[' << tr.test << "=C]";
00028       break;
00029 
00030       case tut::test_result::ex: 
00031       os << '[' << tr.test << "=X]";
00032       break;
00033 
00034       case tut::test_result::warn: 
00035       os << '[' << tr.test << "=W]";
00036       break;
00037 
00038       case tut::test_result::term: 
00039       os << '[' << tr.test << "=T]";
00040       break;
00041     }
00042 
00043     return os;
00044   }
00045 }
00046 
00047 namespace tut
00048 {
00052   class reporter : public tut::callback
00053   {
00054     std::string current_group;
00055     typedef std::vector<tut::test_result> not_passed_list;
00056     not_passed_list not_passed;
00057     std::ostream& os;
00058 
00059   public:
00060     int ok_count;
00061     int exceptions_count;
00062     int failures_count;
00063     int terminations_count;
00064     int warnings_count;
00065 
00066     reporter() : os(std::cout)
00067     {
00068       init();
00069     }
00070 
00071     reporter(std::ostream& out) : os(out)
00072     {
00073       init();
00074     }
00075 
00076     void run_started()
00077     {
00078       init();
00079     }
00080 
00081     void test_completed(const tut::test_result& tr)
00082     {
00083       if( tr.group != current_group )
00084       {
00085         os << std::endl << tr.group << ": " << std::flush;
00086         current_group = tr.group;
00087       }
00088 
00089       os << tr << std::flush;
00090       if( tr.result == tut::test_result::ok ) ok_count++;
00091       else if( tr.result == tut::test_result::ex ) exceptions_count++;
00092       else if( tr.result == tut::test_result::ex_ctor ) exceptions_count++;
00093       else if( tr.result == tut::test_result::fail ) failures_count++;
00094       else if( tr.result == tut::test_result::warn ) warnings_count++;
00095       else terminations_count++;
00096 
00097       if( tr.result != tut::test_result::ok )
00098       {
00099         not_passed.push_back(tr);
00100       }
00101     }
00102 
00103     void run_completed()
00104     {
00105       os << std::endl;
00106 
00107       if( not_passed.size() > 0 )
00108       {
00109         not_passed_list::const_iterator i = not_passed.begin();
00110         while( i != not_passed.end() )
00111         {
00112            tut::test_result tr = *i;
00113 
00114            os << std::endl;
00115 
00116            os << "---> " << "group: " << tr.group << ", test: test<" << tr.test << ">" << std::endl;
00117 
00118            os << "     problem: ";
00119            switch(tr.result)
00120            {
00121              case test_result::fail: 
00122                os << "assertion failed" << std::endl; 
00123                break;
00124              case test_result::ex: 
00125              case test_result::ex_ctor: 
00126                os << "unexpected exception" << std::endl;
00127                if( tr.exception_typeid != "" )
00128                { 
00129                  os << "     exception typeid: " 
00130                     << tr.exception_typeid << std::endl;
00131                }
00132                break;
00133              case test_result::term: 
00134                os << "would be terminated" << std::endl; 
00135                break;
00136              case test_result::warn: 
00137                os << "test passed, but cleanup code (destructor) raised an exception" << std::endl; 
00138                break;
00139              default: break;
00140            }
00141 
00142            if( tr.message != "" )
00143            {
00144              if( tr.result == test_result::fail )
00145              {
00146                os << "     failed assertion: \"" << tr.message << "\"" << std::endl;
00147              }
00148              else
00149              {
00150                os << "     message: \"" << tr.message << "\"" << std::endl;
00151              }
00152            }
00153 
00154            ++i;
00155         }
00156       }
00157 
00158       os << std::endl;
00159 
00160       os << "tests summary:";
00161       if( terminations_count > 0 ) os << " terminations:" << terminations_count;
00162       if( exceptions_count > 0 ) os << " exceptions:" << exceptions_count;
00163       if( failures_count > 0 ) os << " failures:" << failures_count;
00164       if( warnings_count > 0 ) os << " warnings:" << warnings_count;
00165       os << " ok:" << ok_count;
00166       os << std::endl;
00167     }
00168 
00169     bool all_ok() const
00170     {
00171       return not_passed.size() == 0;
00172     }
00173 
00174     private:
00175     void init()
00176     {
00177       ok_count = 0;
00178       exceptions_count = 0;  
00179       failures_count = 0;
00180       terminations_count = 0;
00181       warnings_count = 0;
00182 
00183       not_passed.clear();
00184     }    
00185   };
00186 };
00187 
00188 #endif

Generated on Tue May 10 2011 16:51:50 for wibble by  doxygen 1.7.1