1
// (C) Copyright Gennadiy Rozental 2005-2008.
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)
6
// See http://www.boost.org/libs/test for the library home page.
10
// Version : $Revision: 57992 $
12
// Description : implements Unit Test results collecting facility.
13
// ***************************************************************************
15
#ifndef BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER
16
#define BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER
19
#include <boost/test/unit_test_suite_impl.hpp>
20
#include <boost/test/unit_test_log.hpp>
21
#include <boost/test/results_collector.hpp>
22
#include <boost/test/framework.hpp>
25
#include <boost/cstdlib.hpp>
30
#include <boost/test/detail/suppress_warnings.hpp>
32
//____________________________________________________________________________//
38
// ************************************************************************** //
39
// ************** test_results ************** //
40
// ************************************************************************** //
42
test_results::test_results()
47
//____________________________________________________________________________//
50
test_results::passed() const
53
p_test_cases_failed == 0 &&
54
p_assertions_failed <= p_expected_failures &&
58
//____________________________________________________________________________//
61
test_results::result_code() const
63
return passed() ? exit_success
64
: ( (p_assertions_failed > p_expected_failures || p_skipped )
66
: exit_exception_failure );
69
//____________________________________________________________________________//
72
test_results::operator+=( test_results const& tr )
74
p_assertions_passed.value += tr.p_assertions_passed;
75
p_assertions_failed.value += tr.p_assertions_failed;
76
p_test_cases_passed.value += tr.p_test_cases_passed;
77
p_test_cases_failed.value += tr.p_test_cases_failed;
78
p_test_cases_skipped.value += tr.p_test_cases_skipped;
79
p_test_cases_aborted.value += tr.p_test_cases_aborted;
82
//____________________________________________________________________________//
87
p_assertions_passed.value = 0;
88
p_assertions_failed.value = 0;
89
p_expected_failures.value = 0;
90
p_test_cases_passed.value = 0;
91
p_test_cases_failed.value = 0;
92
p_test_cases_skipped.value = 0;
93
p_test_cases_aborted.value = 0;
94
p_aborted.value = false;
95
p_skipped.value = true;
98
//____________________________________________________________________________//
100
// ************************************************************************** //
101
// ************** results_collector ************** //
102
// ************************************************************************** //
104
#if !BOOST_WORKAROUND(BOOST_MSVC, <1300)
108
struct results_collector_impl {
109
std::map<test_unit_id,test_results> m_results_store;
112
results_collector_impl& s_rc_impl() { static results_collector_impl the_inst; return the_inst; }
118
struct results_collector_impl {
119
std::map<test_unit_id,test_results> m_results_store;
122
static results_collector_impl& s_rc_impl() { static results_collector_impl the_inst; return the_inst; }
126
//____________________________________________________________________________//
129
results_collector_t::test_start( counter_t )
131
s_rc_impl().m_results_store.clear();
134
//____________________________________________________________________________//
137
results_collector_t::test_finish()
142
//____________________________________________________________________________//
145
results_collector_t::test_aborted()
150
//____________________________________________________________________________//
153
results_collector_t::test_unit_start( test_unit const& tu )
155
// init test_results entry
156
test_results& tr = s_rc_impl().m_results_store[tu.p_id];
160
tr.p_expected_failures.value = tu.p_expected_failures;
161
tr.p_skipped.value = false;
164
//____________________________________________________________________________//
166
class results_collect_helper : public test_tree_visitor {
168
explicit results_collect_helper( test_results& tr, test_unit const& ts ) : m_tr( tr ), m_ts( ts ) {}
170
void visit( test_case const& tc )
172
test_results const& tr = results_collector.results( tc.p_id );
176
m_tr.p_test_cases_passed.value++;
177
else if( tr.p_skipped )
178
m_tr.p_test_cases_skipped.value++;
181
m_tr.p_test_cases_aborted.value++;
182
m_tr.p_test_cases_failed.value++;
185
bool test_suite_start( test_suite const& ts )
187
if( m_ts.p_id == ts.p_id )
190
m_tr += results_collector.results( ts.p_id );
198
test_unit const& m_ts;
201
//____________________________________________________________________________//
204
results_collector_t::test_unit_finish( test_unit const& tu, unsigned long )
206
if( tu.p_type == tut_suite ) {
207
results_collect_helper ch( s_rc_impl().m_results_store[tu.p_id], tu );
209
traverse_test_tree( tu, ch );
212
test_results const& tr = s_rc_impl().m_results_store[tu.p_id];
214
bool num_failures_match = tr.p_aborted || tr.p_assertions_failed >= tr.p_expected_failures;
215
if( !num_failures_match )
216
BOOST_TEST_MESSAGE( "Test case " << tu.p_name << " has fewer failures than expected" );
218
bool check_any_assertions = tr.p_aborted || (tr.p_assertions_failed != 0) || (tr.p_assertions_passed != 0);
219
if( !check_any_assertions )
220
BOOST_TEST_MESSAGE( "Test case " << tu.p_name << " did not check any assertions" );
224
//____________________________________________________________________________//
227
results_collector_t::test_unit_skipped( test_unit const& tu )
229
if( tu.p_type == tut_suite ) {
230
test_case_counter tcc;
231
traverse_test_tree( tu, tcc );
233
test_results& tr = s_rc_impl().m_results_store[tu.p_id];
237
tr.p_skipped.value = true;
238
tr.p_test_cases_skipped.value = tcc.p_count;
242
//____________________________________________________________________________//
245
results_collector_t::assertion_result( bool passed )
247
test_results& tr = s_rc_impl().m_results_store[framework::current_test_case().p_id];
250
tr.p_assertions_passed.value++;
252
tr.p_assertions_failed.value++;
254
if( tr.p_assertions_failed == 1 )
255
first_failed_assertion();
258
//____________________________________________________________________________//
261
results_collector_t::exception_caught( execution_exception const& )
263
test_results& tr = s_rc_impl().m_results_store[framework::current_test_case().p_id];
265
tr.p_assertions_failed.value++;
268
//____________________________________________________________________________//
271
results_collector_t::test_unit_aborted( test_unit const& tu )
273
s_rc_impl().m_results_store[tu.p_id].p_aborted.value = true;
276
//____________________________________________________________________________//
279
results_collector_t::results( test_unit_id id ) const
281
return s_rc_impl().m_results_store[id];
284
//____________________________________________________________________________//
286
} // namespace unit_test
290
//____________________________________________________________________________//
292
#include <boost/test/detail/enable_warnings.hpp>
294
#endif // BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER