You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.1 KiB
183 lines
4.1 KiB
15 years ago
|
#ifndef TUT_REPORTER
|
||
|
#define TUT_REPORTER
|
||
|
|
||
|
#include <tut.h>
|
||
|
|
||
|
/**
|
||
|
* Template Unit Tests Framework for C++.
|
||
|
* http://tut.dozen.ru
|
||
|
*
|
||
|
* @author dozen, tut@dozen.ru
|
||
|
*/
|
||
|
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
|