mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	First cut of -c/—section option for running specific sections
This commit is contained in:
		| @@ -23,6 +23,7 @@ namespace Catch { | |||||||
|         config.abortAfter = x; |         config.abortAfter = x; | ||||||
|     } |     } | ||||||
|     inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } |     inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } | ||||||
|  |     inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); } | ||||||
|     inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } |     inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } | ||||||
|  |  | ||||||
|     inline void addWarning( ConfigData& config, std::string const& _warning ) { |     inline void addWarning( ConfigData& config, std::string const& _warning ) { | ||||||
| @@ -176,6 +177,10 @@ namespace Catch { | |||||||
|             .describe( "adds a tag for the filename" ) |             .describe( "adds a tag for the filename" ) | ||||||
|             .bind( &ConfigData::filenamesAsTags ); |             .bind( &ConfigData::filenamesAsTags ); | ||||||
|  |  | ||||||
|  |         cli["-c"]["--section"] | ||||||
|  |                 .describe( "specify section to run" ) | ||||||
|  |                 .bind( &addSectionToRun, "section name" ); | ||||||
|  |  | ||||||
|         // Less common commands which don't have a short form |         // Less common commands which don't have a short form | ||||||
|         cli["--list-test-names-only"] |         cli["--list-test-names-only"] | ||||||
|             .describe( "list all/matching test cases names only" ) |             .describe( "list all/matching test cases names only" ) | ||||||
|   | |||||||
| @@ -74,6 +74,7 @@ namespace Catch { | |||||||
|  |  | ||||||
|         std::vector<std::string> reporterNames; |         std::vector<std::string> reporterNames; | ||||||
|         std::vector<std::string> testsOrTags; |         std::vector<std::string> testsOrTags; | ||||||
|  |         std::vector<std::string> sectionsToRun; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -115,7 +116,8 @@ namespace Catch { | |||||||
|  |  | ||||||
|         bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } |         bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } | ||||||
|  |  | ||||||
|         std::vector<std::string> getReporterNames() const { return m_data.reporterNames; } |         std::vector<std::string> const& getReporterNames() const { return m_data.reporterNames; } | ||||||
|  |         std::vector<std::string> const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; } | ||||||
|  |  | ||||||
|         int abortAfter() const { return m_data.abortAfter; } |         int abortAfter() const { return m_data.abortAfter; } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -62,6 +62,8 @@ namespace Catch { | |||||||
|         virtual RunTests::InWhatOrder runOrder() const = 0; |         virtual RunTests::InWhatOrder runOrder() const = 0; | ||||||
|         virtual unsigned int rngSeed() const = 0; |         virtual unsigned int rngSeed() const = 0; | ||||||
|         virtual UseColour::YesOrNo useColour() const = 0; |         virtual UseColour::YesOrNo useColour() const = 0; | ||||||
|  |         virtual std::vector<std::string> const& getSectionsToRun() const = 0; | ||||||
|  |  | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -97,10 +97,11 @@ namespace Catch { | |||||||
|  |  | ||||||
|  |  | ||||||
|             do { |             do { | ||||||
|                 m_trackerContext.startRun(); |                 ITracker& rootTracker = m_trackerContext.startRun(); | ||||||
|  |                 dynamic_cast<SectionTracker&>( rootTracker ).addInitialFilters( m_config->getSectionsToRun() ); | ||||||
|                 do { |                 do { | ||||||
|                     m_trackerContext.startCycle(); |                     m_trackerContext.startCycle(); | ||||||
|                     m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testInfo.name ); |                     m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) ); | ||||||
|                     runCurrentTest( redirectedCout, redirectedCerr ); |                     runCurrentTest( redirectedCout, redirectedCerr ); | ||||||
|                 } |                 } | ||||||
|                 while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); |                 while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); | ||||||
| @@ -155,10 +156,7 @@ namespace Catch { | |||||||
|             Counts& assertions |             Counts& assertions | ||||||
|         ) |         ) | ||||||
|         { |         { | ||||||
|             std::ostringstream oss; |             ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) ); | ||||||
|             oss << sectionInfo.name << "@" << sectionInfo.lineInfo; |  | ||||||
|  |  | ||||||
|             ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, oss.str() ); |  | ||||||
|             if( !sectionTracker.isOpen() ) |             if( !sectionTracker.isOpen() ) | ||||||
|                 return false; |                 return false; | ||||||
|             m_activeSections.push_back( §ionTracker ); |             m_activeSections.push_back( §ionTracker ); | ||||||
|   | |||||||
| @@ -19,11 +19,21 @@ | |||||||
| namespace Catch { | namespace Catch { | ||||||
| namespace TestCaseTracking { | namespace TestCaseTracking { | ||||||
|  |  | ||||||
|  |     struct NameAndLocation { | ||||||
|  |         std::string name; | ||||||
|  |         SourceLineInfo location; | ||||||
|  |  | ||||||
|  |         NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) | ||||||
|  |         :   name( _name ), | ||||||
|  |             location( _location ) | ||||||
|  |         {} | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     struct ITracker : SharedImpl<> { |     struct ITracker : SharedImpl<> { | ||||||
|         virtual ~ITracker(); |         virtual ~ITracker(); | ||||||
|  |  | ||||||
|         // static queries |         // static queries | ||||||
|         virtual std::string name() const = 0; |         virtual NameAndLocation const& nameAndLocation() const = 0; | ||||||
|  |  | ||||||
|         // dynamic queries |         // dynamic queries | ||||||
|         virtual bool isComplete() const = 0; // Successfully completed or failed |         virtual bool isComplete() const = 0; // Successfully completed or failed | ||||||
| @@ -39,7 +49,7 @@ namespace TestCaseTracking { | |||||||
|         virtual void markAsNeedingAnotherRun() = 0; |         virtual void markAsNeedingAnotherRun() = 0; | ||||||
|  |  | ||||||
|         virtual void addChild( Ptr<ITracker> const& child ) = 0; |         virtual void addChild( Ptr<ITracker> const& child ) = 0; | ||||||
|         virtual ITracker* findChild( std::string const& name ) = 0; |         virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0; | ||||||
|         virtual void openChild() = 0; |         virtual void openChild() = 0; | ||||||
|          |          | ||||||
|         // Debug/ checking |         // Debug/ checking | ||||||
| @@ -47,7 +57,7 @@ namespace TestCaseTracking { | |||||||
|         virtual bool isIndexTracker() const = 0; |         virtual bool isIndexTracker() const = 0; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     class TrackerContext { |     class  TrackerContext { | ||||||
|  |  | ||||||
|         enum RunState { |         enum RunState { | ||||||
|             NotStarted, |             NotStarted, | ||||||
| @@ -110,30 +120,32 @@ namespace TestCaseTracking { | |||||||
|             Failed |             Failed | ||||||
|         }; |         }; | ||||||
|         class TrackerHasName { |         class TrackerHasName { | ||||||
|             std::string m_name; |             NameAndLocation m_nameAndLocation; | ||||||
|         public: |         public: | ||||||
|             TrackerHasName( std::string const& name ) : m_name( name ) {} |             TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} | ||||||
|             bool operator ()( Ptr<ITracker> const& tracker ) { |             bool operator ()( Ptr<ITracker> const& tracker ) { | ||||||
|                 return tracker->name() == m_name; |                 return | ||||||
|  |                     tracker->nameAndLocation().name == m_nameAndLocation.name && | ||||||
|  |                     tracker->nameAndLocation().location == m_nameAndLocation.location; | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|         typedef std::vector<Ptr<ITracker> > Children; |         typedef std::vector<Ptr<ITracker> > Children; | ||||||
|         std::string m_name; |         NameAndLocation m_nameAndLocation; | ||||||
|         TrackerContext& m_ctx; |         TrackerContext& m_ctx; | ||||||
|         ITracker* m_parent; |         ITracker* m_parent; | ||||||
|         Children m_children; |         Children m_children; | ||||||
|         CycleState m_runState; |         CycleState m_runState; | ||||||
|     public: |     public: | ||||||
|         TrackerBase( std::string const& name, TrackerContext& ctx, ITracker* parent ) |         TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) | ||||||
|         :   m_name( name ), |         :   m_nameAndLocation( nameAndLocation ), | ||||||
|             m_ctx( ctx ), |             m_ctx( ctx ), | ||||||
|             m_parent( parent ), |             m_parent( parent ), | ||||||
|             m_runState( NotStarted ) |             m_runState( NotStarted ) | ||||||
|         {} |         {} | ||||||
|         virtual ~TrackerBase(); |         virtual ~TrackerBase(); | ||||||
|  |  | ||||||
|         virtual std::string name() const CATCH_OVERRIDE { |         virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE { | ||||||
|             return m_name; |             return m_nameAndLocation; | ||||||
|         } |         } | ||||||
|         virtual bool isComplete() const CATCH_OVERRIDE { |         virtual bool isComplete() const CATCH_OVERRIDE { | ||||||
|             return m_runState == CompletedSuccessfully || m_runState == Failed; |             return m_runState == CompletedSuccessfully || m_runState == Failed; | ||||||
| @@ -153,8 +165,8 @@ namespace TestCaseTracking { | |||||||
|             m_children.push_back( child ); |             m_children.push_back( child ); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         virtual ITracker* findChild( std::string const& name ) CATCH_OVERRIDE { |         virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE { | ||||||
|             Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( name ) ); |             Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); | ||||||
|             return( it != m_children.end() ) |             return( it != m_children.end() ) | ||||||
|                 ? it->get() |                 ? it->get() | ||||||
|                 : CATCH_NULL; |                 : CATCH_NULL; | ||||||
| @@ -232,41 +244,65 @@ namespace TestCaseTracking { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     class SectionTracker : public TrackerBase { |     class SectionTracker : public TrackerBase { | ||||||
|  |         std::vector<std::string> m_filters; | ||||||
|     public: |     public: | ||||||
|         SectionTracker( std::string const& name, TrackerContext& ctx, ITracker* parent ) |         SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) | ||||||
|         :   TrackerBase( name, ctx, parent ) |         :   TrackerBase( nameAndLocation, ctx, parent ) | ||||||
|         {} |         { | ||||||
|  |             if( parent ) { | ||||||
|  |                 while( !parent->isSectionTracker() ) | ||||||
|  |                     parent = &parent->parent(); | ||||||
|  |  | ||||||
|  |                 SectionTracker& parentSection = static_cast<SectionTracker&>( *parent ); | ||||||
|  |                 addNextFilters( parentSection.m_filters ); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|         virtual ~SectionTracker(); |         virtual ~SectionTracker(); | ||||||
|  |  | ||||||
|         virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } |         virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } | ||||||
|          |          | ||||||
|         static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) { |         static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { | ||||||
|             SectionTracker* section = CATCH_NULL; |             SectionTracker* section = CATCH_NULL; | ||||||
|  |  | ||||||
|             ITracker& currentTracker = ctx.currentTracker(); |             ITracker& currentTracker = ctx.currentTracker(); | ||||||
|             if( ITracker* childTracker = currentTracker.findChild( name ) ) { |             if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { | ||||||
|                 assert( childTracker ); |                 assert( childTracker ); | ||||||
|                 assert( childTracker->isSectionTracker() ); |                 assert( childTracker->isSectionTracker() ); | ||||||
|                 section = static_cast<SectionTracker*>( childTracker ); |                 section = static_cast<SectionTracker*>( childTracker ); | ||||||
|             } |             } | ||||||
|             else { |             else { | ||||||
|                 section = new SectionTracker( name, ctx, ¤tTracker ); |                 section = new SectionTracker( nameAndLocation, ctx, ¤tTracker ); | ||||||
|                 currentTracker.addChild( section ); |                 currentTracker.addChild( section ); | ||||||
|             } |             } | ||||||
|             if( !ctx.completedCycle() && !section->isComplete() ) { |             if( !ctx.completedCycle() ) | ||||||
|  |                 section->tryOpen(); | ||||||
|                 section->open(); |  | ||||||
|             } |  | ||||||
|             return *section; |             return *section; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         void tryOpen() { | ||||||
|  |             if( !isComplete() && (m_filters.empty() || m_filters[0].empty() ||  m_filters[0] == m_nameAndLocation.name ) ) | ||||||
|  |                 open(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         void addInitialFilters( std::vector<std::string> const& filters ) { | ||||||
|  |             if( !filters.empty() ) { | ||||||
|  |                 m_filters.push_back(""); // Root - should never be consulted | ||||||
|  |                 m_filters.push_back(""); // Test Case - not a section filter | ||||||
|  |                 std::copy( filters.begin(), filters.end(), std::back_inserter( m_filters ) ); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         void addNextFilters( std::vector<std::string> const& filters ) { | ||||||
|  |             if( filters.size() > 1 ) | ||||||
|  |                 std::copy( filters.begin()+1, filters.end(), std::back_inserter( m_filters ) ); | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     class IndexTracker : public TrackerBase { |     class IndexTracker : public TrackerBase { | ||||||
|         int m_size; |         int m_size; | ||||||
|         int m_index; |         int m_index; | ||||||
|     public: |     public: | ||||||
|         IndexTracker( std::string const& name, TrackerContext& ctx, ITracker* parent, int size ) |         IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) | ||||||
|         :   TrackerBase( name, ctx, parent ), |         :   TrackerBase( nameAndLocation, ctx, parent ), | ||||||
|             m_size( size ), |             m_size( size ), | ||||||
|             m_index( -1 ) |             m_index( -1 ) | ||||||
|         {} |         {} | ||||||
| @@ -274,17 +310,17 @@ namespace TestCaseTracking { | |||||||
|  |  | ||||||
|         virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } |         virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } | ||||||
|          |          | ||||||
|         static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) { |         static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { | ||||||
|             IndexTracker* tracker = CATCH_NULL; |             IndexTracker* tracker = CATCH_NULL; | ||||||
|  |  | ||||||
|             ITracker& currentTracker = ctx.currentTracker(); |             ITracker& currentTracker = ctx.currentTracker(); | ||||||
|             if( ITracker* childTracker = currentTracker.findChild( name ) ) { |             if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) { | ||||||
|                 assert( childTracker ); |                 assert( childTracker ); | ||||||
|                 assert( childTracker->isIndexTracker() ); |                 assert( childTracker->isIndexTracker() ); | ||||||
|                 tracker = static_cast<IndexTracker*>( childTracker ); |                 tracker = static_cast<IndexTracker*>( childTracker ); | ||||||
|             } |             } | ||||||
|             else { |             else { | ||||||
|                 tracker = new IndexTracker( name, ctx, ¤tTracker, size ); |                 tracker = new IndexTracker( nameAndLocation, ctx, ¤tTracker, size ); | ||||||
|                 currentTracker.addChild( tracker ); |                 currentTracker.addChild( tracker ); | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -312,7 +348,7 @@ namespace TestCaseTracking { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline ITracker& TrackerContext::startRun() { |     inline ITracker& TrackerContext::startRun() { | ||||||
|         m_rootTracker = new SectionTracker( "{root}", *this, CATCH_NULL ); |         m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL ); | ||||||
|         m_currentTracker = CATCH_NULL; |         m_currentTracker = CATCH_NULL; | ||||||
|         m_runState = Executing; |         m_runState = Executing; | ||||||
|         return *m_rootTracker; |         return *m_rootTracker; | ||||||
|   | |||||||
| @@ -36,16 +36,21 @@ using namespace Catch; | |||||||
| //    REQUIRE( C_A_T_C_H_Context().i() == 42 ); | //    REQUIRE( C_A_T_C_H_Context().i() == 42 ); | ||||||
| //} | //} | ||||||
|  |  | ||||||
|  | Catch::TestCaseTracking::NameAndLocation makeNAL( std::string const& name ) { | ||||||
|  |     return Catch::TestCaseTracking::NameAndLocation( name, Catch::SourceLineInfo() ); | ||||||
|  | } | ||||||
|  |  | ||||||
| TEST_CASE( "Tracker", "" ) { | TEST_CASE( "Tracker", "" ) { | ||||||
|  |  | ||||||
|     TrackerContext ctx; |     TrackerContext ctx; | ||||||
|     ctx.startRun(); |     ctx.startRun(); | ||||||
|     ctx.startCycle(); |     ctx.startCycle(); | ||||||
|  |  | ||||||
|     ITracker& testCase = SectionTracker::acquire( ctx, "Testcase" ); |  | ||||||
|  |     ITracker& testCase = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|     REQUIRE( testCase.isOpen() ); |     REQUIRE( testCase.isOpen() ); | ||||||
|  |  | ||||||
|     ITracker& s1 = SectionTracker::acquire( ctx, "S1" ); |     ITracker& s1 = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|     REQUIRE( s1.isOpen() ); |     REQUIRE( s1.isOpen() ); | ||||||
|  |  | ||||||
|     SECTION( "successfully close one section", "" ) { |     SECTION( "successfully close one section", "" ) { | ||||||
| @@ -70,10 +75,10 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|         SECTION( "re-enter after failed section", "" ) { |         SECTION( "re-enter after failed section", "" ) { | ||||||
|             ctx.startCycle(); |             ctx.startCycle(); | ||||||
|             ITracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" ); |             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|             REQUIRE( testCase2.isOpen() ); |             REQUIRE( testCase2.isOpen() ); | ||||||
|  |  | ||||||
|             ITracker& s1b = SectionTracker::acquire( ctx, "S1" ); |             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|             REQUIRE( s1b.isOpen() == false ); |             REQUIRE( s1b.isOpen() == false ); | ||||||
|  |  | ||||||
|             testCase2.close(); |             testCase2.close(); | ||||||
| @@ -83,13 +88,13 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|         } |         } | ||||||
|         SECTION( "re-enter after failed section and find next section", "" ) { |         SECTION( "re-enter after failed section and find next section", "" ) { | ||||||
|             ctx.startCycle(); |             ctx.startCycle(); | ||||||
|             ITracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" ); |             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|             REQUIRE( testCase2.isOpen() ); |             REQUIRE( testCase2.isOpen() ); | ||||||
|  |  | ||||||
|             ITracker& s1b = SectionTracker::acquire( ctx, "S1" ); |             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|             REQUIRE( s1b.isOpen() == false ); |             REQUIRE( s1b.isOpen() == false ); | ||||||
|  |  | ||||||
|             ITracker& s2 = SectionTracker::acquire( ctx, "S2" ); |             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|             REQUIRE( s2.isOpen() ); |             REQUIRE( s2.isOpen() ); | ||||||
|  |  | ||||||
|             s2.close(); |             s2.close(); | ||||||
| @@ -104,7 +109,7 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|     SECTION( "successfully close one section, then find another", "" ) { |     SECTION( "successfully close one section, then find another", "" ) { | ||||||
|         s1.close(); |         s1.close(); | ||||||
|  |  | ||||||
|         ITracker& s2 = SectionTracker::acquire( ctx, "S2" ); |         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|         REQUIRE( s2.isOpen() == false ); |         REQUIRE( s2.isOpen() == false ); | ||||||
|  |  | ||||||
|         testCase.close(); |         testCase.close(); | ||||||
| @@ -112,13 +117,13 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|         SECTION( "Re-enter - skips S1 and enters S2", "" ) { |         SECTION( "Re-enter - skips S1 and enters S2", "" ) { | ||||||
|             ctx.startCycle(); |             ctx.startCycle(); | ||||||
|             ITracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" ); |             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|             REQUIRE( testCase2.isOpen() ); |             REQUIRE( testCase2.isOpen() ); | ||||||
|  |  | ||||||
|             ITracker& s1b = SectionTracker::acquire( ctx, "S1" ); |             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|             REQUIRE( s1b.isOpen() == false ); |             REQUIRE( s1b.isOpen() == false ); | ||||||
|  |  | ||||||
|             ITracker& s2b = SectionTracker::acquire( ctx, "S2" ); |             ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|             REQUIRE( s2b.isOpen() ); |             REQUIRE( s2b.isOpen() ); | ||||||
|  |  | ||||||
|             REQUIRE( ctx.completedCycle() == false ); |             REQUIRE( ctx.completedCycle() == false ); | ||||||
| @@ -145,13 +150,13 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|                 // Need a final cycle |                 // Need a final cycle | ||||||
|                 ctx.startCycle(); |                 ctx.startCycle(); | ||||||
|                 ITracker& testCase3 = SectionTracker::acquire( ctx, "Testcase" ); |                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|                 REQUIRE( testCase3.isOpen() ); |                 REQUIRE( testCase3.isOpen() ); | ||||||
|  |  | ||||||
|                 ITracker& s1c = SectionTracker::acquire( ctx, "S1" ); |                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|                 REQUIRE( s1c.isOpen() == false ); |                 REQUIRE( s1c.isOpen() == false ); | ||||||
|  |  | ||||||
|                 ITracker& s2c = SectionTracker::acquire( ctx, "S2" ); |                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|                 REQUIRE( s2c.isOpen() == false ); |                 REQUIRE( s2c.isOpen() == false ); | ||||||
|  |  | ||||||
|                 testCase3.close(); |                 testCase3.close(); | ||||||
| @@ -161,7 +166,7 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     SECTION( "open a nested section", "" ) { |     SECTION( "open a nested section", "" ) { | ||||||
|         ITracker& s2 = SectionTracker::acquire( ctx, "S2" ); |         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|         REQUIRE( s2.isOpen() ); |         REQUIRE( s2.isOpen() ); | ||||||
|  |  | ||||||
|         s2.close(); |         s2.close(); | ||||||
| @@ -177,7 +182,7 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     SECTION( "start a generator", "" ) { |     SECTION( "start a generator", "" ) { | ||||||
|         IndexTracker& g1 = IndexTracker::acquire( ctx, "G1", 2 ); |         IndexTracker& g1 = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||||
|         REQUIRE( g1.isOpen() ); |         REQUIRE( g1.isOpen() ); | ||||||
|         REQUIRE( g1.index() == 0 ); |         REQUIRE( g1.index() == 0 ); | ||||||
|  |  | ||||||
| @@ -193,14 +198,14 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|             SECTION( "Re-enter for second generation", "" ) { |             SECTION( "Re-enter for second generation", "" ) { | ||||||
|                 ctx.startCycle(); |                 ctx.startCycle(); | ||||||
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" ); |                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|                 REQUIRE( testCase2.isOpen() ); |                 REQUIRE( testCase2.isOpen() ); | ||||||
|  |  | ||||||
|                 ITracker& s1b = SectionTracker::acquire( ctx, "S1" ); |                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|                 REQUIRE( s1b.isOpen() ); |                 REQUIRE( s1b.isOpen() ); | ||||||
|  |  | ||||||
|  |  | ||||||
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, "G1", 2 ); |                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||||
|                 REQUIRE( g1b.isOpen() ); |                 REQUIRE( g1b.isOpen() ); | ||||||
|                 REQUIRE( g1b.index() == 1 ); |                 REQUIRE( g1b.index() == 1 ); | ||||||
|  |  | ||||||
| @@ -214,7 +219,7 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         SECTION( "Start a new inner section", "" ) { |         SECTION( "Start a new inner section", "" ) { | ||||||
|             ITracker& s2 = SectionTracker::acquire( ctx, "S2" ); |             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|             REQUIRE( s2.isOpen() ); |             REQUIRE( s2.isOpen() ); | ||||||
|  |  | ||||||
|             s2.close(); |             s2.close(); | ||||||
| @@ -228,19 +233,19 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|             SECTION( "Re-enter for second generation", "" ) { |             SECTION( "Re-enter for second generation", "" ) { | ||||||
|                 ctx.startCycle(); |                 ctx.startCycle(); | ||||||
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" ); |                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|                 REQUIRE( testCase2.isOpen() ); |                 REQUIRE( testCase2.isOpen() ); | ||||||
|  |  | ||||||
|                 ITracker& s1b = SectionTracker::acquire( ctx, "S1" ); |                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|                 REQUIRE( s1b.isOpen() ); |                 REQUIRE( s1b.isOpen() ); | ||||||
|  |  | ||||||
|                 // generator - next value |                 // generator - next value | ||||||
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, "G1", 2 ); |                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||||
|                 REQUIRE( g1b.isOpen() ); |                 REQUIRE( g1b.isOpen() ); | ||||||
|                 REQUIRE( g1b.index() == 1 ); |                 REQUIRE( g1b.index() == 1 ); | ||||||
|  |  | ||||||
|                 // inner section again |                 // inner section again | ||||||
|                 ITracker& s2b = SectionTracker::acquire( ctx, "S2" ); |                 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|                 REQUIRE( s2b.isOpen() ); |                 REQUIRE( s2b.isOpen() ); | ||||||
|  |  | ||||||
|                 s2b.close(); |                 s2b.close(); | ||||||
| @@ -256,7 +261,7 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         SECTION( "Fail an inner section", "" ) { |         SECTION( "Fail an inner section", "" ) { | ||||||
|             ITracker& s2 = SectionTracker::acquire( ctx, "S2" ); |             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|             REQUIRE( s2.isOpen() ); |             REQUIRE( s2.isOpen() ); | ||||||
|  |  | ||||||
|             s2.fail(); |             s2.fail(); | ||||||
| @@ -271,19 +276,19 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|             SECTION( "Re-enter for second generation", "" ) { |             SECTION( "Re-enter for second generation", "" ) { | ||||||
|                 ctx.startCycle(); |                 ctx.startCycle(); | ||||||
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" ); |                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|                 REQUIRE( testCase2.isOpen() ); |                 REQUIRE( testCase2.isOpen() ); | ||||||
|  |  | ||||||
|                 ITracker& s1b = SectionTracker::acquire( ctx, "S1" ); |                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|                 REQUIRE( s1b.isOpen() ); |                 REQUIRE( s1b.isOpen() ); | ||||||
|  |  | ||||||
|                 // generator - still same value |                 // generator - still same value | ||||||
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, "G1", 2 ); |                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||||
|                 REQUIRE( g1b.isOpen() ); |                 REQUIRE( g1b.isOpen() ); | ||||||
|                 REQUIRE( g1b.index() == 0 ); |                 REQUIRE( g1b.index() == 0 ); | ||||||
|  |  | ||||||
|                 // inner section again - this time won't open |                 // inner section again - this time won't open | ||||||
|                 ITracker& s2b = SectionTracker::acquire( ctx, "S2" ); |                 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|                 REQUIRE( s2b.isOpen() == false ); |                 REQUIRE( s2b.isOpen() == false ); | ||||||
|  |  | ||||||
|                 s1b.close(); |                 s1b.close(); | ||||||
| @@ -295,19 +300,19 @@ TEST_CASE( "Tracker", "" ) { | |||||||
|  |  | ||||||
|                 // Another cycle - now should complete |                 // Another cycle - now should complete | ||||||
|                 ctx.startCycle(); |                 ctx.startCycle(); | ||||||
|                 ITracker& testCase3 = SectionTracker::acquire( ctx, "Testcase" ); |                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||||
|                 REQUIRE( testCase3.isOpen() ); |                 REQUIRE( testCase3.isOpen() ); | ||||||
|  |  | ||||||
|                 ITracker& s1c = SectionTracker::acquire( ctx, "S1" ); |                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||||
|                 REQUIRE( s1c.isOpen() ); |                 REQUIRE( s1c.isOpen() ); | ||||||
|  |  | ||||||
|                 // generator - now next value |                 // generator - now next value | ||||||
|                 IndexTracker& g1c = IndexTracker::acquire( ctx, "G1", 2 ); |                 IndexTracker& g1c = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||||
|                 REQUIRE( g1c.isOpen() ); |                 REQUIRE( g1c.isOpen() ); | ||||||
|                 REQUIRE( g1c.index() == 1 ); |                 REQUIRE( g1c.index() == 1 ); | ||||||
|  |  | ||||||
|                 // inner section - now should open again |                 // inner section - now should open again | ||||||
|                 ITracker& s2c = SectionTracker::acquire( ctx, "S2" ); |                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||||
|                 REQUIRE( s2c.isOpen() ); |                 REQUIRE( s2c.isOpen() ); | ||||||
|  |  | ||||||
|                 s2c.close(); |                 s2c.close(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash