1 /*
2  *  Created by Phil on 8/8/2017.
3  *  Copyright 2017 Two Blue Cubes Ltd. All rights reserved.
4  *
5  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
6  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7  */
8 #ifndef TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
9 #define TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
10 
11 #include "catch_assertioninfo.h"
12 #include "catch_decomposer.h"
13 #include "catch_interfaces_capture.h"
14 
15 namespace Catch {
16 
17     struct TestFailureException{};
18     struct AssertionResultData;
19     struct IResultCapture;
20     class RunContext;
21 
22     class LazyExpression {
23         friend class AssertionHandler;
24         friend struct AssertionStats;
25         friend class RunContext;
26 
27         ITransientExpression const* m_transientExpression = nullptr;
28         bool m_isNegated;
29     public:
30         LazyExpression( bool isNegated );
31         LazyExpression( LazyExpression const& other );
32         LazyExpression& operator = ( LazyExpression const& ) = delete;
33 
34         explicit operator bool() const;
35 
36         friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&;
37     };
38 
39     struct AssertionReaction {
40         bool shouldDebugBreak = false;
41         bool shouldThrow = false;
42     };
43 
44     class AssertionHandler {
45         AssertionInfo m_assertionInfo;
46         AssertionReaction m_reaction;
47         bool m_completed = false;
48         IResultCapture& m_resultCapture;
49 
50     public:
51         AssertionHandler
52             (   StringRef const& macroName,
53                 SourceLineInfo const& lineInfo,
54                 StringRef capturedExpression,
55                 ResultDisposition::Flags resultDisposition );
~AssertionHandler()56         ~AssertionHandler() {
57             if ( !m_completed ) {
58                 m_resultCapture.handleIncomplete( m_assertionInfo );
59             }
60         }
61 
62 
63         template<typename T>
handleExpr(ExprLhs<T> const & expr)64         void handleExpr( ExprLhs<T> const& expr ) {
65             handleExpr( expr.makeUnaryExpr() );
66         }
67         void handleExpr( ITransientExpression const& expr );
68 
69         void handleMessage(ResultWas::OfType resultType, StringRef const& message);
70 
71         void handleExceptionThrownAsExpected();
72         void handleUnexpectedExceptionNotThrown();
73         void handleExceptionNotThrownAsExpected();
74         void handleThrowingCallSkipped();
75         void handleUnexpectedInflightException();
76 
77         void complete();
78         void setCompleted();
79 
80         // query
81         auto allowThrows() const -> bool;
82     };
83 
84     void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString );
85 
86 } // namespace Catch
87 
88 #endif // TWOBLUECUBES_CATCH_ASSERTIONHANDLER_H_INCLUDED
89