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