// See http://www.boost.org/libs/test for the library home page.
//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements Unit Test results collecting facility.
+/// @file
+/// Test results collecting facility.
+///
// ***************************************************************************
#ifndef BOOST_TEST_RESULTS_COLLECTOR_IPP_021105GER
#include <boost/test/unit_test_log.hpp>
#include <boost/test/results_collector.hpp>
#include <boost/test/framework.hpp>
+#include <boost/test/execution_monitor.hpp>
#include <boost/test/tree/test_unit.hpp>
#include <boost/test/tree/visitor.hpp>
bool
test_results::passed() const
{
+ // if it is skipped, it is not passed. However, if any children is not failed/aborted
+ // then their skipped status is not taken into account.
return !p_skipped &&
p_test_cases_failed == 0 &&
p_assertions_failed <= p_expected_failures &&
- p_test_cases_skipped == 0 &&
- !p_aborted;
+ // p_test_cases_skipped == 0 &&
+ !p_timed_out &&
+ p_test_cases_timed_out == 0 &&
+ !aborted();
}
+//____________________________________________________________________________//
+
bool
test_results::aborted() const
{
//____________________________________________________________________________//
+bool
+test_results::skipped() const
+{
+ return p_skipped;
+}
+
+//____________________________________________________________________________//
+
int
test_results::result_code() const
{
return passed() ? exit_success
- : ( (p_assertions_failed > p_expected_failures || p_skipped )
+ : ( (p_assertions_failed > p_expected_failures || p_skipped || p_timed_out || p_test_cases_timed_out )
? exit_test_failure
: exit_exception_failure );
}
void
test_results::operator+=( test_results const& tr )
{
+ p_test_suites.value += tr.p_test_suites;
p_assertions_passed.value += tr.p_assertions_passed;
p_assertions_failed.value += tr.p_assertions_failed;
p_warnings_failed.value += tr.p_warnings_failed;
p_test_cases_failed.value += tr.p_test_cases_failed;
p_test_cases_skipped.value += tr.p_test_cases_skipped;
p_test_cases_aborted.value += tr.p_test_cases_aborted;
+ p_test_cases_timed_out.value += tr.p_test_cases_timed_out;
+ p_test_suites_timed_out.value += tr.p_test_suites_timed_out;
p_duration_microseconds.value += tr.p_duration_microseconds;
}
void
test_results::clear()
{
+ p_test_suites.value = 0;
p_assertions_passed.value = 0;
p_assertions_failed.value = 0;
p_warnings_failed.value = 0;
p_test_cases_failed.value = 0;
p_test_cases_skipped.value = 0;
p_test_cases_aborted.value = 0;
+ p_test_cases_timed_out.value = 0;
+ p_test_suites_timed_out.value = 0;
p_duration_microseconds.value= 0;
p_aborted.value = false;
p_skipped.value = false;
+ p_timed_out.value = false;
}
//____________________________________________________________________________//
//____________________________________________________________________________//
+BOOST_TEST_SINGLETON_CONS_IMPL( results_collector_t )
+
+//____________________________________________________________________________//
+
void
results_collector_t::test_start( counter_t )
{
else
m_tr.p_test_cases_passed.value++;
}
- else if( tr.p_skipped )
+ else if( tr.p_timed_out ) {
+ m_tr.p_test_cases_timed_out.value++;
+ }
+ else if( tr.p_skipped || !tc.is_enabled() ) {
m_tr.p_test_cases_skipped.value++;
+ }
else {
if( tr.p_aborted )
m_tr.p_test_cases_aborted.value++;
return true;
m_tr += results_collector.results( ts.p_id );
+ m_tr.p_test_suites.value++;
+
+ if( results_collector.results( ts.p_id ).p_timed_out )
+ m_tr.p_test_suites_timed_out.value++;
return false;
}
void
results_collector_t::test_unit_finish( test_unit const& tu, unsigned long elapsed_in_microseconds )
{
+ test_results & tr = s_rc_impl().m_results_store[tu.p_id];
if( tu.p_type == TUT_SUITE ) {
- results_collect_helper ch( s_rc_impl().m_results_store[tu.p_id], tu );
-
- traverse_test_tree( tu, ch );
+ results_collect_helper ch( tr, tu );
+ traverse_test_tree( tu, ch, true ); // true to ignore the status: we need to count the skipped/disabled tests
}
else {
- test_results & tr = s_rc_impl().m_results_store[tu.p_id];
- tr.p_duration_microseconds.value = elapsed_in_microseconds;
-
bool num_failures_match = tr.p_aborted || tr.p_assertions_failed >= tr.p_expected_failures;
if( !num_failures_match )
BOOST_TEST_FRAMEWORK_MESSAGE( "Test case " << tu.full_name() << " has fewer failures than expected" );
if( !check_any_assertions )
BOOST_TEST_FRAMEWORK_MESSAGE( "Test case " << tu.full_name() << " did not check any assertions" );
}
+ tr.p_duration_microseconds.value = elapsed_in_microseconds;
}
//____________________________________________________________________________//
results_collector_t::test_unit_skipped( test_unit const& tu, const_string /*reason*/ )
{
test_results& tr = s_rc_impl().m_results_store[tu.p_id];
-
tr.clear();
tr.p_skipped.value = true;
if( tu.p_type == TUT_SUITE ) {
- test_case_counter tcc;
- traverse_test_tree( tu, tcc );
+ test_case_counter tcc(true);
+ traverse_test_tree( tu, tcc, true ); // true because need to count the disabled tests/units
tr.p_test_cases_skipped.value = tcc.p_count;
}
//____________________________________________________________________________//
+void
+results_collector_t::test_unit_timed_out(test_unit const& tu)
+{
+ test_results& tr = s_rc_impl().m_results_store[tu.p_id];
+ tr.p_timed_out.value = true;
+}
+
+//____________________________________________________________________________//
+
void
results_collector_t::assertion_result( unit_test::assertion_result ar )
{
//____________________________________________________________________________//
void
-results_collector_t::exception_caught( execution_exception const& )
+results_collector_t::exception_caught( execution_exception const& ex)
{
test_results& tr = s_rc_impl().m_results_store[framework::current_test_case_id()];
tr.p_assertions_failed.value++;
+ if( ex.code() == execution_exception::timeout_error ) {
+ tr.p_timed_out.value = true;
+ }
}
//____________________________________________________________________________//