Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2005-2008.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/test for the library home page.
|
Chris@16
|
7 //
|
Chris@16
|
8 // File : $RCSfile$
|
Chris@16
|
9 //
|
Chris@101
|
10 // Version : $Revision$
|
Chris@16
|
11 //
|
Chris@16
|
12 // Description : result reporting facilties
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_TEST_RESULTS_REPORTER_IPP_020105GER
|
Chris@16
|
16 #define BOOST_TEST_RESULTS_REPORTER_IPP_020105GER
|
Chris@16
|
17
|
Chris@16
|
18 // Boost.Test
|
Chris@16
|
19 #include <boost/test/results_reporter.hpp>
|
Chris@16
|
20 #include <boost/test/unit_test_suite_impl.hpp>
|
Chris@16
|
21 #include <boost/test/results_collector.hpp>
|
Chris@16
|
22 #include <boost/test/framework.hpp>
|
Chris@16
|
23 #include <boost/test/output/plain_report_formatter.hpp>
|
Chris@16
|
24 #include <boost/test/output/xml_report_formatter.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 #include <boost/test/detail/unit_test_parameters.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 // Boost
|
Chris@16
|
29 #include <boost/scoped_ptr.hpp>
|
Chris@16
|
30 #include <boost/io/ios_state.hpp>
|
Chris@16
|
31 typedef ::boost::io::ios_base_all_saver io_saver_type;
|
Chris@16
|
32
|
Chris@16
|
33 // STL
|
Chris@16
|
34 #include <iostream>
|
Chris@16
|
35
|
Chris@16
|
36 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
37
|
Chris@16
|
38 //____________________________________________________________________________//
|
Chris@16
|
39
|
Chris@16
|
40 namespace boost {
|
Chris@16
|
41
|
Chris@16
|
42 namespace unit_test {
|
Chris@16
|
43
|
Chris@16
|
44 namespace results_reporter {
|
Chris@16
|
45
|
Chris@16
|
46 // ************************************************************************** //
|
Chris@16
|
47 // ************** result reporter implementation ************** //
|
Chris@16
|
48 // ************************************************************************** //
|
Chris@16
|
49
|
Chris@16
|
50 namespace {
|
Chris@16
|
51
|
Chris@16
|
52 struct results_reporter_impl : test_tree_visitor {
|
Chris@16
|
53 // Constructor
|
Chris@16
|
54 results_reporter_impl()
|
Chris@16
|
55 : m_output( runtime_config::report_sink() )
|
Chris@16
|
56 , m_stream_state_saver( new io_saver_type( *m_output ) )
|
Chris@16
|
57 , m_report_level( CONFIRMATION_REPORT )
|
Chris@16
|
58 , m_formatter( new output::plain_report_formatter )
|
Chris@16
|
59 {}
|
Chris@16
|
60
|
Chris@16
|
61 // test tree visitor interface implementation
|
Chris@16
|
62 void visit( test_case const& tc )
|
Chris@16
|
63 {
|
Chris@16
|
64 m_formatter->test_unit_report_start( tc, *m_output );
|
Chris@16
|
65 m_formatter->test_unit_report_finish( tc, *m_output );
|
Chris@16
|
66 }
|
Chris@16
|
67 bool test_suite_start( test_suite const& ts )
|
Chris@16
|
68 {
|
Chris@16
|
69 m_formatter->test_unit_report_start( ts, *m_output );
|
Chris@16
|
70
|
Chris@16
|
71 if( m_report_level == DETAILED_REPORT && !results_collector.results( ts.p_id ).p_skipped )
|
Chris@16
|
72 return true;
|
Chris@16
|
73
|
Chris@16
|
74 m_formatter->test_unit_report_finish( ts, *m_output );
|
Chris@16
|
75 return false;
|
Chris@16
|
76 }
|
Chris@16
|
77 void test_suite_finish( test_suite const& ts )
|
Chris@16
|
78 {
|
Chris@16
|
79 m_formatter->test_unit_report_finish( ts, *m_output );
|
Chris@16
|
80 }
|
Chris@16
|
81
|
Chris@16
|
82 typedef scoped_ptr<io_saver_type> saver_ptr;
|
Chris@16
|
83
|
Chris@16
|
84 // Data members
|
Chris@16
|
85 std::ostream* m_output;
|
Chris@16
|
86 saver_ptr m_stream_state_saver;
|
Chris@16
|
87 report_level m_report_level;
|
Chris@16
|
88 scoped_ptr<format> m_formatter;
|
Chris@16
|
89 };
|
Chris@16
|
90
|
Chris@16
|
91 results_reporter_impl& s_rr_impl() { static results_reporter_impl the_inst; return the_inst; }
|
Chris@16
|
92
|
Chris@16
|
93 } // local namespace
|
Chris@16
|
94
|
Chris@16
|
95 // ************************************************************************** //
|
Chris@16
|
96 // ************** report configuration ************** //
|
Chris@16
|
97 // ************************************************************************** //
|
Chris@16
|
98
|
Chris@16
|
99 void
|
Chris@16
|
100 set_level( report_level l )
|
Chris@16
|
101 {
|
Chris@16
|
102 if( l != INV_REPORT_LEVEL )
|
Chris@16
|
103 s_rr_impl().m_report_level = l;
|
Chris@16
|
104 }
|
Chris@16
|
105
|
Chris@16
|
106 //____________________________________________________________________________//
|
Chris@16
|
107
|
Chris@16
|
108 void
|
Chris@16
|
109 set_stream( std::ostream& ostr )
|
Chris@16
|
110 {
|
Chris@16
|
111 s_rr_impl().m_output = &ostr;
|
Chris@16
|
112 s_rr_impl().m_stream_state_saver.reset( new io_saver_type( ostr ) );
|
Chris@16
|
113 }
|
Chris@16
|
114
|
Chris@16
|
115 //____________________________________________________________________________//
|
Chris@16
|
116
|
Chris@16
|
117 std::ostream&
|
Chris@16
|
118 get_stream()
|
Chris@16
|
119 {
|
Chris@16
|
120 return *s_rr_impl().m_output;
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 //____________________________________________________________________________//
|
Chris@16
|
124
|
Chris@16
|
125 void
|
Chris@16
|
126 set_format( output_format rf )
|
Chris@16
|
127 {
|
Chris@16
|
128 switch( rf ) {
|
Chris@16
|
129 case CLF:
|
Chris@16
|
130 set_format( new output::plain_report_formatter );
|
Chris@16
|
131 break;
|
Chris@16
|
132 case XML:
|
Chris@16
|
133 set_format( new output::xml_report_formatter );
|
Chris@16
|
134 break;
|
Chris@16
|
135 default:
|
Chris@16
|
136 break;
|
Chris@16
|
137 }
|
Chris@16
|
138 }
|
Chris@16
|
139
|
Chris@16
|
140 //____________________________________________________________________________//
|
Chris@16
|
141
|
Chris@16
|
142 void
|
Chris@16
|
143 set_format( results_reporter::format* f )
|
Chris@16
|
144 {
|
Chris@16
|
145 if( f )
|
Chris@16
|
146 s_rr_impl().m_formatter.reset( f );
|
Chris@16
|
147 }
|
Chris@16
|
148
|
Chris@16
|
149 //____________________________________________________________________________//
|
Chris@16
|
150
|
Chris@16
|
151 // ************************************************************************** //
|
Chris@16
|
152 // ************** report initiation ************** //
|
Chris@16
|
153 // ************************************************************************** //
|
Chris@16
|
154
|
Chris@16
|
155 void
|
Chris@16
|
156 make_report( report_level l, test_unit_id id )
|
Chris@16
|
157 {
|
Chris@16
|
158 if( l == INV_REPORT_LEVEL )
|
Chris@16
|
159 l = s_rr_impl().m_report_level;
|
Chris@16
|
160
|
Chris@16
|
161 if( l == NO_REPORT )
|
Chris@16
|
162 return;
|
Chris@16
|
163
|
Chris@16
|
164 if( id == INV_TEST_UNIT_ID )
|
Chris@16
|
165 id = framework::master_test_suite().p_id;
|
Chris@16
|
166
|
Chris@16
|
167 s_rr_impl().m_stream_state_saver->restore();
|
Chris@16
|
168
|
Chris@16
|
169 report_level bkup = s_rr_impl().m_report_level;
|
Chris@16
|
170 s_rr_impl().m_report_level = l;
|
Chris@16
|
171
|
Chris@16
|
172 s_rr_impl().m_formatter->results_report_start( *s_rr_impl().m_output );
|
Chris@16
|
173
|
Chris@16
|
174 switch( l ) {
|
Chris@16
|
175 case CONFIRMATION_REPORT:
|
Chris@16
|
176 s_rr_impl().m_formatter->do_confirmation_report( framework::get<test_unit>( id ), *s_rr_impl().m_output );
|
Chris@16
|
177 break;
|
Chris@16
|
178 case SHORT_REPORT:
|
Chris@16
|
179 case DETAILED_REPORT:
|
Chris@16
|
180 traverse_test_tree( id, s_rr_impl() );
|
Chris@16
|
181 break;
|
Chris@16
|
182 default:
|
Chris@16
|
183 break;
|
Chris@16
|
184 }
|
Chris@16
|
185
|
Chris@16
|
186 s_rr_impl().m_formatter->results_report_finish( *s_rr_impl().m_output );
|
Chris@16
|
187 s_rr_impl().m_report_level = bkup;
|
Chris@16
|
188 }
|
Chris@16
|
189
|
Chris@16
|
190 //____________________________________________________________________________//
|
Chris@16
|
191
|
Chris@16
|
192 } // namespace results_reporter
|
Chris@16
|
193
|
Chris@16
|
194 } // namespace unit_test
|
Chris@16
|
195
|
Chris@16
|
196 } // namespace boost
|
Chris@16
|
197
|
Chris@16
|
198 //____________________________________________________________________________//
|
Chris@16
|
199
|
Chris@16
|
200 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
201
|
Chris@16
|
202 #endif // BOOST_TEST_RESULTS_REPORTER_IPP_020105GER
|