Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorPhil Nash2017-08-10 16:18:05 +0100
committerPhil Nash2017-08-10 16:18:05 +0100
commit97c06ca6fbd46b53431de487a92e5e9db302c7c5 (patch)
tree6fd2598a24d6cf3da13345981a886c60862e058b /include
parent3382312bd8300f6b11fc627632ed4e5b466650d2 (diff)
parentee9b19efd3737afc93e14023cc0b4a9fd2a21b7c (diff)
downloadcatch3-97c06ca6fbd46b53431de487a92e5e9db302c7c5.tar.gz
Merge branch 'reevaluate' into dev-modernize
Diffstat (limited to 'include')
-rw-r--r--include/catch.hpp12
-rw-r--r--include/internal/catch_assertionhandler.cpp147
-rw-r--r--include/internal/catch_assertionhandler.h73
-rw-r--r--include/internal/catch_assertioninfo.h31
-rw-r--r--include/internal/catch_assertionresult.cpp69
-rw-r--r--include/internal/catch_assertionresult.h67
-rw-r--r--include/internal/catch_benchmark.cpp1
-rw-r--r--include/internal/catch_capture.hpp124
-rw-r--r--include/internal/catch_capture_matchers.cpp23
-rw-r--r--include/internal/catch_capture_matchers.h87
-rw-r--r--include/internal/catch_common.cpp1
-rw-r--r--include/internal/catch_common.h4
-rw-r--r--include/internal/catch_decomposer.cpp22
-rw-r--r--include/internal/catch_decomposer.h164
-rw-r--r--include/internal/catch_evaluate.cpp38
-rw-r--r--include/internal/catch_evaluate.hpp109
-rw-r--r--include/internal/catch_exception_translator_registry.cpp2
-rw-r--r--include/internal/catch_expression_lhs.hpp176
-rw-r--r--include/internal/catch_interfaces_capture.h5
-rw-r--r--include/internal/catch_interfaces_reporter.cpp4
-rw-r--r--include/internal/catch_matchers.cpp4
-rw-r--r--include/internal/catch_matchers.hpp4
-rw-r--r--include/internal/catch_matchers_string.cpp4
-rw-r--r--include/internal/catch_matchers_string.h4
-rw-r--r--include/internal/catch_matchers_vector.h5
-rw-r--r--include/internal/catch_message.h15
-rw-r--r--include/internal/catch_notimplemented_exception.cpp3
-rw-r--r--include/internal/catch_notimplemented_exception.h1
-rw-r--r--include/internal/catch_result_builder.cpp193
-rw-r--r--include/internal/catch_result_builder.h118
-rw-r--r--include/internal/catch_run_context.cpp27
-rw-r--r--include/internal/catch_run_context.hpp6
-rw-r--r--include/reporters/catch_reporter_bases.cpp5
-rw-r--r--include/reporters/catch_reporter_bases.hpp6
34 files changed, 673 insertions, 881 deletions
diff --git a/include/catch.hpp b/include/catch.hpp
index b830c97e..b58a2354 100644
--- a/include/catch.hpp
+++ b/include/catch.hpp
@@ -41,6 +41,10 @@
#include "internal/catch_compiler_capabilities.h"
#include "internal/catch_interfaces_tag_alias_registry.h"
+#ifndef CATCH_CONFIG_DISABLE_MATCHERS
+#include "internal/catch_capture_matchers.h"
+#endif
+
// These files are included here so the single_include script doesn't put them
// in the conditionally compiled sections
#include "internal/catch_test_case_info.h"
@@ -72,8 +76,8 @@
#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", __VA_ARGS__ )
#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
-#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )
#endif// CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ )
@@ -86,8 +90,8 @@
#define CATCH_CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", __VA_ARGS__ )
#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
-#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
@@ -132,8 +136,8 @@
#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ )
#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
-#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ )
@@ -146,8 +150,8 @@
#define CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
-#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
diff --git a/include/internal/catch_assertionhandler.cpp b/include/internal/catch_assertionhandler.cpp
new file mode 100644
index 00000000..9e7c8453
--- /dev/null
+++ b/include/internal/catch_assertionhandler.cpp
@@ -0,0 +1,147 @@
+/*
+ * 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"
+#include "catch_interfaces_config.h"
+#include "catch_context.h"
+#include "catch_debugger.h"
+#include "catch_interfaces_registry_hub.h"
+#include "catch_capture_matchers.h"
+
+#include <cassert>
+
+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 )
+ : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition }
+ {
+ getCurrentContext().getResultCapture()->assertionStarting( m_assertionInfo );
+ }
+ AssertionHandler::~AssertionHandler() {
+ if ( m_inExceptionGuard ) {
+ handle( ResultWas::ThrewException, "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE" );
+ getCurrentContext().getResultCapture()->exceptionEarlyReported();
+ }
+ }
+
+ void AssertionHandler::handle( ITransientExpression const& expr ) {
+
+ bool negated = isFalseTest( m_assertionInfo.resultDisposition );
+ bool result = expr.getResult() != negated;
+
+ handle( result ? ResultWas::Ok : ResultWas::ExpressionFailed, &expr, negated );
+ }
+ void AssertionHandler::handle( ResultWas::OfType resultType ) {
+ handle( resultType, nullptr, false );
+ }
+ void AssertionHandler::handle( ResultWas::OfType resultType, StringRef const& message ) {
+ AssertionResultData data( resultType, LazyExpression( false ) );
+ data.message = message.c_str();
+ handle( data, nullptr );
+ }
+ void AssertionHandler::handle( ResultWas::OfType resultType, ITransientExpression const* expr, bool negated ) {
+ AssertionResultData data( resultType, LazyExpression( negated ) );
+ handle( data, expr );
+ }
+ void AssertionHandler::handle( AssertionResultData const& resultData, ITransientExpression const* expr ) {
+
+ getResultCapture().assertionRun();
+
+ AssertionResult assertionResult{ m_assertionInfo, resultData };
+ assertionResult.m_resultData.lazyExpression.m_transientExpression = expr;
+
+ getResultCapture().assertionEnded( assertionResult );
+
+ if( !assertionResult.isOk() ) {
+ m_shouldDebugBreak = getCurrentContext().getConfig()->shouldDebugBreak();
+ m_shouldThrow =
+ getCurrentContext().getRunner()->aborting() ||
+ (m_assertionInfo.resultDisposition & ResultDisposition::Normal);
+ }
+ }
+
+ auto AssertionHandler::allowThrows() const -> bool {
+ return getCurrentContext().getConfig()->allowThrows();
+ }
+
+ auto AssertionHandler::shouldDebugBreak() const -> bool {
+ return m_shouldDebugBreak;
+ }
+ void AssertionHandler::reactWithDebugBreak() const {
+ if (m_shouldDebugBreak) {
+ ///////////////////////////////////////////////////////////////////
+ // To inspect the state during test, you need to go one level up the callstack
+ // To go back to the test and change execution, jump over the reactWithoutDebugBreak() call
+ ///////////////////////////////////////////////////////////////////
+ CATCH_BREAK_INTO_DEBUGGER();
+ }
+ reactWithoutDebugBreak();
+ }
+ void AssertionHandler::reactWithoutDebugBreak() const {
+ if( m_shouldThrow )
+ throw Catch::TestFailureException();
+ }
+
+ void AssertionHandler::useActiveException() {
+ handle( ResultWas::ThrewException, Catch::translateActiveException().c_str() );
+ }
+
+ void AssertionHandler::setExceptionGuard() {
+ assert( m_inExceptionGuard == false );
+ m_inExceptionGuard = true;
+ }
+ void AssertionHandler::unsetExceptionGuard() {
+ assert( m_inExceptionGuard == true );
+ m_inExceptionGuard = false;
+ }
+
+ // 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
+ void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString ) {
+ handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString );
+ }
+
+} // namespace Catch
diff --git a/include/internal/catch_assertionhandler.h b/include/internal/catch_assertionhandler.h
new file mode 100644
index 00000000..9fdbee4f
--- /dev/null
+++ b/include/internal/catch_assertionhandler.h
@@ -0,0 +1,73 @@
+/*
+ * 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_decomposer.h"
+#include "catch_assertioninfo.h"
+
+namespace Catch {
+
+ struct TestFailureException{};
+ struct AssertionResultData;
+
+ class LazyExpression {
+ friend class AssertionHandler;
+ friend struct AssertionStats;
+
+ 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&;
+ };
+
+ class AssertionHandler {
+ AssertionInfo m_assertionInfo;
+ bool m_shouldDebugBreak = false;
+ bool m_shouldThrow = false;
+ bool m_inExceptionGuard = false;
+
+ public:
+ AssertionHandler
+ ( StringRef macroName,
+ SourceLineInfo const& lineInfo,
+ StringRef capturedExpression,
+ ResultDisposition::Flags resultDisposition );
+ ~AssertionHandler();
+
+ void handle( ITransientExpression const& expr );
+
+ template<typename T>
+ void handle( ExprLhs<T> const& expr ) {
+ handle( expr.makeUnaryExpr() );
+ }
+ void handle( ResultWas::OfType resultType );
+ void handle( ResultWas::OfType resultType, StringRef const& message );
+ void handle( ResultWas::OfType resultType, ITransientExpression const* expr, bool negated );
+ void handle( AssertionResultData const& resultData, ITransientExpression const* expr );
+
+ auto shouldDebugBreak() const -> bool;
+ auto allowThrows() const -> bool;
+ void reactWithDebugBreak() const;
+ void reactWithoutDebugBreak() const;
+ void useActiveException();
+ void setExceptionGuard();
+ void unsetExceptionGuard();
+ };
+
+ void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString );
+
+} // namespace Catch
+
+#endif // TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
diff --git a/include/internal/catch_assertioninfo.h b/include/internal/catch_assertioninfo.h
new file mode 100644
index 00000000..5f136bf7
--- /dev/null
+++ b/include/internal/catch_assertioninfo.h
@@ -0,0 +1,31 @@
+/*
+ * 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_ASSERTIONINFO_H_INCLUDED
+#define TWOBLUECUBES_CATCH_ASSERTIONINFO_H_INCLUDED
+
+#include "catch_result_type.h"
+#include "catch_common.h"
+#include "catch_stringref.h"
+
+namespace Catch {
+
+ struct AssertionInfo
+ {
+ StringRef macroName;
+ SourceLineInfo lineInfo;
+ StringRef capturedExpression;
+ ResultDisposition::Flags resultDisposition;
+
+ // We want to delete this constructor but a compiler bug in 4.8 means
+ // the struct is then treated as non-aggregate
+ //AssertionInfo() = delete;
+ };
+
+} // end namespace Catch
+
+#endif // TWOBLUECUBES_CATCH_ASSERTIONINFO_H_INCLUDED
diff --git a/include/internal/catch_assertionresult.cpp b/include/internal/catch_assertionresult.cpp
index 9a4b0c65..04402000 100644
--- a/include/internal/catch_assertionresult.cpp
+++ b/include/internal/catch_assertionresult.cpp
@@ -10,54 +10,24 @@
namespace Catch {
-
- bool DecomposedExpression::isBinaryExpression() const {
- return false;
- }
-
- AssertionInfo::AssertionInfo( char const * _macroName,
- SourceLineInfo const& _lineInfo,
- char const * _capturedExpression,
- ResultDisposition::Flags _resultDisposition)
- : macroName( _macroName ),
- lineInfo( _lineInfo ),
- capturedExpression( _capturedExpression ),
- resultDisposition( _resultDisposition )
- {}
-
- void AssertionResultData::negate( bool parenthesize ) {
- negated = !negated;
- parenthesized = parenthesize;
- if( resultType == ResultWas::Ok )
- resultType = ResultWas::ExpressionFailed;
- else if( resultType == ResultWas::ExpressionFailed )
- resultType = ResultWas::Ok;
- }
-
- std::string const& AssertionResultData::reconstructExpression() const {
- if( decomposedExpression != nullptr ) {
- decomposedExpression->reconstructExpression( reconstructedExpression );
- if( parenthesized ) {
- reconstructedExpression.insert( 0, 1, '(' );
- reconstructedExpression.append( 1, ')' );
+ std::string AssertionResultData::reconstructExpression() const {
+
+ if( reconstructedExpression.empty() ) {
+ if( lazyExpression ) {
+ // !TBD Use stringstream for now, but rework above to pass stream in
+ std::ostringstream oss;
+ oss << lazyExpression;
+ reconstructedExpression = oss.str();
}
- if( negated ) {
- reconstructedExpression.insert( 0, 1, '!' );
- }
- decomposedExpression = nullptr;
}
return reconstructedExpression;
}
- AssertionResult::AssertionResult() {}
-
AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
: m_info( info ),
m_resultData( data )
{}
- AssertionResult::~AssertionResult() {}
-
// Result was a success
bool AssertionResult::succeeded() const {
return Catch::isOk( m_resultData.resultType );
@@ -82,16 +52,16 @@ namespace Catch {
std::string AssertionResult::getExpression() const {
if (isFalseTest(m_info.resultDisposition))
- return '!' + std::string(m_info.capturedExpression);
+ return '!' + std::string(m_info.capturedExpression.c_str());
else
- return std::string(m_info.capturedExpression);
+ return std::string(m_info.capturedExpression.c_str());
}
std::string AssertionResult::getExpressionInMacro() const {
if( m_info.macroName[0] == 0 )
- return std::string(m_info.capturedExpression);
+ return std::string(m_info.capturedExpression.c_str());
else
- return std::string(m_info.macroName) + "( " + m_info.capturedExpression + " )";
+ return std::string(m_info.macroName.c_str()) + "( " + m_info.capturedExpression.c_str() + " )";
}
bool AssertionResult::hasExpandedExpression() const {
@@ -99,7 +69,10 @@ namespace Catch {
}
std::string AssertionResult::getExpandedExpression() const {
- return m_resultData.reconstructExpression();
+ std::string expr = m_resultData.reconstructExpression();
+ return expr.empty()
+ ? getExpression()
+ : expr;
}
std::string AssertionResult::getMessage() const {
@@ -110,15 +83,7 @@ namespace Catch {
}
std::string AssertionResult::getTestMacroName() const {
- return m_info.macroName;
- }
-
- void AssertionResult::discardDecomposedExpression() const {
- m_resultData.decomposedExpression = nullptr;
- }
-
- void AssertionResult::expandDecomposedExpression() const {
- m_resultData.reconstructExpression();
+ return m_info.macroName.c_str();
}
} // end namespace Catch
diff --git a/include/internal/catch_assertionresult.h b/include/internal/catch_assertionresult.h
index 89a96298..b1177fa4 100644
--- a/include/internal/catch_assertionresult.h
+++ b/include/internal/catch_assertionresult.h
@@ -9,71 +9,36 @@
#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED
#include <string>
+#include "catch_assertioninfo.h"
#include "catch_result_type.h"
#include "catch_common.h"
+#include "catch_stringref.h"
+#include "catch_assertionhandler.h"
namespace Catch {
- struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
-
- struct DecomposedExpression
+ struct AssertionResultData
{
- DecomposedExpression() = default;
- DecomposedExpression( DecomposedExpression const& ) = default;
- DecomposedExpression& operator = ( DecomposedExpression const& ) = delete;
+ AssertionResultData() = delete;
- virtual ~DecomposedExpression() = default;
- virtual bool isBinaryExpression() const;
- virtual void reconstructExpression( std::string& dest ) const = 0;
-
- // Only simple binary comparisons can be decomposed.
- // If more complex check is required then wrap sub-expressions in parentheses.
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& );
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& );
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& );
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& );
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& );
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& );
- template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& );
- };
+ AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression )
+ : resultType( _resultType ),
+ lazyExpression( _lazyExpression )
+ {}
- struct AssertionInfo
- {
- AssertionInfo() = default;
- AssertionInfo( char const * _macroName,
- SourceLineInfo const& _lineInfo,
- char const * _capturedExpression,
- ResultDisposition::Flags _resultDisposition);
-
- char const * macroName = nullptr;
- SourceLineInfo lineInfo;
- char const * capturedExpression = nullptr;
- ResultDisposition::Flags resultDisposition = ResultDisposition::Normal;
- };
+ ResultWas::OfType resultType = ResultWas::Unknown;
+ std::string message;
- struct AssertionResultData
- {
- void negate( bool parenthesize );
- std::string const& reconstructExpression() const;
+ LazyExpression lazyExpression;
- mutable DecomposedExpression const* decomposedExpression = nullptr;
+ std::string reconstructExpression() const;
mutable std::string reconstructedExpression;
- std::string message;
- ResultWas::OfType resultType = ResultWas::Unknown;
- bool negated = false;
- bool parenthesized = false;
};
class AssertionResult {
public:
- AssertionResult();
+ AssertionResult() = delete;
AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
- ~AssertionResult();
-
- AssertionResult( AssertionResult const& ) = default;
- AssertionResult( AssertionResult && ) = default;
- AssertionResult& operator = ( AssertionResult const& ) = default;
- AssertionResult& operator = ( AssertionResult && ) = default;
bool isOk() const;
bool succeeded() const;
@@ -87,10 +52,8 @@ namespace Catch {
std::string getMessage() const;
SourceLineInfo getSourceInfo() const;
std::string getTestMacroName() const;
- void discardDecomposedExpression() const;
- void expandDecomposedExpression() const;
- protected:
+ //protected:
AssertionInfo m_info;
AssertionResultData m_resultData;
};
diff --git a/include/internal/catch_benchmark.cpp b/include/internal/catch_benchmark.cpp
index 34af42a5..51a844f6 100644
--- a/include/internal/catch_benchmark.cpp
+++ b/include/internal/catch_benchmark.cpp
@@ -8,6 +8,7 @@
#include "catch_benchmark.h"
#include "catch_capture.hpp"
+#include "catch_interfaces_reporter.h"
namespace Catch {
diff --git a/include/internal/catch_capture.hpp b/include/internal/catch_capture.hpp
index c5438266..2f631bd3 100644
--- a/include/internal/catch_capture.hpp
+++ b/include/internal/catch_capture.hpp
@@ -8,14 +8,9 @@
#ifndef TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
-#include "catch_result_builder.h"
+#include "catch_assertionhandler.h"
#include "catch_message.h"
#include "catch_interfaces_capture.h"
-#include "catch_debugger.h"
-#include "catch_common.h"
-#include "catch_tostring.h"
-#include "catch_interfaces_runner.h"
-#include "catch_compiler_capabilities.h"
#if defined(CATCH_CONFIG_FAST_COMPILE)
@@ -23,43 +18,45 @@
// We can speedup compilation significantly by breaking into debugger lower in
// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER
// macro in each assertion
-#define INTERNAL_CATCH_REACT( resultBuilder ) \
- resultBuilder.react();
+#define INTERNAL_CATCH_REACT( handler ) \
+ handler.reactWithDebugBreak();
///////////////////////////////////////////////////////////////////////////////
// Another way to speed-up compilation is to omit local try-catch for REQUIRE*
// macros.
// This can potentially cause false negative, if the test code catches
// the exception before it propagates back up to the runner.
-#define INTERNAL_CATCH_TRY
-#define INTERNAL_CATCH_CATCH( capturer, disposition )
+#define INTERNAL_CATCH_TRY( capturer ) capturer.setExceptionGuard();
+#define INTERNAL_CATCH_CATCH( capturer ) capturer.unsetExceptionGuard();