Files
Catch2/include/internal/catch_expression_lhs.hpp
T

175 lines
5.4 KiB
C++
Raw Normal View History

2012-11-01 08:27:09 +00:00
/*
* 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_LHS_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED
2014-05-28 18:53:01 +01:00
#include "catch_result_builder.h"
2012-11-01 08:27:09 +00:00
#include "catch_evaluate.hpp"
2014-04-23 06:51:58 +01:00
#include "catch_tostring.h"
2012-11-01 08:27:09 +00:00
namespace Catch {
2017-01-09 13:23:10 +01:00
template<typename LhsT, Internal::Operator Op, typename RhsT>
class BinaryExpression;
2012-11-01 08:27:09 +00:00
2017-01-09 13:23:10 +01:00
template<typename ArgT, typename MatcherT>
class MatchExpression;
// Wraps the LHS of an expression and overloads comparison operators
// for also capturing those and RHS (if any)
template<typename T>
class ExpressionLhs : public DecomposedExpression {
2012-11-01 08:27:09 +00:00
public:
ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {}
2012-11-01 08:27:09 +00:00
ExpressionLhs& operator = ( const ExpressionLhs& );
2012-11-01 08:27:09 +00:00
template<typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Internal::IsEqualTo, RhsT const&>
operator == ( RhsT const& rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsEqualTo>( rhs );
}
template<typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Internal::IsNotEqualTo, RhsT const&>
operator != ( RhsT const& rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsNotEqualTo>( rhs );
}
2013-07-03 19:14:59 +01:00
2012-11-01 08:27:09 +00:00
template<typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Internal::IsLessThan, RhsT const&>
operator < ( RhsT const& rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsLessThan>( rhs );
}
2013-07-03 19:14:59 +01:00
2012-11-01 08:27:09 +00:00
template<typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Internal::IsGreaterThan, RhsT const&>
operator > ( RhsT const& rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsGreaterThan>( rhs );
}
2013-07-03 19:14:59 +01:00
2012-11-01 08:27:09 +00:00
template<typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Internal::IsLessThanOrEqualTo, RhsT const&>
operator <= ( RhsT const& rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
}
2013-07-03 19:14:59 +01:00
2012-11-01 08:27:09 +00:00
template<typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Internal::IsGreaterThanOrEqualTo, RhsT const&>
operator >= ( RhsT const& rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
}
BinaryExpression<T, Internal::IsEqualTo, bool> operator == ( bool rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsEqualTo>( rhs );
}
2013-07-03 19:14:59 +01:00
BinaryExpression<T, Internal::IsNotEqualTo, bool> operator != ( bool rhs ) {
2012-11-01 08:27:09 +00:00
return captureExpression<Internal::IsNotEqualTo>( rhs );
}
2013-07-03 19:14:59 +01:00
2014-05-28 18:53:01 +01:00
void endExpression() {
2017-01-09 13:23:10 +01:00
m_truthy = m_lhs ? true : false;
m_rb
2017-01-09 13:23:10 +01:00
.setResultType( m_truthy )
.endExpression( *this );
2012-11-01 08:27:09 +00:00
}
2017-04-25 12:41:30 +02:00
virtual void reconstructExpression( std::string& dest ) const override {
2017-06-06 15:07:34 +02:00
dest = ::Catch::Detail::stringify( m_lhs );
2017-01-09 13:23:10 +01:00
}
2012-11-01 08:27:09 +00:00
private:
template<Internal::Operator Op, typename RhsT>
2017-01-09 13:23:10 +01:00
BinaryExpression<T, Op, RhsT&> captureExpression( RhsT& rhs ) const {
return BinaryExpression<T, Op, RhsT&>( m_rb, m_lhs, rhs );
}
template<Internal::Operator Op>
BinaryExpression<T, Op, bool> captureExpression( bool rhs ) const {
return BinaryExpression<T, Op, bool>( m_rb, m_lhs, rhs );
2012-11-01 08:27:09 +00:00
}
private:
ResultBuilder& m_rb;
2012-11-01 08:27:09 +00:00
T m_lhs;
bool m_truthy = false;
2017-01-09 13:23:10 +01:00
};
template<typename LhsT, Internal::Operator Op, typename RhsT>
class BinaryExpression : public DecomposedExpression {
public:
BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs )
: m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {}
BinaryExpression& operator = ( BinaryExpression& );
2017-01-09 13:23:10 +01:00
void endExpression() const {
m_rb
.setResultType( Internal::compare<Op>( m_lhs, m_rhs ) )
.endExpression( *this );
}
2017-04-25 12:41:30 +02:00
virtual bool isBinaryExpression() const override {
2017-01-09 13:23:10 +01:00
return true;
}
2017-04-25 12:41:30 +02:00
virtual void reconstructExpression( std::string& dest ) const override {
std::string lhs = ::Catch::Detail::stringify( m_lhs );
std::string rhs = ::Catch::Detail::stringify( m_rhs );
char delim = lhs.size() + rhs.size() < 40 &&
lhs.find('\n') == std::string::npos &&
rhs.find('\n') == std::string::npos ? ' ' : '\n';
dest.reserve( 7 + lhs.size() + rhs.size() );
// 2 for spaces around operator
// 2 for operator
// 2 for parentheses (conditionally added later)
// 1 for negation (conditionally added later)
dest = lhs;
dest += delim;
dest += Internal::OperatorTraits<Op>::getName();
dest += delim;
dest += rhs;
2017-01-09 13:23:10 +01:00
}
private:
ResultBuilder& m_rb;
LhsT m_lhs;
RhsT m_rhs;
};
template<typename ArgT, typename MatcherT>
class MatchExpression : public DecomposedExpression {
public:
MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString )
: m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {}
2017-04-25 12:41:30 +02:00
virtual bool isBinaryExpression() const override {
2017-01-09 13:23:10 +01:00
return true;
}
2017-04-25 12:41:30 +02:00
virtual void reconstructExpression( std::string& dest ) const override {
2017-01-09 13:23:10 +01:00
std::string matcherAsString = m_matcher.toString();
dest = ::Catch::Detail::stringify( m_arg );
dest += ' ';
2017-01-09 13:23:10 +01:00
if( matcherAsString == Detail::unprintableString )
dest += m_matcherString;
else
dest += matcherAsString;
}
private:
ArgT m_arg;
MatcherT m_matcher;
char const* m_matcherString;
2012-11-01 08:27:09 +00:00
};
} // end namespace Catch
#endif // TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED