wibble
0.1.28
|
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