tut_reporter.h
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:4k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #ifndef TUT_REPORTER
  2. #define TUT_REPORTER
  3. #include "tut.h"
  4. /**
  5.  * Template Unit Tests Framework for C++.
  6.  * http://tut.dozen.ru
  7.  *
  8.  * @author dozen, tut@dozen.ru
  9.  */
  10. namespace
  11. {
  12.   std::ostream& operator << (std::ostream& os,const tut::test_result& tr)
  13.   {
  14.     switch(tr.result)
  15.     {
  16.       case tut::test_result::ok: 
  17.       os << '.'; 
  18.       break;
  19.       case tut::test_result::fail: 
  20.       os << '[' << tr.test << "=F]";
  21.       break;
  22.       case tut::test_result::ex_ctor: 
  23.       os << '[' << tr.test << "=C]";
  24.       break;
  25.       case tut::test_result::ex: 
  26.       os << '[' << tr.test << "=X]";
  27.       break;
  28.       case tut::test_result::warn: 
  29.       os << '[' << tr.test << "=W]";
  30.       break;
  31.       case tut::test_result::term: 
  32.       os << '[' << tr.test << "=T]";
  33.       break;
  34.     }
  35.     return os;
  36.   }
  37. }
  38. namespace tut
  39. {
  40.   /**
  41.    * Default TUT callback handler.
  42.    */
  43.   class reporter : public tut::callback
  44.   {
  45.     std::string current_group;
  46.     typedef std::vector<tut::test_result> not_passed_list;
  47.     not_passed_list not_passed;
  48.     std::ostream& os;
  49.   public:
  50.     int ok_count;
  51.     int exceptions_count;
  52.     int failures_count;
  53.     int terminations_count;
  54.     int warnings_count;
  55.     reporter() : os(std::cout)
  56.     {
  57.       init();
  58.     }
  59.     reporter(std::ostream& out) : os(out)
  60.     {
  61.       init();
  62.     }
  63.     void run_started()
  64.     {
  65.       init();
  66.     }
  67.     void test_completed(const tut::test_result& tr)
  68.     {
  69.       if( tr.group != current_group )
  70.       {
  71.         os << std::endl << tr.group << ": " << std::flush;
  72.         current_group = tr.group;
  73.       }
  74.       os << tr << std::flush;
  75.       if( tr.result == tut::test_result::ok ) ok_count++;
  76.       else if( tr.result == tut::test_result::ex ) exceptions_count++;
  77.       else if( tr.result == tut::test_result::ex_ctor ) exceptions_count++;
  78.       else if( tr.result == tut::test_result::fail ) failures_count++;
  79.       else if( tr.result == tut::test_result::warn ) warnings_count++;
  80.       else terminations_count++;
  81.       if( tr.result != tut::test_result::ok )
  82.       {
  83.         not_passed.push_back(tr);
  84.       }
  85.     }
  86.     void run_completed()
  87.     {
  88.       os << std::endl;
  89.       if( not_passed.size() > 0 )
  90.       {
  91.         not_passed_list::const_iterator i = not_passed.begin();
  92.         while( i != not_passed.end() )
  93.         {
  94.            tut::test_result tr = *i;
  95.            os << std::endl;
  96.            os << "---> " << "group: " << tr.group << ", test: test<" << tr.test << ">" << std::endl;
  97.            os << "     problem: ";
  98.            switch(tr.result)
  99.            {
  100.              case test_result::fail: 
  101.                os << "assertion failed" << std::endl; 
  102.                break;
  103.              case test_result::ex: 
  104.              case test_result::ex_ctor: 
  105.                os << "unexpected exception" << std::endl;
  106.                if( tr.exception_typeid != "" )
  107.                { 
  108.                  os << "     exception typeid: " 
  109.                     << tr.exception_typeid << std::endl;
  110.                }
  111.                break;
  112.              case test_result::term: 
  113.                os << "would be terminated" << std::endl; 
  114.                break;
  115.              case test_result::warn: 
  116.                os << "test passed, but cleanup code (destructor) raised an exception" << std::endl; 
  117.                break;
  118.              default: break;
  119.            }
  120.            if( tr.message != "" )
  121.            {
  122.              if( tr.result == test_result::fail )
  123.              {
  124.                os << "     failed assertion: "" << tr.message << """ << std::endl;
  125.              }
  126.              else
  127.              {
  128.                os << "     message: "" << tr.message << """ << std::endl;
  129.              }
  130.            }
  131.            ++i;
  132.         }
  133.       }
  134.       os << std::endl;
  135.       os << "tests summary:";
  136.       if( terminations_count > 0 ) os << " terminations:" << terminations_count;
  137.       if( exceptions_count > 0 ) os << " exceptions:" << exceptions_count;
  138.       if( failures_count > 0 ) os << " failures:" << failures_count;
  139.       if( warnings_count > 0 ) os << " warnings:" << warnings_count;
  140.       os << " ok:" << ok_count;
  141.       os << std::endl;
  142.     }
  143.     bool all_ok() const
  144.     {
  145.       return not_passed.size() == 0;
  146.     }
  147.     private:
  148.     void init()
  149.     {
  150.       ok_count = 0;
  151.       exceptions_count = 0;  
  152.       failures_count = 0;
  153.       terminations_count = 0;
  154.       warnings_count = 0;
  155.       not_passed.clear();
  156.     }    
  157.   };
  158. };
  159. #endif