libtest: improve output format; makes eyes hurt less
[awesomized/libmemcached] / libtest / formatter.cc
index a45d9c4f376927b27e22539252efc4623f5c5cb0..443256b617ecf66ddeb8c98144f8710f8e629c2e 100644 (file)
@@ -41,7 +41,8 @@
 #include <algorithm>
 #include <fstream>
 #include <iostream>
-  
+#include <ostream>
+
 namespace libtest {
 
 std::string& escape4XML(std::string const& arg, std::string& escaped_string)
@@ -52,39 +53,41 @@ std::string& escape4XML(std::string const& arg, std::string& escaped_string)
   for (std::string::const_iterator x= arg.begin(), end= arg.end(); x != end; ++x)
   {
     unsigned char c= *x;
-    if (' ' <= c and c <= '~' and c != '\\' and c != '"' and c != '>' and c != '<')
+    if (c == '&')
     {
-      escaped_string+= c;
+      escaped_string+= "&amp;";
     }
     else if (c == '>')
     {
-      escaped_string+= '&';
-      escaped_string+= 'g';
-      escaped_string+= 't';
-      escaped_string+= ';';
+      escaped_string+= "&gt;";
     }
     else if (c == '<')
     {
-      escaped_string+= '&';
-      escaped_string+= 'l';
-      escaped_string+= 't';
-      escaped_string+= ';';
+      escaped_string+= "&lt;";
+    }
+    else if (c == '\'')
+    {
+      escaped_string+= "&apos;";  break;
+    }
+    else if (c == '"')
+    {
+      escaped_string+= "&quot;";
+    }
+    else if (c == ' ')
+    {
+      escaped_string+= ' ';
+    }
+    else if (isalnum(c))
+    {
+      escaped_string+= c;
     }
     else 
     {
-      escaped_string+= '\\';
-      switch (c) {
-        case '"':  escaped_string+= '"';  break;
-        case '\\': escaped_string+= '\\'; break;
-        case '\t': escaped_string+='t';  break;
-        case '\r': escaped_string+='r';  break;
-        case '\n': escaped_string+='n';  break;
-        default:
-                   char const* const hexdig= "0123456789ABCDEF";
-                   escaped_string+= 'x';
-                   escaped_string+= hexdig[c >> 4];
-                   escaped_string+= hexdig[c & 0xF];
-      }
+      char const* const hexdig= "0123456789ABCDEF";
+      escaped_string+= "&#x";
+      escaped_string+= hexdig[c >> 4];
+      escaped_string+= hexdig[c & 0xF];
+      escaped_string+= ';';
     }
   }
   escaped_string+= '"';
@@ -157,11 +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();
 }
@@ -171,9 +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();
 }
@@ -182,13 +190,14 @@ void Formatter::success(const libtest::Timer& timer_)
 {
   assert(current());
   current()->result(TEST_SUCCESS, timer_);
-  std::string escaped_string;
 
-  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();
 }
@@ -250,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()