2012-11-01 08:27:09 +00:00
/*
* Created by Phil on 8/8/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_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED
#include "catch_expressionresult_builder.h"
#include <assert.h>
namespace Catch {
ExpressionResultBuilder :: ExpressionResultBuilder ( ResultWas :: OfType resultType ) {
m_data . resultType = resultType ;
}
ExpressionResultBuilder :: ExpressionResultBuilder ( const ExpressionResultBuilder & other )
: m_data ( other . m_data ),
m_exprComponents ( other . m_exprComponents )
{
m_stream << other . m_stream . str ();
}
ExpressionResultBuilder & ExpressionResultBuilder :: operator = ( const ExpressionResultBuilder & other ) {
m_data = other . m_data ;
m_exprComponents = other . m_exprComponents ;
m_stream . str ( "" );
m_stream << other . m_stream . str ();
return * this ;
}
ExpressionResultBuilder & ExpressionResultBuilder :: setResultType ( ResultWas :: OfType result ) {
m_data . resultType = result ;
return * this ;
}
ExpressionResultBuilder & ExpressionResultBuilder :: setResultType ( bool result ) {
m_data . resultType = result ? ResultWas :: Ok : ResultWas :: ExpressionFailed ;
return * this ;
}
2012-11-13 21:59:50 +00:00
ExpressionResultBuilder & ExpressionResultBuilder :: endExpression ( ResultDisposition :: Flags resultDisposition ) {
m_exprComponents . shouldNegate = shouldNegate ( resultDisposition );
2012-11-01 08:27:09 +00:00
return * this ;
}
ExpressionResultBuilder & ExpressionResultBuilder :: setLhs ( const std :: string & lhs ) {
m_exprComponents . lhs = lhs ;
return * this ;
}
ExpressionResultBuilder & ExpressionResultBuilder :: setRhs ( const std :: string & rhs ) {
m_exprComponents . rhs = rhs ;
return * this ;
}
ExpressionResultBuilder & ExpressionResultBuilder :: setOp ( const std :: string & op ) {
m_exprComponents . op = op ;
return * this ;
}
AssertionResult ExpressionResultBuilder :: buildResult ( const AssertionInfo & info ) const
{
assert ( m_data . resultType != ResultWas :: Unknown );
AssertionResultData data = m_data ;
// Flip bool results if shouldNegate is set
if ( m_exprComponents . shouldNegate && data . resultType == ResultWas :: Ok )
data . resultType = ResultWas :: ExpressionFailed ;
else if ( m_exprComponents . shouldNegate && data . resultType == ResultWas :: ExpressionFailed )
data . resultType = ResultWas :: Ok ;
data . message = m_stream . str ();
data . reconstructedExpression = reconstructExpression ( info );
if ( m_exprComponents . shouldNegate ) {
if ( m_exprComponents . op == "" )
data . reconstructedExpression = "!" + data . reconstructedExpression ;
else
data . reconstructedExpression = "!(" + data . reconstructedExpression + ")" ;
}
return AssertionResult ( info , data );
}
std :: string ExpressionResultBuilder :: reconstructExpression ( const AssertionInfo & info ) const {
if ( m_exprComponents . op == "" )
return m_exprComponents . lhs . empty () ? info . capturedExpression : m_exprComponents . op + m_exprComponents . lhs ;
else if ( m_exprComponents . op == "matches" )
return m_exprComponents . lhs + " " + m_exprComponents . rhs ;
else if ( m_exprComponents . op != "!" ) {
if ( m_exprComponents . lhs . size () + m_exprComponents . rhs . size () < 30 )
return m_exprComponents . lhs + " " + m_exprComponents . op + " " + m_exprComponents . rhs ;
else if ( m_exprComponents . lhs . size () < 70 && m_exprComponents . rhs . size () < 70 )
return " \n\t " + m_exprComponents . lhs + " \n\t " + m_exprComponents . op + " \n\t " + m_exprComponents . rhs ;
else
return " \n " + m_exprComponents . lhs + " \n " + m_exprComponents . op + " \n " + m_exprComponents . rhs + " \n\n " ;
}
else
return "{can't expand - use " + info . macroName + "_FALSE( " + info . capturedExpression . substr ( 1 ) + " ) instead of " + info . macroName + "( " + info . capturedExpression + " ) for better diagnostics}" ;
}
} // end namespace Catch
#endif // TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED