2017-08-08 18:53:01 +02:00
|
|
|
/*
|
|
|
|
* Created by Phil on 8/8/2017.
|
|
|
|
* Copyright 2017 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)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "catch_assertionhandler.h"
|
|
|
|
#include "catch_assertionresult.h"
|
|
|
|
#include "catch_interfaces_capture.h"
|
|
|
|
#include "catch_interfaces_runner.h"
|
2017-08-09 11:51:50 +02:00
|
|
|
#include "catch_interfaces_config.h"
|
2017-08-08 18:53:01 +02:00
|
|
|
#include "catch_context.h"
|
|
|
|
#include "catch_debugger.h"
|
|
|
|
#include "catch_interfaces_registry_hub.h"
|
2017-08-09 13:10:14 +02:00
|
|
|
#include "catch_capture_matchers.h"
|
2017-11-27 20:21:47 +01:00
|
|
|
#include "catch_run_context.h"
|
2017-08-08 18:53:01 +02:00
|
|
|
|
2017-08-08 22:07:30 +02:00
|
|
|
#include <cassert>
|
2017-08-08 18:53:01 +02:00
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& {
|
|
|
|
expr.streamReconstructedExpression( os );
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
|
|
|
LazyExpression::LazyExpression( bool isNegated )
|
|
|
|
: m_isNegated( isNegated )
|
|
|
|
{}
|
|
|
|
|
|
|
|
LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {}
|
|
|
|
|
|
|
|
LazyExpression::operator bool() const {
|
|
|
|
return m_transientExpression != nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& {
|
|
|
|
if( lazyExpr.m_isNegated )
|
|
|
|
os << "!";
|
|
|
|
|
|
|
|
if( lazyExpr ) {
|
|
|
|
if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() )
|
|
|
|
os << "(" << *lazyExpr.m_transientExpression << ")";
|
|
|
|
else
|
|
|
|
os << *lazyExpr.m_transientExpression;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
os << "{** error - unchecked empty expression requested **}";
|
|
|
|
}
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
|
|
|
AssertionHandler::AssertionHandler
|
|
|
|
( StringRef macroName,
|
|
|
|
SourceLineInfo const& lineInfo,
|
|
|
|
StringRef capturedExpression,
|
|
|
|
ResultDisposition::Flags resultDisposition )
|
2017-11-23 20:21:09 +01:00
|
|
|
: m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition },
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture( static_cast<RunContext&>( getResultCapture() ) )
|
|
|
|
{}
|
|
|
|
|
2017-08-08 22:07:30 +02:00
|
|
|
AssertionHandler::~AssertionHandler() {
|
2017-11-27 20:21:47 +01:00
|
|
|
if ( !m_completed )
|
|
|
|
m_resultCapture.handleIncomplete( m_assertionInfo );
|
2017-08-08 22:07:30 +02:00
|
|
|
}
|
2017-08-08 18:53:01 +02:00
|
|
|
|
2017-11-24 20:15:46 +01:00
|
|
|
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
2017-08-08 21:17:09 +02:00
|
|
|
}
|
2017-11-27 07:53:56 +01:00
|
|
|
void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const &message) {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );
|
2017-08-08 18:53:01 +02:00
|
|
|
}
|
2017-08-08 20:36:18 +02:00
|
|
|
|
2017-08-08 20:43:07 +02:00
|
|
|
auto AssertionHandler::allowThrows() const -> bool {
|
|
|
|
return getCurrentContext().getConfig()->allowThrows();
|
|
|
|
}
|
2017-08-08 18:53:01 +02:00
|
|
|
|
2017-11-23 20:14:26 +01:00
|
|
|
void AssertionHandler::complete() {
|
|
|
|
setCompleted();
|
2017-11-27 20:21:47 +01:00
|
|
|
if( m_reaction.shouldDebugBreak ) {
|
2017-11-23 20:14:26 +01:00
|
|
|
|
|
|
|
// If you find your debugger stopping you here then go one level up on the
|
|
|
|
// call-stack for the code that caused it (typically a failed assertion)
|
|
|
|
|
|
|
|
// (To go back to the test and change execution, jump over the throw, next)
|
2017-08-08 18:53:01 +02:00
|
|
|
CATCH_BREAK_INTO_DEBUGGER();
|
|
|
|
}
|
2017-11-27 20:21:47 +01:00
|
|
|
if( m_reaction.shouldThrow )
|
2017-08-08 18:53:01 +02:00
|
|
|
throw Catch::TestFailureException();
|
|
|
|
}
|
2017-11-23 20:14:26 +01:00
|
|
|
void AssertionHandler::setCompleted() {
|
|
|
|
m_completed = true;
|
|
|
|
}
|
2017-08-08 18:53:01 +02:00
|
|
|
|
2017-11-24 20:15:46 +01:00
|
|
|
void AssertionHandler::handleUnexpectedInflightException() {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction );
|
2017-08-08 18:53:01 +02:00
|
|
|
}
|
|
|
|
|
2017-11-24 20:15:46 +01:00
|
|
|
void AssertionHandler::handleExceptionThrownAsExpected() {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
2017-11-24 20:15:46 +01:00
|
|
|
}
|
|
|
|
void AssertionHandler::handleExceptionNotThrownAsExpected() {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
2017-11-24 20:15:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void AssertionHandler::handleUnexpectedExceptionNotThrown() {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction );
|
2017-11-24 20:15:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void AssertionHandler::handleThrowingCallSkipped() {
|
2017-11-27 20:21:47 +01:00
|
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
2017-11-24 20:15:46 +01:00
|
|
|
}
|
|
|
|
|
2017-08-09 13:10:14 +02:00
|
|
|
// This is the overload that takes a string and infers the Equals matcher from it
|
|
|
|
// The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp
|
2017-08-09 01:44:30 +02:00
|
|
|
void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString ) {
|
|
|
|
handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString );
|
|
|
|
}
|
2017-08-08 22:07:30 +02:00
|
|
|
|
2017-08-08 18:53:01 +02:00
|
|
|
} // namespace Catch
|