Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.
PrevUpHomeNext

Custom predicate support

Even though supplied testing tools cover wide range of possible checks and provide detailed report on cause of error in some cases you may want to implement and use custom predicate that perform complex check and produce intelligent report on failure. To satisfy this need testing tools implement custom predicate support. There two layers of custom predicate support implemented by testing tools toolbox: with and without custom error message generation.

The first layer is supported by BOOST_<level>_PREDICATE family of testing tools. You can use it to check any custom predicate that reports the result as boolean value. The values of the predicate arguments are reported by the tool automatically in case of failure.

Example: Custom predicate support using BOOST_<level>_PREDICATE

Code

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>

bool is_even( int i )
{
  return i%2 == 0;
}

BOOST_AUTO_TEST_CASE( test_is_even )
{
  BOOST_CHECK_PREDICATE( is_even, (14) );

  int i = 17;
  BOOST_CHECK_PREDICATE( is_even, (i) );
}

Output

> example
Running 1 test case...
test.cpp(13): error in "test_is_even": check is_even( i ) has failed for ( 17 )

*** 1 failures is detected in test suite "example"

To use second layer your predicate has to return boost::test_tools::predicate_result.

This class encapsulates boolean result value along with any error or information message you opt to report.

Usually you construct the instance of class boost::test_tools::predicate_result inside your predicate function and return it by value. The constructor expects one argument - the boolean result value. The constructor is implicit, so you can simply return boolean value from your predicate and boost::test_tools::predicate_result is constructed automatically to hold your value and empty message. You can also assign boolean value to the constructed instance. You can check the current predicate value by using operator! or directly accessing public read-only property p_predicate_value. The error message is stored in public read-write property p_message.

Example: Custom predicate support using class boost::test_tools::predicate_result

Code

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>

boost::test_tools::predicate_result
  compare_lists( std::list<int> const& l1, std::list<int> const& l2 )
{
  if( l1.size() != l2.size() )
  {
    boost::test_tools::predicate_result res( false );

    res.message() << "Different sizes [" << l1.size() << "!=" << l2.size() << "]";

    return res;
  }
  return true;
}

BOOST_AUTO_TEST_CASE( test_list_comparison )
{
  std::list<int> l1, l2;
  l1.push_back( 1 );
  l1.push_back( 2 );

  BOOST_TEST( compare_lists( l1, l2 ) );
}

Output

Running 1 test case...
test.cpp(28): error in "test_list_comparizon": check compare_lists( l1, l2 ) has failed. Different sizes [2!=0]

*** 1 failures is detected in test suite "example"

PrevUpHomeNext