Chris@16: // (C) Copyright Gennadiy Rozental 2001-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : defines singleton class unit_test_log and all manipulators. Chris@16: // unit_test_log has output stream like interface. It's implementation is Chris@16: // completely hidden with pimple idiom Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_UNIT_TEST_LOG_HPP_071894GER Chris@16: #define BOOST_TEST_UNIT_TEST_LOG_HPP_071894GER Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: Chris@16: // STL Chris@16: #include // for std::ostream& Chris@16: Chris@16: #include Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace unit_test { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** log manipulators ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace log { Chris@16: Chris@16: struct BOOST_TEST_DECL begin { Chris@16: begin( const_string fn, std::size_t ln ) Chris@16: : m_file_name( fn ) Chris@16: , m_line_num( ln ) Chris@16: {} Chris@16: Chris@16: const_string m_file_name; Chris@16: std::size_t m_line_num; Chris@16: }; Chris@16: Chris@16: struct end {}; Chris@16: Chris@16: } // namespace log Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** entry_value_collector ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace ut_detail { Chris@16: Chris@16: class BOOST_TEST_DECL entry_value_collector { Chris@16: public: Chris@16: // Constructors Chris@16: entry_value_collector() : m_last( true ) {} Chris@16: entry_value_collector( entry_value_collector const& rhs ) : m_last( true ) { rhs.m_last = false; } Chris@16: ~entry_value_collector(); Chris@16: Chris@16: // collection interface Chris@16: entry_value_collector const& operator<<( lazy_ostream const& ) const; Chris@16: entry_value_collector const& operator<<( const_string ) const; Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: mutable bool m_last; Chris@16: }; Chris@16: Chris@16: } // namespace ut_detail Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** unit_test_log ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: class BOOST_TEST_DECL unit_test_log_t : public test_observer, public singleton { Chris@16: public: Chris@16: // test_observer interface implementation Chris@16: void test_start( counter_t test_cases_amount ); Chris@16: void test_finish(); Chris@16: void test_aborted(); Chris@16: Chris@16: void test_unit_start( test_unit const& ); Chris@16: void test_unit_finish( test_unit const&, unsigned long elapsed ); Chris@16: void test_unit_skipped( test_unit const& ); Chris@16: void test_unit_aborted( test_unit const& ); Chris@16: Chris@16: void assertion_result( bool passed ); Chris@16: void exception_caught( execution_exception const& ); Chris@16: Chris@16: virtual int priority() { return 1; } Chris@16: Chris@16: // log configuration methods Chris@16: void set_stream( std::ostream& ); Chris@16: void set_threshold_level( log_level ); Chris@16: void set_format( output_format ); Chris@16: void set_formatter( unit_test_log_formatter* ); Chris@16: Chris@16: // test progress logging Chris@16: void set_checkpoint( const_string file, std::size_t line_num, const_string msg = const_string() ); Chris@16: Chris@16: // entry logging Chris@16: unit_test_log_t& operator<<( log::begin const& ); // begin entry Chris@16: unit_test_log_t& operator<<( log::end const& ); // end entry Chris@16: unit_test_log_t& operator<<( log_level ); // set entry level Chris@16: unit_test_log_t& operator<<( const_string ); // log entry value Chris@16: unit_test_log_t& operator<<( lazy_ostream const& ); // log entry value Chris@16: Chris@16: ut_detail::entry_value_collector operator()( log_level ); // initiate entry collection Chris@16: Chris@16: private: Chris@16: bool log_entry_start(); Chris@16: Chris@16: BOOST_TEST_SINGLETON_CONS( unit_test_log_t ); Chris@16: }; // unit_test_log_t Chris@16: Chris@16: BOOST_TEST_SINGLETON_INST( unit_test_log ) Chris@16: Chris@16: // helper macros Chris@16: #define BOOST_TEST_LOG_ENTRY( ll ) \ Chris@16: (::boost::unit_test::unit_test_log \ Chris@16: << ::boost::unit_test::log::begin( BOOST_TEST_L(__FILE__), __LINE__ ))(ll) \ Chris@16: /**/ Chris@16: Chris@16: } // namespace unit_test Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** Unit test log interface helpers ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_TEST_MESSAGE( M ) \ Chris@16: BOOST_TEST_LOG_ENTRY( ::boost::unit_test::log_messages ) \ Chris@16: << (::boost::unit_test::lazy_ostream::instance() << M) \ Chris@16: /**/ Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #define BOOST_TEST_PASSPOINT() \ Chris@16: ::boost::unit_test::unit_test_log.set_checkpoint( \ Chris@16: BOOST_TEST_L(__FILE__), \ Chris@16: static_cast(__LINE__) ) \ Chris@16: /**/ Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #define BOOST_TEST_CHECKPOINT( M ) \ Chris@16: ::boost::unit_test::unit_test_log.set_checkpoint( \ Chris@16: BOOST_TEST_L(__FILE__), \ Chris@16: static_cast(__LINE__), \ Chris@16: (::boost::wrap_stringstream().ref() << M).str() ) \ Chris@16: /**/ Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_TEST_UNIT_TEST_LOG_HPP_071894GER Chris@16: