Chris@16: // (C) Copyright Gennadiy Rozental 2005-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 : result reporting facilties Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_RESULTS_REPORTER_IPP_020105GER Chris@16: #define BOOST_TEST_RESULTS_REPORTER_IPP_020105GER Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: #include Chris@16: typedef ::boost::io::ios_base_all_saver io_saver_type; Chris@16: Chris@16: // STL Chris@16: #include 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: namespace results_reporter { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** result reporter implementation ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace { Chris@16: Chris@16: struct results_reporter_impl : test_tree_visitor { Chris@16: // Constructor Chris@16: results_reporter_impl() Chris@16: : m_output( runtime_config::report_sink() ) Chris@16: , m_stream_state_saver( new io_saver_type( *m_output ) ) Chris@16: , m_report_level( CONFIRMATION_REPORT ) Chris@16: , m_formatter( new output::plain_report_formatter ) Chris@16: {} Chris@16: Chris@16: // test tree visitor interface implementation Chris@16: void visit( test_case const& tc ) Chris@16: { Chris@16: m_formatter->test_unit_report_start( tc, *m_output ); Chris@16: m_formatter->test_unit_report_finish( tc, *m_output ); Chris@16: } Chris@16: bool test_suite_start( test_suite const& ts ) Chris@16: { Chris@16: m_formatter->test_unit_report_start( ts, *m_output ); Chris@16: Chris@16: if( m_report_level == DETAILED_REPORT && !results_collector.results( ts.p_id ).p_skipped ) Chris@16: return true; Chris@16: Chris@16: m_formatter->test_unit_report_finish( ts, *m_output ); Chris@16: return false; Chris@16: } Chris@16: void test_suite_finish( test_suite const& ts ) Chris@16: { Chris@16: m_formatter->test_unit_report_finish( ts, *m_output ); Chris@16: } Chris@16: Chris@16: typedef scoped_ptr saver_ptr; Chris@16: Chris@16: // Data members Chris@16: std::ostream* m_output; Chris@16: saver_ptr m_stream_state_saver; Chris@16: report_level m_report_level; Chris@16: scoped_ptr m_formatter; Chris@16: }; Chris@16: Chris@16: results_reporter_impl& s_rr_impl() { static results_reporter_impl the_inst; return the_inst; } Chris@16: Chris@16: } // local namespace Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** report configuration ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: void Chris@16: set_level( report_level l ) Chris@16: { Chris@16: if( l != INV_REPORT_LEVEL ) Chris@16: s_rr_impl().m_report_level = l; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: void Chris@16: set_stream( std::ostream& ostr ) Chris@16: { Chris@16: s_rr_impl().m_output = &ostr; Chris@16: s_rr_impl().m_stream_state_saver.reset( new io_saver_type( ostr ) ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: std::ostream& Chris@16: get_stream() Chris@16: { Chris@16: return *s_rr_impl().m_output; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: void Chris@16: set_format( output_format rf ) Chris@16: { Chris@16: switch( rf ) { Chris@16: case CLF: Chris@16: set_format( new output::plain_report_formatter ); Chris@16: break; Chris@16: case XML: Chris@16: set_format( new output::xml_report_formatter ); Chris@16: break; Chris@16: default: Chris@16: break; Chris@16: } Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: void Chris@16: set_format( results_reporter::format* f ) Chris@16: { Chris@16: if( f ) Chris@16: s_rr_impl().m_formatter.reset( f ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** report initiation ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: void Chris@16: make_report( report_level l, test_unit_id id ) Chris@16: { Chris@16: if( l == INV_REPORT_LEVEL ) Chris@16: l = s_rr_impl().m_report_level; Chris@16: Chris@16: if( l == NO_REPORT ) Chris@16: return; Chris@16: Chris@16: if( id == INV_TEST_UNIT_ID ) Chris@16: id = framework::master_test_suite().p_id; Chris@16: Chris@16: s_rr_impl().m_stream_state_saver->restore(); Chris@16: Chris@16: report_level bkup = s_rr_impl().m_report_level; Chris@16: s_rr_impl().m_report_level = l; Chris@16: Chris@16: s_rr_impl().m_formatter->results_report_start( *s_rr_impl().m_output ); Chris@16: Chris@16: switch( l ) { Chris@16: case CONFIRMATION_REPORT: Chris@16: s_rr_impl().m_formatter->do_confirmation_report( framework::get( id ), *s_rr_impl().m_output ); Chris@16: break; Chris@16: case SHORT_REPORT: Chris@16: case DETAILED_REPORT: Chris@16: traverse_test_tree( id, s_rr_impl() ); Chris@16: break; Chris@16: default: Chris@16: break; Chris@16: } Chris@16: Chris@16: s_rr_impl().m_formatter->results_report_finish( *s_rr_impl().m_output ); Chris@16: s_rr_impl().m_report_level = bkup; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace results_reporter Chris@16: Chris@16: } // namespace unit_test Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_TEST_RESULTS_REPORTER_IPP_020105GER