1 // (C) Copyright Gennadiy Rozental 2001-2008. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 // See http://www.boost.org/libs/test for the library home page. 7 // 8 // File : $RCSfile$ 9 // 10 // Version : $Revision: 54633 $ 11 // 12 // Description : defines singleton class unit_test_log and all manipulators. 13 // unit_test_log has output stream like interface. It's implementation is 14 // completely hidden with pimple idiom 15 // *************************************************************************** 16 17 #ifndef BOOST_TEST_UNIT_TEST_LOG_HPP_071894GER 18 #define BOOST_TEST_UNIT_TEST_LOG_HPP_071894GER 19 20 // Boost.Test 21 #include <boost/test/test_observer.hpp> 22 23 #include <boost/test/detail/global_typedef.hpp> 24 #include <boost/test/detail/log_level.hpp> 25 #include <boost/test/detail/fwd_decl.hpp> 26 27 #include <boost/test/utils/wrap_stringstream.hpp> 28 #include <boost/test/utils/trivial_singleton.hpp> 29 #include <boost/test/utils/lazy_ostream.hpp> 30 31 // Boost 32 #include <boost/utility.hpp> 33 34 // STL 35 #include <iosfwd> // for std::ostream& 36 37 #include <boost/test/detail/suppress_warnings.hpp> 38 39 //____________________________________________________________________________// 40 41 namespace boost { 42 43 namespace unit_test { 44 45 // ************************************************************************** // 46 // ************** log manipulators ************** // 47 // ************************************************************************** // 48 49 namespace log { 50 51 struct BOOST_TEST_DECL begin { beginboost::unit_test::log::begin52 begin( const_string fn, std::size_t ln ) 53 : m_file_name( fn ) 54 , m_line_num( ln ) 55 {} 56 57 const_string m_file_name; 58 std::size_t m_line_num; 59 }; 60 61 struct end {}; 62 63 } // namespace log 64 65 // ************************************************************************** // 66 // ************** entry_value_collector ************** // 67 // ************************************************************************** // 68 69 namespace ut_detail { 70 71 class BOOST_TEST_DECL entry_value_collector { 72 public: 73 // Constructors entry_value_collector()74 entry_value_collector() : m_last( true ) {} entry_value_collector(entry_value_collector const & rhs)75 entry_value_collector( entry_value_collector const& rhs ) : m_last( true ) { rhs.m_last = false; } 76 ~entry_value_collector(); 77 78 // collection interface 79 entry_value_collector const& operator<<( lazy_ostream const& ) const; 80 entry_value_collector const& operator<<( const_string ) const; 81 82 private: 83 // Data members 84 mutable bool m_last; 85 }; 86 87 } // namespace ut_detail 88 89 // ************************************************************************** // 90 // ************** unit_test_log ************** // 91 // ************************************************************************** // 92 93 class BOOST_TEST_DECL unit_test_log_t : public test_observer, public singleton<unit_test_log_t> { 94 public: 95 // test_observer interface implementation 96 void test_start( counter_t test_cases_amount ); 97 void test_finish(); 98 void test_aborted(); 99 100 void test_unit_start( test_unit const& ); 101 void test_unit_finish( test_unit const&, unsigned long elapsed ); 102 void test_unit_skipped( test_unit const& ); 103 void test_unit_aborted( test_unit const& ); 104 105 void assertion_result( bool passed ); 106 void exception_caught( execution_exception const& ); 107 priority()108 virtual int priority() { return 1; } 109 110 // log configuration methods 111 void set_stream( std::ostream& ); 112 void set_threshold_level( log_level ); 113 void set_format( output_format ); 114 void set_formatter( unit_test_log_formatter* ); 115 116 // test progress logging 117 void set_checkpoint( const_string file, std::size_t line_num, const_string msg = const_string() ); 118 119 // entry logging 120 unit_test_log_t& operator<<( log::begin const& ); // begin entry 121 unit_test_log_t& operator<<( log::end const& ); // end entry 122 unit_test_log_t& operator<<( log_level ); // set entry level 123 unit_test_log_t& operator<<( const_string ); // log entry value 124 unit_test_log_t& operator<<( lazy_ostream const& ); // log entry value 125 126 ut_detail::entry_value_collector operator()( log_level ); // initiate entry collection 127 128 private: 129 bool log_entry_start(); 130 131 BOOST_TEST_SINGLETON_CONS( unit_test_log_t ); 132 }; // unit_test_log_t 133 134 BOOST_TEST_SINGLETON_INST( unit_test_log ) 135 136 // helper macros 137 #define BOOST_TEST_LOG_ENTRY( ll ) \ 138 (::boost::unit_test::unit_test_log \ 139 << ::boost::unit_test::log::begin( BOOST_TEST_L(__FILE__), __LINE__ ))(ll) \ 140 /**/ 141 142 } // namespace unit_test 143 144 } // namespace boost 145 146 // ************************************************************************** // 147 // ************** Unit test log interface helpers ************** // 148 // ************************************************************************** // 149 150 #define BOOST_TEST_MESSAGE( M ) \ 151 BOOST_TEST_LOG_ENTRY( ::boost::unit_test::log_messages ) \ 152 << (::boost::unit_test::lazy_ostream::instance() << M) \ 153 /**/ 154 155 //____________________________________________________________________________// 156 157 #define BOOST_TEST_PASSPOINT() \ 158 ::boost::unit_test::unit_test_log.set_checkpoint( \ 159 BOOST_TEST_L(__FILE__), \ 160 static_cast<std::size_t>(__LINE__) ) \ 161 /**/ 162 163 //____________________________________________________________________________// 164 165 #define BOOST_TEST_CHECKPOINT( M ) \ 166 ::boost::unit_test::unit_test_log.set_checkpoint( \ 167 BOOST_TEST_L(__FILE__), \ 168 static_cast<std::size_t>(__LINE__), \ 169 (::boost::wrap_stringstream().ref() << M).str() ) \ 170 /**/ 171 172 //____________________________________________________________________________// 173 174 #include <boost/test/detail/enable_warnings.hpp> 175 176 #endif // BOOST_TEST_UNIT_TEST_LOG_HPP_071894GER 177 178