diff --git a/src/catch2/internal/catch_test_case_tracker.cpp b/src/catch2/internal/catch_test_case_tracker.cpp index 864cf11b0d..4050a8cea3 100644 --- a/src/catch2/internal/catch_test_case_tracker.cpp +++ b/src/catch2/internal/catch_test_case_tracker.cpp @@ -242,6 +242,11 @@ namespace TestCaseTracking { currentTracker.addChild( CATCH_MOVE( newTracker ) ); } + if ( ctx.completedCycle() && tracker->isOpen() ) { + CATCH_INTERNAL_ERROR( + "The same SECTION was encountered multiple times in one test cycle" ); + } + if ( !ctx.completedCycle() ) { tracker->tryOpen(); } diff --git a/tests/SelfTest/IntrospectiveTests/PartTracker.tests.cpp b/tests/SelfTest/IntrospectiveTests/PartTracker.tests.cpp index 09c765aa3c..48d55326c9 100644 --- a/tests/SelfTest/IntrospectiveTests/PartTracker.tests.cpp +++ b/tests/SelfTest/IntrospectiveTests/PartTracker.tests.cpp @@ -164,6 +164,28 @@ TEST_CASE( "Tracker" ) { } } +TEST_CASE( "Tracker rejects a section encountered twice in one cycle" ) { + TrackerContext ctx; + ITracker& root = ctx.startRun(); + std::vector dummyFilters; + root.setFilters( &dummyFilters, false ); + ctx.startCycle(); + + ITracker& testCase = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); + ITracker& section = SectionTracker::acquire( ctx, makeNAL( "Section" ) ); + ITracker& firstChild = SectionTracker::acquire( ctx, makeNAL( "First child" ) ); + + firstChild.close(); + SectionTracker::acquire( ctx, makeNAL( "Second child" ) ); + section.close(); + + REQUIRE( ctx.completedCycle() ); + REQUIRE( section.isOpen() ); + REQUIRE_THROWS( SectionTracker::acquire( ctx, makeNAL( "Section" ) ) ); + + testCase.close(); +} + static bool previouslyRun = false; static bool previouslyRunNested = false;