First step to refactoring ResultsCapture into pure calls onto IResultListener interface
diff --git a/internal/catch_capture.hpp b/internal/catch_capture.hpp
index 1e22061..4b15cfe 100644
--- a/internal/catch_capture.hpp
+++ b/internal/catch_capture.hpp
@@ -190,9 +190,19 @@
};
+struct ResultAction
+{
+ enum Value
+ {
+ None,
+ Failed = 1, // Failure - but no debug break if Debug bit not set
+ DebugFailed = 3 // Indicates that the debugger should break, if possible
+ };
+};
+
class TestCaseInfo;
class ScopedInfo;
-
+
struct IResultListener
{
virtual ~IResultListener(){}
@@ -202,18 +212,14 @@
virtual void pushScopedInfo( ScopedInfo* scopedInfo ) = 0;
virtual void popScopedInfo( ScopedInfo* scopedInfo ) = 0;
virtual bool shouldDebugBreak() const = 0;
+
+ virtual ResultAction::Value acceptResult( bool result ) = 0;
+ virtual ResultAction::Value acceptResult( ResultWas::OfType result ) = 0;
+ virtual void acceptExpression( const MutableResultInfo& resultInfo ) = 0;
+ virtual void acceptMessage( const std::string& msg ) = 0;
+
};
- struct ResultAction
- {
- enum Value
- {
- None,
- Failed = 1, // Failure - but no debug break if Debug bit not set
- DebugFailed = 3 // Indicates that the debugger should break, if possible
- };
-
- };
class ResultsCapture
{
@@ -237,60 +243,11 @@
instance().m_listener = listener;
return prevListener;
}
-
- static void acceptExpression( const MutableResultInfo& resultInfo )
+ static IResultListener& getListener()
{
- instance().currentResult = resultInfo;
+ return *instance().m_listener;
}
- static ResultAction::Value acceptResult( bool result )
- {
- return acceptResult( result ? ResultWas::Ok : ResultWas::ExpressionFailed );
- }
-
- static ResultAction::Value acceptResult( ResultWas::OfType result )
- {
- MutableResultInfo& currentResult = instance().currentResult;
- currentResult.setResultType( result );
-
- if( instance().m_listener )
- {
- instance().m_listener->testEnded( currentResult );
- }
- bool ok = currentResult.ok();
- instance().currentResult = MutableResultInfo();
- if( ok )
- return ResultAction::None;
- else if( instance().m_listener->shouldDebugBreak() )
- return ResultAction::DebugFailed;
- else
- return ResultAction::Failed;
- }
-
- static void acceptMessage( const std::string& msg )
- {
- instance().currentResult.setMessage( msg );
- }
-
- static bool acceptSectionStart( const std::string& name, const std::string& description, std::size_t& successes, std::size_t& failures )
- {
- return instance().m_listener->sectionStarted( name, description, successes, failures );
- }
-
- static void acceptSectionEnd( const std::string& name, std::size_t successes, std::size_t failures )
- {
- instance().m_listener->sectionEnded( name, successes, failures );
- }
-
- static void pushScopedInfo( ScopedInfo* scopedInfo )
- {
- instance().m_listener->pushScopedInfo( scopedInfo );
- }
- static void popScopedInfo( ScopedInfo* scopedInfo )
- {
- instance().m_listener->popScopedInfo( scopedInfo );
- }
-
private:
MutableResultInfo currentResult;
IResultListener* m_listener;
@@ -302,12 +259,12 @@
public:
ScopedInfo()
{
- ResultsCapture::pushScopedInfo( this );
+ ResultsCapture::getListener().pushScopedInfo( this );
}
~ScopedInfo()
{
- ResultsCapture::popScopedInfo( this );
+ ResultsCapture::getListener().popScopedInfo( this );
}
ScopedInfo& operator << ( const char* str )
@@ -378,7 +335,7 @@
} // end namespace Catch
#define INTERNAL_CATCH_ACCEPT_RESULT( result, stopOnFailure ) \
- if( Catch::ResultAction::Value action = Catch::ResultsCapture::acceptResult( result ) ) \
+ if( Catch::ResultAction::Value action = Catch::ResultsCapture::getListener().acceptResult( result ) ) \
{ \
if( action == Catch::ResultAction::DebugFailed ) DebugBreak(); \
if( Catch::isTrue( stopOnFailure ) ) throw Catch::TestFailureException(); \
@@ -386,12 +343,12 @@
#define INTERNAL_CATCH_TEST( expr, isNot, stopOnFailure, macroName ) \
{ \
- Catch::ResultsCapture::acceptExpression( Catch::ResultBuilder( #expr, isNot, __FILE__, __LINE__, macroName )->*expr ); \
+ Catch::ResultsCapture::getListener().acceptExpression( Catch::ResultBuilder( #expr, isNot, __FILE__, __LINE__, macroName )->*expr ); \
INTERNAL_CATCH_ACCEPT_RESULT( expr, stopOnFailure ) \
}
#define INTERNAL_CATCH_THROWS( expr, exceptionType, nothrow, stopOnFailure, macroName ) \
- Catch::ResultsCapture::acceptExpression( Catch::ResultBuilder( #expr, false, __FILE__, __LINE__, macroName ) ); \
+ Catch::ResultsCapture::getListener().acceptExpression( Catch::ResultBuilder( #expr, false, __FILE__, __LINE__, macroName ) ); \
try \
{ \
expr; \
@@ -413,8 +370,8 @@
{ \
std::ostringstream INTERNAL_CATCH_UNIQUE_NAME( strm ); \
INTERNAL_CATCH_UNIQUE_NAME( strm ) << reason; \
- Catch::ResultsCapture::acceptExpression( Catch::MutableResultInfo( "", false, __FILE__, __LINE__, macroName ) ); \
- Catch::ResultsCapture::acceptMessage( INTERNAL_CATCH_UNIQUE_NAME( strm ).str() ); \
+ Catch::ResultsCapture::getListener().acceptExpression( Catch::MutableResultInfo( "", false, __FILE__, __LINE__, macroName ) ); \
+ Catch::ResultsCapture::getListener().acceptMessage( INTERNAL_CATCH_UNIQUE_NAME( strm ).str() ); \
INTERNAL_CATCH_ACCEPT_RESULT( resultType, stopOnFailure ) \
}
diff --git a/internal/catch_runner_impl.hpp b/internal/catch_runner_impl.hpp
index 2c2914e..3037823 100644
--- a/internal/catch_runner_impl.hpp
+++ b/internal/catch_runner_impl.hpp
@@ -136,13 +136,13 @@
}
catch( std::exception& ex )
{
- ResultsCapture::acceptMessage( ex.what() );
- ResultsCapture::acceptResult( ResultWas::ThrewException );
+ acceptMessage( ex.what() );
+ acceptResult( ResultWas::ThrewException );
}
catch(...)
{
- ResultsCapture::acceptMessage( "unknown exception" );
- ResultsCapture::acceptResult( ResultWas::ThrewException );
+ acceptMessage( "unknown exception" );
+ acceptResult( ResultWas::ThrewException );
}
m_info.clear();
m_reporter->EndTestCase( testInfo, redirectedCout, redirectedCerr );
@@ -159,6 +159,39 @@
}
private: // IResultListener
+
+ virtual ResultAction::Value acceptResult( bool result )
+ {
+ return acceptResult( result ? ResultWas::Ok : ResultWas::ExpressionFailed );
+ }
+
+ virtual ResultAction::Value acceptResult( ResultWas::OfType result )
+ {
+ m_currentResult.setResultType( result );
+ testEnded( m_currentResult );
+
+ bool ok = m_currentResult.ok();
+ m_currentResult = MutableResultInfo();
+ if( ok )
+ return ResultAction::None;
+ else if( shouldDebugBreak() )
+ return ResultAction::DebugFailed;
+ else
+ return ResultAction::Failed;
+
+ }
+
+ virtual void acceptExpression( const MutableResultInfo& resultInfo )
+ {
+ m_currentResult = resultInfo;
+ }
+
+ virtual void acceptMessage( const std::string& msg )
+ {
+ m_currentResult.setMessage( msg );
+ }
+
+ ///
virtual void testEnded( const ResultInfo& result )
{
@@ -213,6 +246,8 @@
}
private:
+ MutableResultInfo m_currentResult;
+
const RunnerConfig& m_config;
std::size_t m_successes;
std::size_t m_failures;
diff --git a/internal/catch_section.hpp b/internal/catch_section.hpp
index d72bb54..dc8fba9 100644
--- a/internal/catch_section.hpp
+++ b/internal/catch_section.hpp
@@ -24,13 +24,13 @@
public:
Section( const std::string& name, const std::string& description )
: m_name( name ),
- m_sectionIncluded( ResultsCapture::acceptSectionStart( name, description, m_successes, m_failures ) )
+ m_sectionIncluded( ResultsCapture::getListener().sectionStarted( name, description, m_successes, m_failures ) )
{
}
~Section()
{
- ResultsCapture::acceptSectionEnd( m_name, m_successes, m_failures );
+ ResultsCapture::getListener().sectionEnded( m_name, m_successes, m_failures );
}
// This indicates whether the section should be executed or not