mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Some RunContext clean-up
This commit is contained in:
		| @@ -87,7 +87,9 @@ namespace Catch { | ||||
|             std::srand( config.rngSeed() ); | ||||
|     } | ||||
|     unsigned int rngSeed() { | ||||
|         return getCurrentContext().getConfig()->rngSeed(); | ||||
|         return getCurrentConfig() | ||||
|             ? getCurrentConfig()->rngSeed() | ||||
|             : 0; | ||||
|     } | ||||
|  | ||||
|     std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { | ||||
|   | ||||
| @@ -145,7 +145,7 @@ namespace { | ||||
|     }; | ||||
|  | ||||
|     IColourImpl* platformColourInstance() { | ||||
|         Ptr<IConfig const> config = getCurrentContext().getConfig(); | ||||
|         IConfig const* config = getCurrentConfig(); | ||||
|         return (config && config->forceColour()) || isatty(STDOUT_FILENO) | ||||
|             ? PosixColourImpl::instance() | ||||
|             : NoColourImpl::instance(); | ||||
|   | ||||
| @@ -28,7 +28,7 @@ namespace Catch { | ||||
|  | ||||
|         virtual IResultCapture* getResultCapture() = 0; | ||||
|         virtual IRunner* getRunner() = 0; | ||||
|         virtual Ptr<IConfig const> getConfig() const = 0; | ||||
|         virtual IConfig const* getConfig() const = 0; | ||||
|     }; | ||||
|  | ||||
|     struct IMutableContext : IContext | ||||
| @@ -42,8 +42,7 @@ namespace Catch { | ||||
|     IContext& getCurrentContext(); | ||||
|     IMutableContext& getCurrentMutableContext(); | ||||
|     void cleanUpContext(); | ||||
|     Stream createStream( std::string const& streamName ); | ||||
|  | ||||
|     IConfig const* getCurrentConfig(); | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED | ||||
|   | ||||
| @@ -28,8 +28,8 @@ namespace Catch { | ||||
|         virtual IRunner* getRunner() { | ||||
|             return m_runner; | ||||
|         } | ||||
|         virtual Ptr<IConfig const> getConfig() const { | ||||
|             return m_config; | ||||
|         virtual IConfig const* getConfig() const { | ||||
|             return m_config.get(); | ||||
|         } | ||||
|  | ||||
|     public: // IMutableContext | ||||
| @@ -67,6 +67,13 @@ namespace Catch { | ||||
|         delete currentContext; | ||||
|         currentContext = CATCH_NULL; | ||||
|     } | ||||
|  | ||||
|     IConfig const* getCurrentConfig() { | ||||
|         return currentContext | ||||
|             ? currentContext->getConfig() | ||||
|             : CATCH_NULL; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED | ||||
|   | ||||
| @@ -101,7 +101,7 @@ namespace Catch { | ||||
|         getResultCapture().assertionEnded( result ); | ||||
|  | ||||
|         if( !result.isOk() ) { | ||||
|             if( getCurrentContext().getConfig()->shouldDebugBreak() ) | ||||
|             if( getCurrentConfig()->shouldDebugBreak() ) | ||||
|                 m_shouldDebugBreak = true; | ||||
|             if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) | ||||
|                 m_shouldThrow = true; | ||||
| @@ -113,7 +113,7 @@ namespace Catch { | ||||
|     } | ||||
|  | ||||
|     bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } | ||||
|     bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } | ||||
|     bool ResultBuilder::allowThrows() const { return getCurrentConfig()->allowThrows(); } | ||||
|  | ||||
|     AssertionResult ResultBuilder::build() const | ||||
|     { | ||||
|   | ||||
| @@ -62,9 +62,9 @@ namespace Catch { | ||||
|         explicit RunContext( Ptr<IConfig const> const& _config, Ptr<IStreamingReporter> const& reporter ) | ||||
|         :   m_runInfo( _config->name() ), | ||||
|             m_context( getCurrentMutableContext() ), | ||||
|             m_activeTestCase( CATCH_NULL ), | ||||
|             m_config( _config ), | ||||
|             m_reporter( reporter ) | ||||
|             m_reporter( reporter ), | ||||
|             m_activeTestCaseInfo( CATCH_NULL ) | ||||
|         { | ||||
|             m_context.setRunner( this ); | ||||
|             m_context.setConfig( m_config ); | ||||
| @@ -84,36 +84,33 @@ namespace Catch { | ||||
|         } | ||||
|  | ||||
|         Totals runTest( TestCase const& testCase ) { | ||||
|             m_activeTestCaseInfo = &testCase; | ||||
|  | ||||
|             Totals prevTotals = m_totals; | ||||
|             std::string redirectedCout, redirectedCerr; | ||||
|  | ||||
|             std::string redirectedCout; | ||||
|             std::string redirectedCerr; | ||||
|  | ||||
|             TestCaseInfo testInfo = testCase.getTestCaseInfo(); | ||||
|  | ||||
|             m_reporter->testCaseStarting( testInfo ); | ||||
|  | ||||
|             m_activeTestCase = &testCase; | ||||
|             m_reporter->testCaseStarting( testCase ); | ||||
|  | ||||
|             ITracker* m_testCaseTracker; | ||||
|  | ||||
|             m_trackerContext.startRun(); | ||||
|             do { | ||||
|                 m_trackerContext.startCycle(); | ||||
|                 m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testInfo.name ); | ||||
|                 runCurrentTest( redirectedCout, redirectedCerr ); | ||||
|                 m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testCase.name ); | ||||
|                 runTest( testCase, redirectedCout, redirectedCerr ); | ||||
|             } | ||||
|             while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); | ||||
|  | ||||
|              | ||||
|             Totals deltaTotals = m_totals.delta( prevTotals ); | ||||
|             m_totals.testCases += deltaTotals.testCases; | ||||
|             m_reporter->testCaseEnded( TestCaseStats(   testInfo, | ||||
|             m_reporter->testCaseEnded( TestCaseStats(   testCase, | ||||
|                                                         deltaTotals, | ||||
|                                                         redirectedCout, | ||||
|                                                         redirectedCerr, | ||||
|                                                         aborting() ) ); | ||||
|  | ||||
|             m_activeTestCase = CATCH_NULL; | ||||
|             m_testCaseTracker = CATCH_NULL; | ||||
|             m_activeTestCaseInfo = CATCH_NULL; | ||||
|  | ||||
|             return deltaTotals; | ||||
|         } | ||||
| @@ -126,12 +123,10 @@ namespace Catch { | ||||
|  | ||||
|  | ||||
|         virtual void assertionEnded( AssertionResult const& result ) { | ||||
|             if( result.getResultType() == ResultWas::Ok ) { | ||||
|             if( result.getResultType() == ResultWas::Ok ) | ||||
|                 m_totals.assertions.passed++; | ||||
|             } | ||||
|             else if( !result.isOk() ) { | ||||
|             else if( !result.isOk() ) | ||||
|                 m_totals.assertions.failed++; | ||||
|             } | ||||
|  | ||||
|             if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) | ||||
|                 m_messages.clear(); | ||||
| @@ -206,8 +201,8 @@ namespace Catch { | ||||
|         } | ||||
|  | ||||
|         virtual std::string getCurrentTestName() const { | ||||
|             return m_activeTestCase | ||||
|                 ? m_activeTestCase->getTestCaseInfo().name | ||||
|             return m_activeTestCaseInfo | ||||
|                 ? m_activeTestCaseInfo->name | ||||
|                 : ""; | ||||
|         } | ||||
|  | ||||
| @@ -224,19 +219,19 @@ namespace Catch { | ||||
|             handleUnfinishedSections(); | ||||
|  | ||||
|             // Recreate section for test case (as we will lose the one that was in scope) | ||||
|             TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); | ||||
|             SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); | ||||
|             SectionInfo testCaseSection | ||||
|                 (   m_activeTestCaseInfo->lineInfo, | ||||
|                     m_activeTestCaseInfo->name, | ||||
|                     m_activeTestCaseInfo->description ); | ||||
|  | ||||
|             Counts assertions; | ||||
|             assertions.failed = 1; | ||||
|             SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); | ||||
|             m_reporter->sectionEnded( testCaseSectionStats ); | ||||
|  | ||||
|             TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); | ||||
|  | ||||
|             Totals deltaTotals; | ||||
|             deltaTotals.testCases.failed = 1; | ||||
|             m_reporter->testCaseEnded( TestCaseStats(   testInfo, | ||||
|             m_reporter->testCaseEnded( TestCaseStats(   *m_activeTestCaseInfo, | ||||
|                                                         deltaTotals, | ||||
|                                                         "", | ||||
|                                                         "", | ||||
| @@ -254,14 +249,13 @@ namespace Catch { | ||||
|  | ||||
|     private: | ||||
|  | ||||
|         void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { | ||||
|             TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); | ||||
|             SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); | ||||
|         void runTest( TestCase const& testCase, std::string& redirectedCout, std::string& redirectedCerr ) { | ||||
|             SectionInfo testCaseSection( testCase.lineInfo, testCase.name, testCase.description ); | ||||
|             m_reporter->sectionStarting( testCaseSection ); | ||||
|             Counts prevAssertions = m_totals.assertions; | ||||
|             double duration = 0; | ||||
|             try { | ||||
|                 m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); | ||||
|                 m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCase.lineInfo, "", ResultDisposition::Normal ); | ||||
|  | ||||
|                 seedRng( *m_config ); | ||||
|  | ||||
| @@ -270,10 +264,10 @@ namespace Catch { | ||||
|                 if( m_reporter->getPreferences().shouldRedirectStdOut ) { | ||||
|                     StreamRedirect coutRedir( Catch::cout(), redirectedCout ); | ||||
|                     StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); | ||||
|                     invokeActiveTestCase(); | ||||
|                     invokeTestCase( testCase ); | ||||
|                 } | ||||
|                 else { | ||||
|                     invokeActiveTestCase(); | ||||
|                     invokeTestCase( testCase ); | ||||
|                 } | ||||
|                 duration = timer.getElapsedSeconds(); | ||||
|             } | ||||
| @@ -283,14 +277,15 @@ namespace Catch { | ||||
|             catch(...) { | ||||
|                 makeUnexpectedResultBuilder().useActiveException(); | ||||
|             } | ||||
|             m_testCaseTracker->close(); | ||||
|             m_trackerContext.currentTracker().close(); | ||||
|              | ||||
|             handleUnfinishedSections(); | ||||
|             m_messages.clear(); | ||||
|  | ||||
|             Counts assertions = m_totals.assertions - prevAssertions; | ||||
|             bool missingAssertions = testForMissingAssertions( assertions ); | ||||
|  | ||||
|             if( testCaseInfo.okToFail() ) { | ||||
|             if( testCase.okToFail() ) { | ||||
|                 std::swap( assertions.failedButOk, assertions.failed ); | ||||
|                 m_totals.assertions.failed -= assertions.failedButOk; | ||||
|                 m_totals.assertions.failedButOk += assertions.failedButOk; | ||||
| @@ -300,10 +295,9 @@ namespace Catch { | ||||
|             m_reporter->sectionEnded( testCaseSectionStats ); | ||||
|         } | ||||
|  | ||||
|         void invokeActiveTestCase() { | ||||
|         static void invokeTestCase( TestCase const& testCase ) { | ||||
|             FatalConditionHandler fatalConditionHandler; // Handle signals | ||||
|             m_activeTestCase->invoke(); | ||||
|             fatalConditionHandler.reset(); | ||||
|             testCase.invoke(); | ||||
|         } | ||||
|  | ||||
|     private: | ||||
| @@ -328,19 +322,19 @@ namespace Catch { | ||||
|  | ||||
|         TestRunInfo m_runInfo; | ||||
|         IMutableContext& m_context; | ||||
|         TestCase const* m_activeTestCase; | ||||
|         ITracker* m_testCaseTracker; | ||||
|         ITracker* m_currentSectionTracker; | ||||
|         AssertionResult m_lastResult; | ||||
|  | ||||
|         Ptr<IConfig const> m_config; | ||||
|         Totals m_totals; | ||||
|         Ptr<IStreamingReporter> m_reporter; | ||||
|         std::vector<MessageInfo> m_messages; | ||||
|         TrackerContext m_trackerContext; | ||||
|         Totals m_totals; | ||||
|          | ||||
|         // Transient state | ||||
|         TestCaseInfo const* m_activeTestCaseInfo; | ||||
|         AssertionResult m_lastResult; | ||||
|         AssertionInfo m_lastAssertionInfo; | ||||
|         std::vector<SectionEndInfo> m_unfinishedSections; | ||||
|         std::vector<ITracker*> m_activeSections; | ||||
|         TrackerContext m_trackerContext; | ||||
|         std::vector<MessageInfo> m_messages; | ||||
|     }; | ||||
|  | ||||
|     IResultCapture& getResultCapture() { | ||||
|   | ||||
| @@ -55,7 +55,7 @@ namespace Detail { | ||||
|  | ||||
| std::string toString( std::string const& value ) { | ||||
|     std::string s = value; | ||||
|     if( getCurrentContext().getConfig()->showInvisibles() ) { | ||||
|     if( getCurrentConfig() && getCurrentConfig()->showInvisibles() ) { | ||||
|         for(size_t i = 0; i < s.size(); ++i ) { | ||||
|             std::string subs; | ||||
|             switch( s[i] ) { | ||||
|   | ||||
| @@ -1,2 +1,2 @@ | ||||
| // The old generators have been removed | ||||
| // A new generator implementation is coming | ||||
| // A new generator implementation is coming | ||||
|   | ||||
| @@ -475,6 +475,8 @@ TEST_CASE( "long long" ) { | ||||
|  | ||||
| //TEST_CASE( "Divide by Zero signal handler", "[.][sig]" ) { | ||||
| //    int i = 0; | ||||
| //    int x = 10/i; // This should cause the signal to fire | ||||
| //    CHECK( x == 0 ); | ||||
| //    SECTION( "s" ) { | ||||
| //        int x = 10/i; // This should cause the signal to fire | ||||
| //        CHECK( x == 0 ); | ||||
| //    } | ||||
| //} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash