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)
|
|
|
|
*/
|
|
|
|
#ifndef TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
|
|
|
|
#define TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
|
|
|
|
|
|
|
|
#include "catch_assertioninfo.h"
|
2017-12-09 20:48:29 +01:00
|
|
|
#include "catch_decomposer.h"
|
|
|
|
#include "catch_interfaces_capture.h"
|
2017-08-08 18:53:01 +02:00
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
struct TestFailureException{};
|
2017-08-08 20:36:18 +02:00
|
|
|
struct AssertionResultData;
|
2017-11-23 20:21:09 +01:00
|
|
|
struct IResultCapture;
|
2017-11-27 20:21:47 +01:00
|
|
|
class RunContext;
|
2017-08-08 18:53:01 +02:00
|
|
|
|
|
|
|
class LazyExpression {
|
|
|
|
friend class AssertionHandler;
|
|
|
|
friend struct AssertionStats;
|
2017-11-27 20:21:47 +01:00
|
|
|
friend class RunContext;
|
2017-08-08 18:53:01 +02:00
|
|
|
|
|
|
|
ITransientExpression const* m_transientExpression = nullptr;
|
|
|
|
bool m_isNegated;
|
|
|
|
public:
|
|
|
|
LazyExpression( bool isNegated );
|
|
|
|
LazyExpression( LazyExpression const& other );
|
|
|
|
LazyExpression& operator = ( LazyExpression const& ) = delete;
|
|
|
|
|
|
|
|
explicit operator bool() const;
|
|
|
|
|
|
|
|
friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&;
|
|
|
|
};
|
|
|
|
|
2017-11-27 20:21:47 +01:00
|
|
|
struct AssertionReaction {
|
|
|
|
bool shouldDebugBreak = false;
|
|
|
|
bool shouldThrow = false;
|
|
|
|
};
|
|
|
|
|
2017-08-08 18:53:01 +02:00
|
|
|
class AssertionHandler {
|
|
|
|
AssertionInfo m_assertionInfo;
|
2017-11-27 20:21:47 +01:00
|
|
|
AssertionReaction m_reaction;
|
2017-11-23 20:14:26 +01:00
|
|
|
bool m_completed = false;
|
2017-12-05 17:18:53 +01:00
|
|
|
IResultCapture& m_resultCapture;
|
2017-08-08 22:07:30 +02:00
|
|
|
|
2017-08-08 18:53:01 +02:00
|
|
|
public:
|
|
|
|
AssertionHandler
|
2018-07-23 13:49:29 +02:00
|
|
|
( StringRef const& macroName,
|
2017-08-08 18:53:01 +02:00
|
|
|
SourceLineInfo const& lineInfo,
|
|
|
|
StringRef capturedExpression,
|
|
|
|
ResultDisposition::Flags resultDisposition );
|
2017-12-09 20:17:47 +01:00
|
|
|
~AssertionHandler() {
|
|
|
|
if ( !m_completed ) {
|
2017-12-09 20:48:29 +01:00
|
|
|
m_resultCapture.handleIncomplete( m_assertionInfo );
|
2017-12-09 20:17:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-08 18:53:01 +02:00
|
|
|
|
|
|
|
template<typename T>
|
2017-11-24 20:15:46 +01:00
|
|
|
void handleExpr( ExprLhs<T> const& expr ) {
|
|
|
|
handleExpr( expr.makeUnaryExpr() );
|
2017-08-08 18:53:01 +02:00
|
|
|
}
|
2017-11-24 20:15:46 +01:00
|
|
|
void handleExpr( ITransientExpression const& expr );
|
|
|
|
|
2017-11-27 20:28:45 +01:00
|
|
|
void handleMessage(ResultWas::OfType resultType, StringRef const& message);
|
2017-08-08 18:53:01 +02:00
|
|
|
|
2017-11-24 20:15:46 +01:00
|
|
|
void handleExceptionThrownAsExpected();
|
|
|
|
void handleUnexpectedExceptionNotThrown();
|
|
|
|
void handleExceptionNotThrownAsExpected();
|
|
|
|
void handleThrowingCallSkipped();
|
|
|
|
void handleUnexpectedInflightException();
|
|
|
|
|
2017-11-23 20:14:26 +01:00
|
|
|
void complete();
|
|
|
|
void setCompleted();
|
2017-11-24 20:15:46 +01:00
|
|
|
|
|
|
|
// query
|
|
|
|
auto allowThrows() const -> bool;
|
2017-08-08 18:53:01 +02:00
|
|
|
};
|
|
|
|
|
2018-07-23 13:49:29 +02:00
|
|
|
void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString );
|
2017-08-09 01:44:30 +02:00
|
|
|
|
2017-08-08 18:53:01 +02:00
|
|
|
} // namespace Catch
|
|
|
|
|
|
|
|
#endif // TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
|