diff --git a/src/catch2/internal/catch_test_case_tracker.cpp b/src/catch2/internal/catch_test_case_tracker.cpp index 188d3ae1..098547fb 100644 --- a/src/catch2/internal/catch_test_case_tracker.cpp +++ b/src/catch2/internal/catch_test_case_tracker.cpp @@ -31,6 +31,23 @@ namespace TestCaseTracking { ITracker::~ITracker() = default; + void ITracker::addChild( ITrackerPtr const& child ) { + m_children.push_back( child ); + } + + ITrackerPtr ITracker::findChild( NameAndLocation const& nameAndLocation ) { + auto it = std::find_if( + m_children.begin(), + m_children.end(), + [&nameAndLocation]( ITrackerPtr const& tracker ) { + return tracker->nameAndLocation().location == + nameAndLocation.location && + tracker->nameAndLocation().name == nameAndLocation.name; + } ); + return ( it != m_children.end() ) ? *it : nullptr; + } + + ITracker& TrackerContext::startRun() { m_rootTracker = std::make_shared( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr ); @@ -79,26 +96,7 @@ namespace TestCaseTracking { bool TrackerBase::isOpen() const { return m_runState != NotStarted && !isComplete(); } - bool TrackerBase::hasChildren() const { - return !m_children.empty(); - } - - void TrackerBase::addChild( ITrackerPtr const& child ) { - m_children.push_back( child ); - } - - ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) { - auto it = std::find_if( m_children.begin(), m_children.end(), - [&nameAndLocation]( ITrackerPtr const& tracker ){ - return - tracker->nameAndLocation().location == nameAndLocation.location && - tracker->nameAndLocation().name == nameAndLocation.name; - } ); - return( it != m_children.end() ) - ? *it - : nullptr; - } ITracker& TrackerBase::parent() { assert( m_parent ); // Should always be non-null except for root return *m_parent; diff --git a/src/catch2/internal/catch_test_case_tracker.hpp b/src/catch2/internal/catch_test_case_tracker.hpp index 5d78009e..cfcb2309 100644 --- a/src/catch2/internal/catch_test_case_tracker.hpp +++ b/src/catch2/internal/catch_test_case_tracker.hpp @@ -36,6 +36,11 @@ namespace TestCaseTracking { class ITracker { NameAndLocation m_nameAndLocation; + using Children = std::vector; + + protected: + Children m_children; + public: ITracker(NameAndLocation const& nameAndLoc) : m_nameAndLocation(nameAndLoc) @@ -54,7 +59,6 @@ namespace TestCaseTracking { virtual bool isComplete() const = 0; // Successfully completed or failed virtual bool isSuccessfullyCompleted() const = 0; virtual bool isOpen() const = 0; // Started but not complete - virtual bool hasChildren() const = 0; virtual bool hasStarted() const = 0; virtual ITracker& parent() = 0; @@ -64,8 +68,20 @@ namespace TestCaseTracking { virtual void fail() = 0; virtual void markAsNeedingAnotherRun() = 0; - virtual void addChild( ITrackerPtr const& child ) = 0; - virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0; + //! Register a nested ITracker + void addChild( ITrackerPtr const& child ); + /** + * Returns ptr to specific child if register with this tracker. + * + * Returns nullptr if not found. + */ + ITrackerPtr findChild( NameAndLocation const& nameAndLocation ); + //! Have any children been added? + bool hasChildren() const { + return !m_children.empty(); + } + + virtual void openChild() = 0; // Debug/ checking @@ -109,10 +125,8 @@ namespace TestCaseTracking { Failed }; - using Children = std::vector; TrackerContext& m_ctx; ITracker* m_parent; - Children m_children; CycleState m_runState = NotStarted; public: @@ -121,14 +135,10 @@ namespace TestCaseTracking { bool isComplete() const override; bool isSuccessfullyCompleted() const override; bool isOpen() const override; - bool hasChildren() const override; bool hasStarted() const override { return m_runState != NotStarted; } - void addChild( ITrackerPtr const& child ) override; - - ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override; ITracker& parent() override; void openChild() override;