2012-05-08 20:29:51 +02:00
/*
2012-08-08 09:58:28 +02:00
* Created by Phil on 8 / 8 / 2012.
2012-05-08 20:29:51 +02:00
* 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)
*/
2012-10-26 09:45:23 +02:00
# ifndef TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED
# define TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED
2012-05-08 20:29:51 +02:00
2012-10-26 09:45:23 +02:00
# include "catch_expressionresult_builder.h"
2012-05-08 20:29:51 +02:00
2012-10-19 09:01:34 +02:00
# include <assert.h>
2012-05-15 08:42:26 +02:00
namespace Catch {
2012-05-08 20:29:51 +02:00
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder : : ExpressionResultBuilder ( ResultWas : : OfType resultType ) {
2012-10-19 09:01:34 +02:00
m_data . resultType = resultType ;
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder : : ExpressionResultBuilder ( const ExpressionResultBuilder & other )
2012-10-18 09:39:44 +02:00
: m_data ( other . m_data ) ,
m_exprComponents ( other . m_exprComponents )
{
m_stream < < other . m_stream . str ( ) ;
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder & ExpressionResultBuilder : : operator = ( const ExpressionResultBuilder & other ) {
2012-10-18 09:39:44 +02:00
m_data = other . m_data ;
m_exprComponents = other . m_exprComponents ;
2012-10-28 11:27:44 +01:00
m_stream . str ( " " ) ;
2012-10-18 09:39:44 +02:00
m_stream < < other . m_stream . str ( ) ;
return * this ;
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder & ExpressionResultBuilder : : setResultType ( ResultWas : : OfType result ) {
2012-10-19 09:01:34 +02:00
m_data . resultType = result ;
2012-10-05 19:35:01 +02:00
return * this ;
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder & ExpressionResultBuilder : : setResultType ( bool result ) {
2012-10-24 22:59:47 +02:00
m_data . resultType = result ? ResultWas : : Ok : ResultWas : : ExpressionFailed ;
2012-10-05 19:35:01 +02:00
return * this ;
}
2012-11-10 19:43:23 +01:00
ExpressionResultBuilder & ExpressionResultBuilder : : endExpression ( ResultDisposition : : Flags resultDisposition ) {
2012-11-13 10:44:52 +01:00
m_exprComponents . shouldNegate = shouldNegate ( resultDisposition ) ;
2012-10-04 09:09:09 +02:00
return * this ;
2012-05-08 20:29:51 +02:00
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder & ExpressionResultBuilder : : setLhs ( const std : : string & lhs ) {
2012-10-18 09:39:44 +02:00
m_exprComponents . lhs = lhs ;
2012-10-04 09:09:09 +02:00
return * this ;
2012-05-08 20:29:51 +02:00
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder & ExpressionResultBuilder : : setRhs ( const std : : string & rhs ) {
2012-10-18 09:39:44 +02:00
m_exprComponents . rhs = rhs ;
2012-10-04 09:09:09 +02:00
return * this ;
2012-05-08 20:29:51 +02:00
}
2012-10-26 09:45:23 +02:00
ExpressionResultBuilder & ExpressionResultBuilder : : setOp ( const std : : string & op ) {
2012-10-18 09:39:44 +02:00
m_exprComponents . op = op ;
2012-10-04 09:09:09 +02:00
return * this ;
}
2012-10-26 10:05:36 +02:00
AssertionResult ExpressionResultBuilder : : buildResult ( const AssertionInfo & info ) const
2012-10-05 19:35:01 +02:00
{
2012-10-19 09:01:34 +02:00
assert ( m_data . resultType ! = ResultWas : : Unknown ) ;
2012-10-16 09:33:13 +02:00
AssertionResultData data = m_data ;
2012-10-19 09:01:34 +02:00
2012-10-24 22:59:47 +02:00
// Flip bool results if shouldNegate is set
if ( m_exprComponents . shouldNegate & & data . resultType = = ResultWas : : Ok )
2012-10-19 09:01:34 +02:00
data . resultType = ResultWas : : ExpressionFailed ;
2012-10-24 22:59:47 +02:00
else if ( m_exprComponents . shouldNegate & & data . resultType = = ResultWas : : ExpressionFailed )
2012-10-19 09:01:34 +02:00
data . resultType = ResultWas : : Ok ;
2012-10-18 09:39:44 +02:00
data . message = m_stream . str ( ) ;
2012-10-24 22:59:47 +02:00
data . reconstructedExpression = reconstructExpression ( info ) ;
if ( m_exprComponents . shouldNegate ) {
if ( m_exprComponents . op = = " " )
2012-10-09 12:48:55 +02:00
data . reconstructedExpression = " ! " + data . reconstructedExpression ;
2012-10-24 22:59:47 +02:00
else
2012-10-09 12:48:55 +02:00
data . reconstructedExpression = " !( " + data . reconstructedExpression + " ) " ;
}
2012-10-26 10:05:36 +02:00
return AssertionResult ( info , data ) ;
2012-05-08 20:29:51 +02:00
}
2012-10-26 09:45:23 +02:00
std : : string ExpressionResultBuilder : : reconstructExpression ( const AssertionInfo & info ) const {
2012-10-18 09:39:44 +02:00
if ( m_exprComponents . op = = " " )
2012-10-24 22:59:47 +02:00
return m_exprComponents . lhs . empty ( ) ? info . capturedExpression : m_exprComponents . op + m_exprComponents . lhs ;
2012-10-18 09:39:44 +02:00
else if ( m_exprComponents . op = = " matches " )
return m_exprComponents . lhs + " " + m_exprComponents . rhs ;
else if ( m_exprComponents . op ! = " ! " ) {
2013-03-25 10:24:13 +01:00
if ( m_exprComponents . lhs . size ( ) + m_exprComponents . rhs . size ( ) < 40 & &
m_exprComponents . lhs . find ( " \n " ) = = std : : string : : npos & &
m_exprComponents . rhs . find ( " \n " ) = = std : : string : : npos )
2012-10-18 09:39:44 +02:00
return m_exprComponents . lhs + " " + m_exprComponents . op + " " + m_exprComponents . rhs ;
2012-10-05 19:35:01 +02:00
else
2013-03-04 12:19:15 +01:00
return m_exprComponents . lhs + " \n " + m_exprComponents . op + " \n " + m_exprComponents . rhs ;
2012-10-05 19:35:01 +02:00
}
else
2012-10-24 22:59:47 +02:00
return " {can't expand - use " + info . macroName + " _FALSE( " + info . capturedExpression . substr ( 1 ) + " ) instead of " + info . macroName + " ( " + info . capturedExpression + " ) for better diagnostics} " ;
2012-10-05 19:35:01 +02:00
}
2012-05-08 20:29:51 +02:00
} // end namespace Catch
2012-10-26 09:45:23 +02:00
# endif // TWOBLUECUBES_CATCH_EXPRESSIONRESULT_BUILDER_HPP_INCLUDED