| 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 TestCaseTrackingusing TestCaseTracking::ITracker;using TestCaseTracking::TrackerContext;using TestCaseTracking::SectionTracker;} // namespace Catch#endif // TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
 |