inline assertion_result
compare_fpv( Lhs const& lhs, Rhs const& rhs, OP* cmp_operator)
{
- bool result = cmp_operator->eval_direct(lhs, rhs);
+ assertion_result result_direct_compare = cmp_operator->eval_direct(lhs, rhs);
if(fpctraits<OP>::equality_logical_disjunction) {
- return result || compare_fpv<FPT>(lhs, rhs, (op::EQ<Lhs, Rhs>*)0);
+ // this look like this can be simplified, but combining result && compare_fpv
+ // looses the message in the return value of compare_fpv
+ if( result_direct_compare ) {
+ result_direct_compare.message() << "operation" << OP::forward() << "on arguments yields 'true'.";
+ return result_direct_compare;
+ }
+ // result || compare_fpv(EQ)
+ assertion_result result_eq = compare_fpv<FPT>(lhs, rhs, (op::EQ<Lhs, Rhs>*)0);
+ result_direct_compare = result_direct_compare || result_eq;
+ if( !result_eq ) {
+ result_direct_compare.message() << "operation" << op::EQ<Lhs, Rhs>::forward() << "on arguments yields 'false': " << result_eq.message() << ".";
+ }
+ return result_direct_compare;
}
- return result && compare_fpv<FPT>(lhs, rhs, (op::NE<Lhs, Rhs>*)0);
+ if( !result_direct_compare ) {
+ result_direct_compare.message() << "operation" << OP::forward() << " on arguments yields 'false'.";
+ return result_direct_compare;
+ }
+ // result && compare_fpv(NE)
+ assertion_result result_neq = compare_fpv<FPT>(lhs, rhs, (op::NE<Lhs, Rhs>*)0);
+ result_direct_compare = result_direct_compare && result_neq;
+ if( !result_neq ) {
+ result_direct_compare.message() << "operation" << op::NE<Lhs, Rhs>::forward() << "on arguments yields 'false': " << result_neq.message() << ".";
+ }
+ return result_direct_compare;
}
//____________________________________________________________________________//
assertion_result ar( P( fpv ) );
if( !ar )
- ar.message() << "Absolute value exceeds tolerance [|" << fpv << "| > "<< fpc_tolerance<FPT>() << ']';
+ ar.message() << "absolute value exceeds tolerance [|" << fpv << "| > "<< fpc_tolerance<FPT>() << ']';
return ar;
}
assertion_result ar( !P( fpv ) );
if( !ar )
- ar.message() << "Absolute value is within tolerance [|" << fpv << "| < "<< fpc_tolerance<FPT>() << ']';
+ ar.message() << "absolute value is within tolerance [|" << fpv << "| < "<< fpc_tolerance<FPT>() << ']';
return ar;
}
assertion_result ar( P( lhs, rhs ) );
if( !ar )
- ar.message() << "Relative difference exceeds tolerance ["
+ ar.message() << "relative difference exceeds tolerance ["
<< P.tested_rel_diff() << " > " << P.fraction_tolerance() << ']';
return ar;
}
assertion_result ar( !P( lhs, rhs ) );
if( !ar )
- ar.message() << "Relative difference is within tolerance ["
+ ar.message() << "relative difference is within tolerance ["
<< P.tested_rel_diff() << " < " << fpc_tolerance<FPT>() << ']';
return ar;
//____________________________________________________________________________//
-#define DEFINE_FPV_COMPARISON( oper, name, rev ) \
+#define DEFINE_FPV_COMPARISON( oper, name, rev, name_inverse ) \
template<typename Lhs,typename Rhs> \
struct name<Lhs,Rhs,typename boost::enable_if_c< \
(fpc::tolerance_based<Lhs>::value && \
public: \
typedef typename common_type<Lhs,Rhs>::type FPT; \
typedef name<Lhs,Rhs> OP; \
+ typedef name_inverse<Lhs, Rhs> inverse; \
\
typedef assertion_result result_type; \
\
<< tt_detail::print_helper( rhs ); \
} \
\
+ static char const* forward() \
+ { return " " #oper " "; } \
static char const* revert() \
{ return " " #rev " "; } \
}; \