Hi,
Just wanted a second opinion on how best to handle calling functions which invoke BOOST_REQUIRE and BOOST_CHECK type logic.
For example, if I have a test like:
void stuff( ... )
{
BOOST_REQUIRE( ... );
BOOST_CHECK( ... );
}
BOOST_AUTO_TEST( check_stuff )
{
stuff( case1 );
stuff( case2 );
stuff( case3 );
}
in the CLF log case at least, I only see which lines in stuff failed, but not which which case.
I can change things so that we have:
bool stuff( ... )
{
bool result = true;
if ( ( result = require-predicate ) == true )
result = check-predicate;
return result;
}
BOOST_AUTO_TEST( check_stuff )
{
BOOST_CHECK( stuff( case1 ) );
BOOST_CHECK( stuff( case2 ) );
BOOST_CHECK( stuff( case3 ) );
}
but then I lose the info in the logs over which predicates are failing and it's generally a bit nasty :).
As a result, I've been playing with this which seems to encapsulate things pretty well for me (though may introduce more parenthesis than is strictly necessary and may introduce shadowed variables and other issues?):
#define BOOL_CHECK( result, pred ) { bool pred_result; BOOST_CHECK( pred_result = ( pred ) ); result = pred_result && result; }
#define BOOL_REQUIRE( pred ) { bool pred_result; BOOST_CHECK( pred_result = ( pred ) ); if ( !pred_result ) return pred_result; }
#define BOOL_REQUIRE_EQUAL( name, value ) { bool pred_result; BOOST_CHECK( pred_result = ( ( name ) == ( value ) ) ); if ( !pred_result ) return pred_result; }
void stuff( ... )
{
bool result = true;
BOOL_REQUIRE( ... );
BOOL_CHECK( result, ... );
return result;
}
BOOST_AUTO_TEST( check_stuff )
{
BOOST_CHECK( stuff( case1 ) );
BOOST_CHECK( stuff( case2 ) );
BOOST_CHECK( stuff( case3 ) );
}
when one of the predicates fails, I get 2 errors in the log - the first being the specific line in 'stuff' and the second being failing case.
I've only tested it with g++ and don't know if it's a sensible approach - wondered if any of you guys had any suggestions?
Cheers,
Charlie