libtest: improve output format; makes eyes hurt less
authorMichael Wallner <mike@php.net>
Tue, 7 Jan 2020 21:13:42 +0000 (22:13 +0100)
committerMichael Wallner <mike@php.net>
Tue, 7 Jan 2020 21:22:24 +0000 (22:22 +0100)
libtest/collection.cc
libtest/formatter.cc
libtest/stream.h

index 2f1cba317857353ed5b18a116958a8dd765f5f7c..0b2b32492230b3f83c22229291eaeb2fdce1804f 100644 (file)
@@ -138,9 +138,9 @@ test_return_t Collection::exec()
       }
       catch (const libtest::fatal& e)
       {
-        stream::cerr(e.file(), e.line(), e.func()) << e.what();
         _failed++;
         formatter()->failed();
+        stream::make_cerr(e.file(), e.line(), e.func()) << e.what();
         throw;
       }
 
index 7cb3ea0ab8fb55ca8b7e0083b66638527128017a..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)
@@ -159,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();
 }
@@ -173,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();
 }
@@ -184,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();
 }
@@ -252,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()
index 081c2bf04ef26685677d58af17a448f95071025d..0124b9d256d0242f2c9fb6038771b2c19e18ad22 100644 (file)
@@ -111,6 +111,37 @@ template<class Ch, class Tr, class A>
     }
   };
 
+template<class Ch, class Tr, class A>
+  class channelfl {
+  private:
+
+  public:
+    typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
+
+  public:
+    void operator()(const stream_buffer& s, std::ostream& _out,
+                    const char* filename, int line_number, const char* func)
+    {
+      if (filename)
+      {
+        _out
+          << filename
+          << ":"
+          << line_number
+          << ": in "
+          << func << "() "
+          << s.str()
+          << std::flush;
+      }
+      else
+      {
+        _out
+          << s.str()
+          << std::flush;
+      }
+    }
+  };
+
 template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = char, class Tr = std::char_traits<Ch>, class A = std::allocator<Ch> >
   class log {
   private:
@@ -207,11 +238,23 @@ private:
   const cout& operator=( const cout& );
 };
 
+class cecho : public detail::log<detail::channelfl> {
+public:
+  cecho(const char* filename, int line_number, const char* func) :
+    detail::log<detail::channelfl>(std::cout, filename, line_number, func)
+  { }
+
+private:
+  cecho( const cecho& );
+  const cecho& operator=( const cecho& );
+};
 
 } // namespace stream
 
 #define Error stream::cerr(__FILE__, __LINE__, __func__)
 
+#define Echo stream::cecho(NULL, __LINE__, __func__)
+
 #define Out stream::cout(NULL, __LINE__, __func__)
 
 #define Outn() stream::cout(NULL, __LINE__, __func__) << " "