Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r58338 - in trunk/boost/test: detail impl utils
From: gennadiy.rozental_at_[hidden]
Date: 2009-12-13 04:24:48


Author: rogeeff
Date: 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
New Revision: 58338
URL: http://svn.boost.org/trac/boost/changeset/58338

Log:
added support for the colored output
Added:
   trunk/boost/test/utils/setcolor.hpp (contents, props changed)
Text files modified:
   trunk/boost/test/detail/global_typedef.hpp | 7 +++++++
   trunk/boost/test/detail/unit_test_parameters.hpp | 1 +
   trunk/boost/test/impl/compiler_log_formatter.ipp | 31 +++++++++++++++++++++++++++++--
   trunk/boost/test/impl/plain_report_formatter.ipp | 6 ++++++
   trunk/boost/test/impl/progress_monitor.ipp | 9 +++++++++
   trunk/boost/test/impl/unit_test_parameters.ipp | 13 +++++++++++++
   6 files changed, 65 insertions(+), 2 deletions(-)

Modified: trunk/boost/test/detail/global_typedef.hpp
==============================================================================
--- trunk/boost/test/detail/global_typedef.hpp (original)
+++ trunk/boost/test/detail/global_typedef.hpp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -20,6 +20,13 @@
 #define BOOST_TEST_STRINGIZE( s ) BOOST_TEST_L( BOOST_STRINGIZE( s ) )
 #define BOOST_TEST_EMPTY_STRING BOOST_TEST_L( "" )
 
+#define BOOST_TEST_SCOPE_SETCOLOR( os, attr, color ) \
+ scope_setcolor const& sc = runtime_config::color_output() \
+ ? scope_setcolor( os, attr, color ) \
+ : scope_setcolor(); \
+ ut_detail::ignore_unused_variable_warning( sc ) \
+/**/
+
 #include <boost/test/detail/suppress_warnings.hpp>
 
 //____________________________________________________________________________//

Modified: trunk/boost/test/detail/unit_test_parameters.hpp
==============================================================================
--- trunk/boost/test/detail/unit_test_parameters.hpp (original)
+++ trunk/boost/test/detail/unit_test_parameters.hpp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -46,6 +46,7 @@
 BOOST_TEST_DECL bool show_build_info();
 BOOST_TEST_DECL bool show_progress();
 BOOST_TEST_DECL bool catch_sys_errors();
+BOOST_TEST_DECL bool color_output();
 BOOST_TEST_DECL bool auto_start_dbg();
 BOOST_TEST_DECL bool use_alt_stack();
 BOOST_TEST_DECL bool detect_fp_exceptions();

Modified: trunk/boost/test/impl/compiler_log_formatter.ipp
==============================================================================
--- trunk/boost/test/impl/compiler_log_formatter.ipp (original)
+++ trunk/boost/test/impl/compiler_log_formatter.ipp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -21,6 +21,8 @@
 #include <boost/test/framework.hpp>
 #include <boost/test/utils/basic_cstring/io.hpp>
 #include <boost/test/utils/lazy_ostream.hpp>
+#include <boost/test/utils/setcolor.hpp>
+#include <boost/test/detail/unit_test_parameters.hpp>
 
 // Boost
 #include <boost/version.hpp>
@@ -90,6 +92,8 @@
 void
 compiler_log_formatter::test_unit_start( std::ostream& output, test_unit const& tu )
 {
+ BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::BLUE );
+
     output << "Entering test " << tu.p_type_name << " \"" << tu.p_name << "\"" << std::endl;
 }
 
@@ -98,6 +102,8 @@
 void
 compiler_log_formatter::test_unit_finish( std::ostream& output, test_unit const& tu, unsigned long elapsed )
 {
+ BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::BLUE );
+
     output << "Leaving test " << tu.p_type_name << " \"" << tu.p_name << "\"";
 
     if( elapsed > 0 ) {
@@ -116,6 +122,8 @@
 void
 compiler_log_formatter::test_unit_skipped( std::ostream& output, test_unit const& tu )
 {
+ BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::YELLOW );
+
     output << "Test " << tu.p_type_name << " \"" << tu.p_name << "\"" << "is skipped" << std::endl;
 }
     
@@ -127,13 +135,19 @@
     execution_exception::location const& loc = ex.where();
     print_prefix( output, loc.m_file_name, loc.m_line_num );
 
- output << "fatal error in \"" << (loc.m_function.is_empty() ? test_phase_identifier() : loc.m_function ) << "\": ";
+ {
+ BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BLINK, term_color::RED );
 
- output << ex.what();
+ output << "fatal error in \"" << (loc.m_function.is_empty() ? test_phase_identifier() : loc.m_function ) << "\": "
+ << ex.what();
+ }
 
     if( !checkpoint_data.m_file_name.is_empty() ) {
         output << '\n';
         print_prefix( output, checkpoint_data.m_file_name, checkpoint_data.m_line_num );
+
+ BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::CYAN );
+
         output << "last checkpoint";
         if( !checkpoint_data.m_message.empty() )
             output << ": " << checkpoint_data.m_message;
@@ -150,20 +164,30 @@
     switch( let ) {
         case BOOST_UTL_ET_INFO:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
+ if( runtime_config::color_output() )
+ output << setcolor( term_attr::BRIGHT, term_color::GREEN );
             output << "info: ";
             break;
         case BOOST_UTL_ET_MESSAGE:
+ if( runtime_config::color_output() )
+ output << setcolor( term_attr::BRIGHT, term_color::CYAN );
             break;
         case BOOST_UTL_ET_WARNING:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
+ if( runtime_config::color_output() )
+ output << setcolor( term_attr::BRIGHT, term_color::YELLOW );
             output << "warning in \"" << test_phase_identifier() << "\": ";
             break;
         case BOOST_UTL_ET_ERROR:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
+ if( runtime_config::color_output() )
+ output << setcolor( term_attr::BRIGHT, term_color::RED );
             output << "error in \"" << test_phase_identifier() << "\": ";
             break;
         case BOOST_UTL_ET_FATAL_ERROR:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
+ if( runtime_config::color_output() )
+ output << setcolor( term_attr::BLINK, term_color::RED );
             output << "fatal error in \"" << test_phase_identifier() << "\": ";
             break;
     }
@@ -190,9 +214,12 @@
 void
 compiler_log_formatter::log_entry_finish( std::ostream& output )
 {
+ if( runtime_config::color_output() )
+ output << setcolor();
     output << std::endl;
 }
 
+
 //____________________________________________________________________________//
 
 void

Modified: trunk/boost/test/impl/plain_report_formatter.ipp
==============================================================================
--- trunk/boost/test/impl/plain_report_formatter.ipp (original)
+++ trunk/boost/test/impl/plain_report_formatter.ipp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -22,6 +22,8 @@
 #include <boost/test/unit_test_suite_impl.hpp>
 
 #include <boost/test/utils/basic_cstring/io.hpp>
+#include <boost/test/utils/setcolor.hpp>
+#include <boost/test/detail/unit_test_parameters.hpp>
 
 // STL
 #include <iomanip>
@@ -157,10 +159,14 @@
     test_results const& tr = results_collector.results( tu.p_id );
     
     if( tr.passed() ) {
+ BOOST_TEST_SCOPE_SETCOLOR( ostr, term_attr::BRIGHT, term_color::GREEN );
+
         ostr << "*** No errors detected\n";
         return;
     }
         
+ BOOST_TEST_SCOPE_SETCOLOR( ostr, term_attr::BRIGHT, term_color::RED );
+
     if( tr.p_skipped ) {
         ostr << "*** Test " << tu.p_type_name << " skipped due to "
              << (tu.check_dependencies() ? "test aborting\n" : "failed dependancy\n" );

Modified: trunk/boost/test/impl/progress_monitor.ipp
==============================================================================
--- trunk/boost/test/impl/progress_monitor.ipp (original)
+++ trunk/boost/test/impl/progress_monitor.ipp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -20,6 +20,7 @@
 #include <boost/test/unit_test_suite_impl.hpp>
 
 #include <boost/test/detail/unit_test_parameters.hpp>
+#include <boost/test/utils/setcolor.hpp>
 
 // Boost
 #include <boost/progress.hpp>
@@ -58,6 +59,8 @@
 void
 progress_monitor_t::test_start( counter_t test_cases_amount )
 {
+ BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+
     s_pm_impl().m_progress_display.reset( new progress_display( test_cases_amount, *s_pm_impl().m_stream ) );
 }
 
@@ -66,6 +69,8 @@
 void
 progress_monitor_t::test_aborted()
 {
+ BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+
     (*s_pm_impl().m_progress_display) += s_pm_impl().m_progress_display->count();
 }
 
@@ -74,6 +79,8 @@
 void
 progress_monitor_t::test_unit_finish( test_unit const& tu, unsigned long )
 {
+ BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+
     if( tu.p_type == tut_case )
         ++(*s_pm_impl().m_progress_display);
 }
@@ -83,6 +90,8 @@
 void
 progress_monitor_t::test_unit_skipped( test_unit const& tu )
 {
+ BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+
     test_case_counter tcc;
     traverse_test_tree( tu, tcc );
     

Modified: trunk/boost/test/impl/unit_test_parameters.ipp
==============================================================================
--- trunk/boost/test/impl/unit_test_parameters.ipp (original)
+++ trunk/boost/test/impl/unit_test_parameters.ipp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -158,6 +158,7 @@
 std::string BREAK_EXEC_PATH = "break_exec_path";
 std::string BUILD_INFO = "build_info";
 std::string CATCH_SYS_ERRORS = "catch_system_errors";
+std::string COLOR_OUTPUT = "color_output";
 std::string DETECT_FP_EXCEPT = "detect_fp_exceptions";
 std::string DETECT_MEM_LEAKS = "detect_memory_leaks";
 std::string LOG_FORMAT = "log_format";
@@ -179,6 +180,7 @@
     BREAK_EXEC_PATH , "BOOST_TEST_BREAK_EXEC_PATH",
     BUILD_INFO , "BOOST_TEST_BUILD_INFO",
     CATCH_SYS_ERRORS , "BOOST_TEST_CATCH_SYSTEM_ERRORS",
+ COLOR_OUTPUT , "BOOST_TEST_COLOR_OUTPUT",
     DETECT_FP_EXCEPT , "BOOST_TEST_DETECT_FP_EXCEPTIONS",
     DETECT_MEM_LEAKS , "BOOST_TEST_DETECT_MEMORY_LEAK",
     LOG_FORMAT , "BOOST_TEST_LOG_FORMAT",
@@ -261,6 +263,9 @@
           << cla::dual_name_parameter<bool>( CATCH_SYS_ERRORS + "|s" )
             - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
                cla::description = "Allows to switch between catching and ignoring system errors (signals)")
+ << cla::dual_name_parameter<bool>( COLOR_OUTPUT + "|x" )
+ - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
+ cla::description = "Allows to switch between catching and ignoring system errors (signals)")
           << cla::named_parameter<bool>( DETECT_FP_EXCEPT )
             - (cla::prefix = "--",cla::separator = "=",cla::guess_name,cla::optional,
                cla::description = "Allows to switch between catching and ignoring floating point exceptions")
@@ -423,6 +428,14 @@
 //____________________________________________________________________________//
 
 bool
+color_output()
+{
+ return retrieve_parameter( COLOR_OUTPUT, s_cla_parser, false );
+}
+
+//____________________________________________________________________________//
+
+bool
 auto_start_dbg()
 {
     // !! set debugger as an option

Added: trunk/boost/test/utils/setcolor.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/test/utils/setcolor.hpp 2009-12-13 04:24:47 EST (Sun, 13 Dec 2009)
@@ -0,0 +1,121 @@
+// (C) Copyright Gennadiy Rozental 2009.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : contains definition for setcolor iostream manipulator
+// ***************************************************************************
+
+#ifndef BOOST_TEST_SETCOLOR_HPP_121009GER
+#define BOOST_TEST_SETCOLOR_HPP_121009GER
+
+// Boost.Test
+#include <boost/test/detail/config.hpp>
+
+// STL
+#include <iostream>
+#include <cstdio>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+//____________________________________________________________________________//
+
+namespace boost {
+
+namespace unit_test {
+
+// ************************************************************************** //
+// ************** term_attr ************** //
+// ************************************************************************** //
+
+struct term_attr { enum _ {
+ NORMAL = 0,
+ BRIGHT = 1,
+ DIM = 2,
+ UNDERLINE = 4,
+ BLINK = 5,
+ REVERSE = 7,
+ CROSSOUT = 9
+}; };
+
+// ************************************************************************** //
+// ************** term_color ************** //
+// ************************************************************************** //
+
+struct term_color { enum _ {
+ BLACK = 0,
+ RED = 1,
+ GREEN = 2,
+ YELLOW = 3,
+ BLUE = 4,
+ MAGENTA = 5,
+ CYAN = 6,
+ WHITE = 7,
+ ORIGINAL = 9
+}; };
+
+// ************************************************************************** //
+// ************** setcolor ************** //
+// ************************************************************************** //
+
+class setcolor {
+public:
+ // Constructor
+ explicit setcolor( term_attr::_ attr = term_attr::NORMAL,
+ term_color::_ fg = term_color::ORIGINAL,
+ term_color::_ bg = term_color::ORIGINAL )
+ {
+ m_command_size = std::sprintf( m_control_command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40 );
+ }
+
+ friend std::ostream&
+ operator<<( std::ostream& os, setcolor const& sc )
+ {
+ return os.write( sc.m_control_command, sc.m_command_size );
+ }
+
+private:
+ // Data members
+ char m_control_command[13];
+ size_t m_command_size;
+};
+
+// ************************************************************************** //
+// ************** scope_setcolor ************** //
+// ************************************************************************** //
+
+struct scope_setcolor {
+ scope_setcolor() : m_os( 0 ) {}
+ explicit scope_setcolor( std::ostream& os,
+ term_attr::_ attr = term_attr::NORMAL,
+ term_color::_ fg = term_color::ORIGINAL,
+ term_color::_ bg = term_color::ORIGINAL )
+ : m_os( &os )
+ {
+ os << setcolor( attr, fg, bg );
+ }
+ ~scope_setcolor()
+ {
+ if( m_os )
+ *m_os << setcolor();
+ }
+private:
+ // Data members
+ std::ostream* m_os;
+};
+
+} // namespace unit_test
+
+} // namespace boost
+
+//____________________________________________________________________________//
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_SETCOLOR_HPP_121009GER


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk