/* * Created by Phil on 11/5/2012. * Copyright 2012 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_CATCH_EXPRESSION_HPP_INCLUDED #define TWOBLUECUBES_CATCH_EXPRESSION_HPP_INCLUDED #include "catch_assertionresult_builder.h" #include "catch_evaluate.hpp" namespace Catch { template inline void setResultIfBoolean( AssertionResultBuilder&, const T& ) {} inline void setResultIfBoolean( AssertionResultBuilder& result, bool value ) { result.setResultType( value ); } template class Expression { void operator = ( const Expression& ); public: Expression( T lhs ) : m_lhs( lhs ) { setResultIfBoolean( m_result.setLhs( Catch::toString( lhs ) ), lhs ); } template AssertionResultBuilder& operator == ( const RhsT& rhs ) { return captureExpression( rhs ); } template AssertionResultBuilder& operator != ( const RhsT& rhs ) { return captureExpression( rhs ); } template AssertionResultBuilder& operator < ( const RhsT& rhs ) { return captureExpression( rhs ); } template AssertionResultBuilder& operator > ( const RhsT& rhs ) { return captureExpression( rhs ); } template AssertionResultBuilder& operator <= ( const RhsT& rhs ) { return captureExpression( rhs ); } template AssertionResultBuilder& operator >= ( const RhsT& rhs ) { return captureExpression( rhs ); } AssertionResultBuilder& operator == ( bool rhs ) { return captureExpression( rhs ); } AssertionResultBuilder& operator != ( bool rhs ) { return captureExpression( rhs ); } AssertionResultBuilder negate( bool shouldNegate ) { return m_result.negate( shouldNegate ); } template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( const RhsT& ); template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( const RhsT& ); private: template AssertionResultBuilder& captureExpression( const RhsT& rhs ) { return m_result .setResultType( Internal::compare( m_lhs, rhs ) ) .setRhs( Catch::toString( rhs ) ) .setOp( Internal::OperatorTraits::getName() ); } private: AssertionResultBuilder m_result; T m_lhs; }; } // end namespace Catch #endif // TWOBLUECUBES_CATCH_EXPRESSION_HPP_INCLUDED