3 changes: 3 additions & 0 deletions doc/closing_chapters/change_log.qbk
Expand Up @@ -28,16 +28,19 @@ Boost.Test releases:
[h5 New features]

* Support for C++17 `std::string_view` has been added.
* Better diagnostic on `boost::exception` and no rtti mode (thanks to Mikhail Pilin / [pull_request 234])

[h5 Bugfixes and feature requests]

# [github_issue 206] compile-time disabled test not correctly handled by junit log
# [github_issue 217] Data test cases fail with `bool` initializer list
# [github_issue 223] Unable to filter test by name (`-t`, `--run_test`) if template type contains multiple parameters
# [github_issue 229] Random shuffle deprecated

# [pull_request 227] Add `printf` format checking attribute to `report_error`
# [pull_request 231] OpenBSD is missing `SI_ASYNCIO` and `SI_MESGQ`
# [pull_request 232] fix timeout in windows
# [pull_request 234] `boost::diagnostic_information()` works in no `rtti` mode

[#ref_CHANGE_LOG_3_11][h4 Boost.Test v3.11 / boost 1.71]

Expand Down
4 changes: 0 additions & 4 deletions include/boost/test/impl/execution_monitor.ipp
Expand Up @@ -1309,11 +1309,7 @@ execution_monitor::execute( boost::function<int ()> const& F )
catch( boost::exception const& ex )
{ detail::report_error( execution_exception::cpp_exception_error,
&ex,
#if defined(BOOST_NO_TYPEID) || defined(BOOST_NO_RTTI)
"unknown boost::exception" ); }
#else
"%s", boost::diagnostic_information(ex).c_str() ); }
#endif

// std:: exceptions
#if defined(BOOST_NO_TYPEID) || defined(BOOST_NO_RTTI)
Expand Down
5 changes: 4 additions & 1 deletion include/boost/test/impl/framework.ipp
Expand Up @@ -666,8 +666,11 @@ public:

execution_result result = unit_test_monitor_t::test_ok;

if( !tu.is_enabled() )
if( !tu.is_enabled() ) {
BOOST_TEST_FOREACH( test_observer*, to, m_observers )
to->test_unit_skipped( tu, "disabled" );
return result;
}

// 10. Check preconditions, including zero time left for execution and
// successful execution of all dependencies
Expand Down
1 change: 0 additions & 1 deletion include/boost/test/impl/junit_log_formatter.ipp
Expand Up @@ -23,7 +23,6 @@
#include <boost/test/framework.hpp>

#include <boost/test/tree/visitor.hpp>
#include <boost/test/tree/test_case_counter.hpp>
#include <boost/test/tree/traverse.hpp>
#include <boost/test/results_collector.hpp>

Expand Down
22 changes: 10 additions & 12 deletions include/boost/test/impl/results_collector.ipp
Expand Up @@ -189,10 +189,12 @@ public:
else
m_tr.p_test_cases_passed.value++;
}
else if( tr.p_timed_out )
else if( tr.p_timed_out ) {
m_tr.p_test_cases_timed_out.value++;
else if( tr.p_skipped )
}
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++;
Expand Down Expand Up @@ -224,17 +226,12 @@ private:
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 );

s_rc_impl().m_results_store[tu.p_id].p_duration_microseconds.value = elapsed_in_microseconds;
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" );
Expand All @@ -243,6 +240,7 @@ results_collector_t::test_unit_finish( test_unit const& tu, unsigned long elapse
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;
}

//____________________________________________________________________________//
Expand All @@ -256,8 +254,8 @@ results_collector_t::test_unit_skipped( test_unit const& tu, const_string /*reas
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;
}
Expand Down
12 changes: 9 additions & 3 deletions include/boost/test/tree/test_case_counter.hpp
Expand Up @@ -34,13 +34,19 @@ namespace unit_test {
class test_case_counter : public test_tree_visitor {
public:
// Constructor
test_case_counter() : p_count( 0 ) {}
// @param ignore_disabled ignore the status when counting
test_case_counter(bool ignore_status = false)
: p_count( 0 )
, m_ignore_status(ignore_status)
{}

BOOST_READONLY_PROPERTY( counter_t, (test_case_counter)) p_count;
private:
// test tree visitor interface
virtual void visit( test_case const& tc ) { if( tc.is_enabled() ) ++p_count.value; }
virtual bool test_suite_start( test_suite const& ts ) { return ts.is_enabled(); }
virtual void visit( test_case const& tc ) { if( m_ignore_status || tc.is_enabled() ) ++p_count.value; }
virtual bool test_suite_start( test_suite const& ts ) { return m_ignore_status || ts.is_enabled(); }

bool m_ignore_status;
};

} // namespace unit_test
Expand Down
2 changes: 1 addition & 1 deletion include/boost/test/unit_test_log.hpp
Expand Up @@ -245,7 +245,7 @@ BOOST_TEST_SINGLETON_INST( unit_test_log )
(::boost::unit_test::unit_test_log \
<< ::boost::unit_test::log::begin( \
"boost.test framework", \
__LINE__ )) \
0 )) \
( ::boost::unit_test::log_messages ) \
<< BOOST_TEST_LAZY_MSG( M ) \
/**/
Expand Down
1 change: 1 addition & 0 deletions test/Jamfile.v2
Expand Up @@ -149,6 +149,7 @@ test-suite "framework-ts"
[ boost.test-self-test run : framework-ts : message-in-datatestcase-test : : baseline-outputs/messages-in-datasets-test.pattern : : : : $(requirements_datasets) ]
[ boost.test-self-test run : framework-ts : decorators-datatestcase-test : : : : : : $(requirements_datasets) ]
[ compile-fail framework-ts/master-test-suite-non-copyable-test.cpp ../build//included ]
[ boost.test-self-test run : framework-ts : log-count-skipped-test : included : baseline-outputs/log-count-skipped-tests.pattern ]

# ticket 13371: "Use-after-free with --log_sink=file"
# this single check is not enough as we should check for various command line options: we make extensive
Expand Down