X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fformatter.cc;h=443256b617ecf66ddeb8c98144f8710f8e629c2e;hb=2eb14a59f3626073017de925929dcc7e3e9eb43d;hp=6d4f1a336502c09a3bb028cc4ac804b5b7d104f6;hpb=97b73d47e6a3d5729ba13304ff355a737a34f1b4;p=awesomized%2Flibmemcached diff --git a/libtest/formatter.cc b/libtest/formatter.cc index 6d4f1a33..443256b6 100644 --- a/libtest/formatter.cc +++ b/libtest/formatter.cc @@ -38,11 +38,63 @@ #include -#include +#include #include - +#include +#include + namespace libtest { +std::string& escape4XML(std::string const& arg, std::string& escaped_string) +{ + escaped_string.clear(); + + escaped_string+= '"'; + for (std::string::const_iterator x= arg.begin(), end= arg.end(); x != end; ++x) + { + unsigned char c= *x; + if (c == '&') + { + escaped_string+= "&"; + } + else if (c == '>') + { + escaped_string+= ">"; + } + else if (c == '<') + { + escaped_string+= "<"; + } + else if (c == '\'') + { + escaped_string+= "'"; break; + } + else if (c == '"') + { + escaped_string+= """; + } + else if (c == ' ') + { + escaped_string+= ' '; + } + else if (isalnum(c)) + { + escaped_string+= c; + } + else + { + char const* const hexdig= "0123456789ABCDEF"; + escaped_string+= "&#x"; + escaped_string+= hexdig[c >> 4]; + escaped_string+= hexdig[c & 0xF]; + escaped_string+= ';'; + } + } + escaped_string+= '"'; + + return escaped_string; +} + class TestCase { public: TestCase(const std::string& arg): @@ -97,10 +149,8 @@ Formatter::Formatter(const std::string& frame_name, const std::string& arg) Formatter::~Formatter() { - for (TestCases::iterator iter= _testcases.begin(); iter != _testcases.end(); ++iter) - { - delete *iter; - } + std::for_each(_testcases.begin(), _testcases.end(), DeleteFromVector()); + _testcases.clear(); } TestCase* Formatter::current() @@ -110,8 +160,14 @@ TestCase* Formatter::current() void Formatter::skipped() { + assert(current()); current()->result(TEST_SKIPPED); - Out << name() << "." << current()->name() << "\t\t\t\t\t" << "[ " << test_strerror(current()->result()) << " ]"; + + Out + << "[ " << test_strerror(current()->result()) << " ]" + << "\t\t" + << name() << "." << current()->name() + ; reset(); } @@ -121,7 +177,11 @@ void Formatter::failed() assert(current()); current()->result(TEST_FAILURE); - Out << name() << "." << current()->name() << "\t\t\t\t\t" << "[ " << test_strerror(current()->result()) << " ]"; + Out + << "[ " << test_strerror(current()->result()) << " ]" + << "\t\t" + << name() << "." << current()->name() + ; reset(); } @@ -131,49 +191,63 @@ void Formatter::success(const libtest::Timer& timer_) assert(current()); current()->result(TEST_SUCCESS, timer_); - Out << name() << "." - << current()->name() - << "\t\t\t\t\t" - << current()->timer() - << " [ " << test_strerror(current()->result()) << " ]"; + Out + << "[ " << test_strerror(current()->result()) << " ]" + << "\t" + << current()->timer() + << "\t" + << name() << "." << current()->name() + ; reset(); } void Formatter::xml(libtest::Framework& framework_, std::ofstream& output) { - output << "" << std::endl; + std::string escaped_string; + + output << "" << std::endl; + for (Suites::iterator framework_iter= framework_.suites().begin(); framework_iter != framework_.suites().end(); ++framework_iter) { - output << "\tname() << "\" classname=\"\" package=\"\">" << std::endl; + output << "\t" << std::endl; for (TestCases::iterator case_iter= (*framework_iter)->formatter()->testcases().begin(); case_iter != (*framework_iter)->formatter()->testcases().end(); ++case_iter) { - output << "\t\tname() - << "\" time=\"" + output << "\t\ttimer().elapsed_milliseconds() - << "\">" - << std::endl; + << "\""; switch ((*case_iter)->result()) { case TEST_SKIPPED: + output << ">" << std::endl; output << "\t\t " << std::endl; + output << "\t\t" << std::endl; break; case TEST_FAILURE: + output << ">" << std::endl; output << "\t\t "<< std::endl; + output << "\t\t" << std::endl; break; case TEST_SUCCESS: + output << "/>" << std::endl; break; } - output << "\t\t" << std::endl; } output << "\t" << std::endl; } @@ -185,6 +259,14 @@ void Formatter::push_testcase(const std::string& arg) assert(_suite_name.empty() == false); TestCase* _current_testcase= new TestCase(arg); _testcases.push_back(_current_testcase); + + assert(current()); + + Echo + << "\t\t\t" + << name() << "." << current()->name() + << "... \r" + ; } void Formatter::reset()