2020-05-10 18:24:53 +02:00
|
|
|
#include <catch2/internal/catch_assertion_handler.hpp>
|
2020-03-30 10:34:21 +02:00
|
|
|
#include <catch2/interfaces/catch_interfaces_config.hpp>
|
|
|
|
|
#include <catch2/internal/catch_context.hpp>
|
|
|
|
|
#include <catch2/internal/catch_enforce.hpp>
|
|
|
|
|
#include <catch2/internal/catch_debugger.hpp>
|
|
|
|
|
#include <catch2/interfaces/catch_interfaces_registry_hub.hpp>
|
|
|
|
|
#include <catch2/internal/catch_run_context.hpp>
|
2020-03-01 19:59:18 +01:00
|
|
|
#include <catch2/matchers/catch_matchers_string.hpp>
|
2017-08-08 17:53:01 +01:00
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
|
|
AssertionHandler::AssertionHandler
|
2018-07-23 13:49:29 +02:00
|
|
|
( StringRef const& macroName,
|
2017-08-08 17:53:01 +01:00
|
|
|
SourceLineInfo const& lineInfo,
|
|
|
|
|
StringRef capturedExpression,
|
|
|
|
|
ResultDisposition::Flags resultDisposition )
|
2017-11-23 19:21:09 +00:00
|
|
|
: m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition },
|
2017-12-05 16:18:53 +00:00
|
|
|
m_resultCapture( getResultCapture() )
|
2017-11-27 22:21:47 +03:00
|
|
|
{}
|
|
|
|
|
|
2017-11-24 19:15:46 +00:00
|
|
|
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
2017-08-08 20:17:09 +01:00
|
|
|
}
|
2017-11-27 22:28:45 +03:00
|
|
|
void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );
|
2017-08-08 17:53:01 +01:00
|
|
|
}
|
2017-08-08 19:36:18 +01:00
|
|
|
|
2017-08-08 19:43:07 +01:00
|
|
|
auto AssertionHandler::allowThrows() const -> bool {
|
|
|
|
|
return getCurrentContext().getConfig()->allowThrows();
|
|
|
|
|
}
|
2017-08-08 17:53:01 +01:00
|
|
|
|
2017-11-23 19:14:26 +00:00
|
|
|
void AssertionHandler::complete() {
|
|
|
|
|
setCompleted();
|
2017-11-27 22:21:47 +03:00
|
|
|
if( m_reaction.shouldDebugBreak ) {
|
2017-11-23 19:14:26 +00: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 17:53:01 +01:00
|
|
|
CATCH_BREAK_INTO_DEBUGGER();
|
|
|
|
|
}
|
2018-09-03 17:52:48 +02:00
|
|
|
if (m_reaction.shouldThrow) {
|
|
|
|
|
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
2017-08-08 17:53:01 +01:00
|
|
|
throw Catch::TestFailureException();
|
2018-09-03 17:52:48 +02:00
|
|
|
#else
|
|
|
|
|
CATCH_ERROR( "Test failure requires aborting test!" );
|
|
|
|
|
#endif
|
|
|
|
|
}
|
2017-08-08 17:53:01 +01:00
|
|
|
}
|
2017-11-23 19:14:26 +00:00
|
|
|
void AssertionHandler::setCompleted() {
|
|
|
|
|
m_completed = true;
|
|
|
|
|
}
|
2017-08-08 17:53:01 +01:00
|
|
|
|
2017-11-24 19:15:46 +00:00
|
|
|
void AssertionHandler::handleUnexpectedInflightException() {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction );
|
2017-08-08 17:53:01 +01:00
|
|
|
}
|
|
|
|
|
|
2017-11-24 19:15:46 +00:00
|
|
|
void AssertionHandler::handleExceptionThrownAsExpected() {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
2017-11-24 19:15:46 +00:00
|
|
|
}
|
|
|
|
|
void AssertionHandler::handleExceptionNotThrownAsExpected() {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
2017-11-24 19:15:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AssertionHandler::handleUnexpectedExceptionNotThrown() {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction );
|
2017-11-24 19:15:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AssertionHandler::handleThrowingCallSkipped() {
|
2017-11-27 22:21:47 +03:00
|
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
2017-11-24 19:15:46 +00:00
|
|
|
}
|
|
|
|
|
|
2017-08-09 12:10:14 +01: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
|
2018-07-23 13:49:29 +02:00
|
|
|
void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString ) {
|
2017-08-09 00:44:30 +01:00
|
|
|
handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString );
|
|
|
|
|
}
|
2017-08-08 21:07:30 +01:00
|
|
|
|
2017-08-08 17:53:01 +01:00
|
|
|
} // namespace Catch
|