summaryrefslogtreecommitdiffstats
path: root/adept/tests/tut_reporter.h
diff options
context:
space:
mode:
Diffstat (limited to 'adept/tests/tut_reporter.h')
-rw-r--r--adept/tests/tut_reporter.h182
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