| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Created by Phil on 28/5/2014. | 
					
						
							|  |  |  |  *  Copyright 2014 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_RESULT_BUILDER_H_INCLUDED
 | 
					
						
							|  |  |  | #define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  | #include "catch_result_type.h"
 | 
					
						
							|  |  |  | #include "catch_assertionresult.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  | #include "catch_common.h"
 | 
					
						
							| 
									
										
										
										
											2015-07-15 23:02:25 +01:00
										 |  |  | #include "catch_matchers.hpp"
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct TestFailureException{}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |     template<typename T> class ExpressionLhs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct CopyableStream { | 
					
						
							|  |  |  |         CopyableStream() {} | 
					
						
							|  |  |  |         CopyableStream( CopyableStream const& other ) { | 
					
						
							|  |  |  |             oss << other.oss.str(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         CopyableStream& operator=( CopyableStream const& other ) { | 
					
						
							|  |  |  |             oss.str(""); | 
					
						
							|  |  |  |             oss << other.oss.str(); | 
					
						
							|  |  |  |             return *this; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         std::ostringstream oss; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class ResultBuilder { | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         ResultBuilder(  char const* macroName, | 
					
						
							|  |  |  |                         SourceLineInfo const& lineInfo, | 
					
						
							|  |  |  |                         char const* capturedExpression, | 
					
						
							| 
									
										
										
										
											2015-07-13 06:34:41 +01:00
										 |  |  |                         ResultDisposition::Flags resultDisposition, | 
					
						
							|  |  |  |                         char const* secondArg = "" ); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         template<typename T> | 
					
						
							| 
									
										
										
										
											2015-06-26 06:35:33 +01:00
										 |  |  |         ExpressionLhs<T const&> operator <= ( T const& operand ); | 
					
						
							|  |  |  |         ExpressionLhs<bool> operator <= ( bool value ); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |         template<typename T> | 
					
						
							|  |  |  |         ResultBuilder& operator << ( T const& value ) { | 
					
						
							|  |  |  |             m_stream.oss << value; | 
					
						
							|  |  |  |             return *this; | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |         template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); | 
					
						
							|  |  |  |         template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ResultBuilder& setResultType( ResultWas::OfType result ); | 
					
						
							|  |  |  |         ResultBuilder& setResultType( bool result ); | 
					
						
							|  |  |  |         ResultBuilder& setLhs( std::string const& lhs ); | 
					
						
							|  |  |  |         ResultBuilder& setRhs( std::string const& rhs ); | 
					
						
							|  |  |  |         ResultBuilder& setOp( std::string const& op ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void endExpression(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         std::string reconstructExpression() const; | 
					
						
							|  |  |  |         AssertionResult build() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); | 
					
						
							|  |  |  |         void captureResult( ResultWas::OfType resultType ); | 
					
						
							|  |  |  |         void captureExpression(); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:34:41 +01:00
										 |  |  |         void captureExpectedException( std::string const& expectedMessage ); | 
					
						
							| 
									
										
										
										
											2015-07-15 23:02:25 +01:00
										 |  |  |         void captureExpectedException( Matchers::Impl::Matcher<std::string> const& matcher ); | 
					
						
							| 
									
										
										
										
											2015-07-13 06:34:41 +01:00
										 |  |  |         void handleResult( AssertionResult const& result ); | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         void react(); | 
					
						
							|  |  |  |         bool shouldDebugBreak() const; | 
					
						
							|  |  |  |         bool allowThrows() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         AssertionInfo m_assertionInfo; | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |         AssertionResultData m_data; | 
					
						
							|  |  |  |         struct ExprComponents { | 
					
						
							|  |  |  |             ExprComponents() : testFalse( false ) {} | 
					
						
							|  |  |  |             bool testFalse; | 
					
						
							|  |  |  |             std::string lhs, rhs, op; | 
					
						
							|  |  |  |         } m_exprComponents; | 
					
						
							|  |  |  |         CopyableStream m_stream; | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         bool m_shouldDebugBreak; | 
					
						
							|  |  |  |         bool m_shouldThrow; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  | } // namespace Catch
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Include after due to circular dependency:
 | 
					
						
							|  |  |  | #include "catch_expression_lhs.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template<typename T> | 
					
						
							| 
									
										
										
										
											2015-06-26 06:35:33 +01:00
										 |  |  |     inline ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) { | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |         return ExpressionLhs<T const&>( *this, operand ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-26 06:35:33 +01:00
										 |  |  |     inline ExpressionLhs<bool> ResultBuilder::operator <= ( bool value ) { | 
					
						
							| 
									
										
										
										
											2014-05-29 07:50:19 +01:00
										 |  |  |         return ExpressionLhs<bool>( *this, value ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Catch
 | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif // TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED
 |