source: NonGTP/Boost/boost/test/impl/results_reporter.ipp @ 857

Revision 857, 6.3 KB checked in by igarcia, 18 years ago (diff)
Line 
1//  (C) Copyright Gennadiy Rozental 2005.
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: results_reporter.ipp,v $
9//
10//  Version     : $Revision: 1.4 $
11//
12//  Description : result reporting facilties
13// ***************************************************************************
14
15#ifndef BOOST_TEST_RESULTS_REPORTER_IPP_020105GER
16#define BOOST_TEST_RESULTS_REPORTER_IPP_020105GER
17
18// Boost.Test
19#include <boost/test/results_reporter.hpp>
20#include <boost/test/unit_test_suite.hpp>
21#include <boost/test/results_collector.hpp>
22#include <boost/test/framework.hpp>
23#include <boost/test/output/plain_report_formatter.hpp>
24#include <boost/test/output/xml_report_formatter.hpp>
25
26#include <boost/test/detail/wrap_io_saver.hpp>
27
28// Boost
29#include <boost/scoped_ptr.hpp>
30
31// STL
32#include <iostream>
33
34#include <boost/test/detail/suppress_warnings.hpp>
35
36//____________________________________________________________________________//
37
38namespace boost {
39
40namespace unit_test {
41
42namespace results_reporter {
43
44// ************************************************************************** //
45// **************        result reporter implementation        ************** //
46// ************************************************************************** //
47
48namespace {
49
50struct results_reporter_impl : test_tree_visitor {
51    // Constructor
52    results_reporter_impl()
53    : m_output( &std::cerr )
54    , m_stream_state_saver( new io_saver_type( std::cerr ) )
55    , m_report_level( CONFIRMATION_REPORT )
56    , m_formatter( new output::plain_report_formatter )
57    {}
58
59    // test tree visitor interface implementation
60    void    visit( test_case const& tc )
61    {
62        m_formatter->test_unit_report_start( tc, *m_output );
63        m_formatter->test_unit_report_finish( tc, *m_output );
64    }
65    bool    test_suite_start( test_suite const& ts )
66    {
67        m_formatter->test_unit_report_start( ts, *m_output );
68
69        if( m_report_level == DETAILED_REPORT && !results_collector.results( ts.p_id ).p_skipped )
70            return true;
71
72        m_formatter->test_unit_report_finish( ts, *m_output );
73        return false;
74    }
75    void    test_suite_finish( test_suite const& ts )
76    {
77        m_formatter->test_unit_report_finish( ts, *m_output );
78    }
79
80    typedef scoped_ptr<io_saver_type> saver_ptr;
81
82    // Data members
83    std::ostream*       m_output;
84    saver_ptr           m_stream_state_saver;
85    report_level        m_report_level;
86    scoped_ptr<format>  m_formatter;
87};
88
89results_reporter_impl& s_rr_impl() { static results_reporter_impl the_inst; return the_inst; }
90
91} // local namespace
92
93// ************************************************************************** //
94// **************              report configuration            ************** //
95// ************************************************************************** //
96
97void
98set_level( report_level l )
99{
100    if( l != INV_REPORT_LEVEL )
101        s_rr_impl().m_report_level = l;
102}
103
104//____________________________________________________________________________//
105
106void
107set_stream( std::ostream& ostr )
108{
109    s_rr_impl().m_output = &ostr;
110    s_rr_impl().m_stream_state_saver.reset( new io_saver_type( ostr ) );
111}
112
113//____________________________________________________________________________//
114
115void
116set_format( output_format rf )
117{
118    switch( rf ) {
119    case CLF:
120        set_format( new output::plain_report_formatter );
121        break;
122    case XML:
123        set_format( new output::xml_report_formatter );
124        break;
125    }
126}
127
128//____________________________________________________________________________//
129
130void
131set_format( results_reporter::format* f )
132{
133    if( f )
134        s_rr_impl().m_formatter.reset( f );
135}
136
137//____________________________________________________________________________//
138
139// ************************************************************************** //
140// **************               report initiation              ************** //
141// ************************************************************************** //
142
143void
144make_report( report_level l, test_unit_id id )
145{
146    if( l == INV_REPORT_LEVEL )
147        l = s_rr_impl().m_report_level;
148
149    if( l == NO_REPORT )
150        return;
151
152    if( id == INV_TEST_UNIT_ID )
153        id = framework::master_test_suite().p_id;
154
155    s_rr_impl().m_stream_state_saver->restore();
156
157    report_level bkup = s_rr_impl().m_report_level;
158    s_rr_impl().m_report_level = l;
159
160    s_rr_impl().m_formatter->results_report_start( *s_rr_impl().m_output );
161
162    switch( l ) {
163    case CONFIRMATION_REPORT:
164        s_rr_impl().m_formatter->do_confirmation_report( framework::get<test_unit>( id ), *s_rr_impl().m_output );
165        break;
166    case SHORT_REPORT:
167    case DETAILED_REPORT:
168        traverse_test_tree( id, s_rr_impl() );
169        break;
170    default:
171        break;
172    }
173
174    s_rr_impl().m_formatter->results_report_finish( *s_rr_impl().m_output );
175    s_rr_impl().m_report_level = bkup;
176}
177
178//____________________________________________________________________________//
179
180} // namespace results_reporter
181
182} // namespace unit_test
183
184} // namespace boost
185
186//____________________________________________________________________________//
187
188#include <boost/test/detail/enable_warnings.hpp>
189
190// ***************************************************************************
191//  Revision History :
192//
193//  $Log: results_reporter.ipp,v $
194//  Revision 1.4  2005/04/30 16:48:51  rogeeff
195//  io saver warkaround for classic io is shared
196//
197//  Revision 1.3  2005/04/29 06:27:45  rogeeff
198//  bug fix for manipulator nandling
199//  bug fix for invalid output stream
200//  bug fix for set_format function implementation
201//
202//  Revision 1.2  2005/02/21 10:12:20  rogeeff
203//  Support for random order of test cases implemented
204//
205//  Revision 1.1  2005/02/20 08:27:07  rogeeff
206//  This a major update for Boost.Test framework. See release docs for complete list of fixes/updates
207//
208// ***************************************************************************
209
210#endif // BOOST_TEST_RESULTS_REPORTER_IPP_020105GER
Note: See TracBrowser for help on using the repository browser.