Boost logo

Boost :

From: Gennadiy Rozental (gennadiy.rozental_at_[hidden])
Date: 2006-07-26 12:03:32

"Stephan Tolksdorf" <andorxor_at_[hidden]> wrote in message
> Gennadiy,
> while we are discussing exceptions in Boost::Test, I've got a small
> request:
> Could you maybe provide an equivalent macro to BOOST_CHECKPOINT (or
> extend BOOST_CHECKPOINT) whose message is also displayed if
> BOOST_REQUIRE fails? The reason I ask is that I sometimes outsource
> common testing routines into helper functions and would like to print
> context information if the test fails (as the line number itself is not
> very informative in these instances). I'm sure that would be a help to
> others too.

BOOST_CHECKPOINT would help you in this case. Lets consider your example:

void testHelper(int param1, int param2) {
   std::ostringstream msg;
   msg << "Problem with param1: " << param1 << " Param2: " << param2 << "...

   // do some complicated operations
   BOOST_REQUIRE_EQUAL(some_resulta, some_resultb);
   // some more complicated operation
   BOOST_REQUIRE_EQUAL(some_resultc, some_resultd);

 testHelper( 1, 3);
 testHelper( 7, 7);
 for (int i = 13; i < 51) {
  testHelper( 13, i);

1. Checkpoint in terms of Boost.Test is named passpoint. And passpoint is
the position in a code test pass through. Primary purpose of passpoint is to
report last position passed in case of fatal error or uncaught exception.
Both BOOST_REQUIRE_EQUAL statements above will overwrite the checkpoint
position. Even if BOOST_REQUIRE would report checkpoint position, it would
not help you to separate 2 calls to testHelper.

2. The same issue actually applies to any Boost.Test tool: if tool is used
in shared location there is no way to know the context: where the shared
code was called from. Since in C++ there is no portable automatic traceback
facility, we need some kind of explicit scope tracking.

One solution is to use BOOST_TEST_MESSAGE based solution:

struct boost_test_scope {
  boost_test_scope( const_string scope_name ) // report "Enter scope
  ~boost_test_scope() // report "Leaving scope scope_name"

#define BOOST_TEST_SCOPE( SC ) \
    boost_test_scope scope_guard # __LINE__(
(boost::wrap_stringstream().ref() << M).str() )

There 2 issues with this solution:
1. You need to setup log_level=message
2. Messages are reported always whether or not there were errors in this

An alternative would be new facility: test context. Boost.Test will keep
track of registered contexts and will report the context with any failed
assertion. We could also have a parameter that turn on/off context

If this is acceptable solution I could implement this in 1.35.


Boost list run by bdawes at, gregod at, cpdaniel at, john at