diff options
Diffstat (limited to 'adept/tests/tut_reporter.h')
-rw-r--r-- | adept/tests/tut_reporter.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/adept/tests/tut_reporter.h b/adept/tests/tut_reporter.h new file mode 100644 index 0000000..941d653 --- /dev/null +++ b/adept/tests/tut_reporter.h @@ -0,0 +1,182 @@ +#ifndef TUT_REPORTER +#define TUT_REPORTER + +#include <tut.h> + +/** + * Template Unit Tests Framework for C++. + * http://tut.dozen.ru + * + * @author dozen, [email protected] + */ +namespace +{ + std::ostream& operator << (std::ostream& os,const tut::test_result& tr) + { + switch(tr.result) + { + case tut::test_result::ok: + os << '.'; + break; + + case tut::test_result::fail: + os << '[' << tr.test << "=F]"; + break; + + case tut::test_result::ex: + os << '[' << tr.test << "=X]"; + break; + + case tut::test_result::warn: + os << '[' << tr.test << "=W]"; + break; + + case tut::test_result::term: + os << '[' << tr.test << "=T]"; + break; + } + + return os; + } +} + +namespace tut +{ + /** + * Default TUT callback handler. + */ + class reporter : public tut::callback + { + std::string current_group; + typedef std::vector<tut::test_result> not_passed_list; + not_passed_list not_passed; + std::ostream& os; + + public: + int ok_count; + int exceptions_count; + int failures_count; + int terminations_count; + int warnings_count; + + reporter() : os(std::cout) + { + init(); + } + + reporter(std::ostream& out) : os(out) + { + init(); + } + + void run_started() + { + init(); + } + + void test_completed(const tut::test_result& tr) + { + if( tr.group != current_group ) + { + os << std::endl << tr.group << ": " << std::flush; + current_group = tr.group; + } + + os << tr << std::flush; + if( tr.result == tut::test_result::ok ) ok_count++; + else if( tr.result == tut::test_result::ex ) exceptions_count++; + else if( tr.result == tut::test_result::fail ) failures_count++; + else if( tr.result == tut::test_result::warn ) warnings_count++; + else terminations_count++; + + if( tr.result != tut::test_result::ok ) + { + not_passed.push_back(tr); + } + } + + void run_completed() + { + os << std::endl; + + if( not_passed.size() > 0 ) + { + not_passed_list::const_iterator i = not_passed.begin(); + while( i != not_passed.end() ) + { + tut::test_result tr = *i; + + os << std::endl; + + os << "---> " << "test: " << tr.group << ", test<" << tr.test << ">" << std::endl; + + os << " problem: "; + switch(tr.result) + { + case test_result::fail: + os << "assertion failed" << std::endl; + break; + case test_result::ex: + os << "unexpected exception" << std::endl; + if( tr.exception_typeid != "" ) + { + os << " exception typeid: " + << tr.exception_typeid << std::endl; + } + break; + case test_result::term: + os << "would be terminated" << std::endl; + break; + case test_result::warn: + os << "test passed, but cleanup code (destructor) raised an exception" << std::endl; + break; + default: break; + } + + if( tr.message != "" ) + { + if( tr.result == test_result::fail ) + { + os << " failed assertion: \"" << tr.message << "\"" << std::endl; + } + else + { + os << " message: \"" << tr.message << "\"" << std::endl; + } + } + + ++i; + } + } + + os << std::endl; + + os << "tests summary:"; + if( terminations_count > 0 ) os << " terminations:" << terminations_count; + if( exceptions_count > 0 ) os << " exceptions:" << exceptions_count; + if( failures_count > 0 ) os << " failures:" << failures_count; + if( warnings_count > 0 ) os << " warnings:" << warnings_count; + os << " ok:" << ok_count; + os << std::endl; + } + + bool all_ok() const + { + return not_passed.size() == 0; + } + + private: + void init() + { + ok_count = 0; + exceptions_count = 0; + failures_count = 0; + terminations_count = 0; + warnings_count = 0; + + not_passed.clear(); + } + }; +}; + +#endif |