123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- * Created by Phil Nash on 23/7/2013
- * Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
- *
- * Distributed under the Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- */
- #ifndef TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
- #define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
- #include "catch_compiler_capabilities.h"
- #include "catch_common.h"
- #include <string>
- #include <vector>
- #include <memory>
- namespace Catch {
- namespace TestCaseTracking {
- struct NameAndLocation {
- std::string name;
- SourceLineInfo location;
- NameAndLocation( std::string const& _name, SourceLineInfo const& _location );
- friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) {
- return lhs.name == rhs.name
- && lhs.location == rhs.location;
- }
- };
- class ITracker;
- using ITrackerPtr = std::shared_ptr<ITracker>;
- class ITracker {
- NameAndLocation m_nameAndLocation;
- public:
- ITracker(NameAndLocation const& nameAndLoc) :
- m_nameAndLocation(nameAndLoc)
- {}
- // static queries
- NameAndLocation const& nameAndLocation() const {
- return m_nameAndLocation;
- }
- virtual ~ITracker();
- // dynamic queries
- 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;
- // actions
- virtual void close() = 0; // Successfully complete
- virtual void fail() = 0;
- virtual void markAsNeedingAnotherRun() = 0;
- virtual void addChild( ITrackerPtr const& child ) = 0;
- virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0;
- virtual void openChild() = 0;
- // Debug/ checking
- virtual bool isSectionTracker() const = 0;
- virtual bool isGeneratorTracker() const = 0;
- };
- class TrackerContext {
- enum RunState {
- NotStarted,
- Executing,
- CompletedCycle
- };
- ITrackerPtr m_rootTracker;
- ITracker* m_currentTracker = nullptr;
- RunState m_runState = NotStarted;
- public:
- ITracker& startRun();
- void endRun();
- void startCycle();
- void completeCycle();
- bool completedCycle() const;
- ITracker& currentTracker();
- void setCurrentTracker( ITracker* tracker );
- };
- class TrackerBase : public ITracker {
- protected:
- enum CycleState {
- NotStarted,
- Executing,
- ExecutingChildren,
- NeedsAnotherRun,
- CompletedSuccessfully,
- Failed
- };
- using Children = std::vector<ITrackerPtr>;
- TrackerContext& m_ctx;
- ITracker* m_parent;
- Children m_children;
- CycleState m_runState = NotStarted;
- public:
- TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
- 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;
- bool isSectionTracker() const override;
- bool isGeneratorTracker() const override;
- void open();
- void close() override;
- void fail() override;
- void markAsNeedingAnotherRun() override;
- private:
- void moveToParent();
- void moveToThis();
- };
- class SectionTracker : public TrackerBase {
- std::vector<std::string> m_filters;
- std::string m_trimmed_name;
- public:
- SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
- bool isSectionTracker() const override;
- bool isComplete() const override;
- static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation );
- void tryOpen();
- void addInitialFilters( std::vector<std::string> const& filters );
- void addNextFilters( std::vector<std::string> const& filters );
- //! Returns filters active in this tracker
- std::vector<std::string> const& getFilters() const;
- //! Returns whitespace-trimmed name of the tracked section
- std::string const& trimmedName() const;
- };
- } // namespace TestCaseTracking
- using TestCaseTracking::ITracker;
- using TestCaseTracking::TrackerContext;
- using TestCaseTracking::SectionTracker;
- } // namespace Catch
- #endif // TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
|