| 12425 | |
| 12426 | namespace Generators { |
| 12427 | struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker { |
| 12428 | GeneratorBasePtr m_generator; |
| 12429 | |
| 12430 | GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) |
| 12431 | : TrackerBase( nameAndLocation, ctx, parent ) |
| 12432 | {} |
| 12433 | ~GeneratorTracker(); |
| 12434 | |
| 12435 | static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) { |
| 12436 | std::shared_ptr<GeneratorTracker> tracker; |
| 12437 | |
| 12438 | ITracker& currentTracker = ctx.currentTracker(); |
| 12439 | if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { |
| 12440 | assert( childTracker ); |
| 12441 | assert( childTracker->isGeneratorTracker() ); |
| 12442 | tracker = std::static_pointer_cast<GeneratorTracker>( childTracker ); |
| 12443 | } |
| 12444 | else { |
| 12445 | tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, ¤tTracker ); |
| 12446 | currentTracker.addChild( tracker ); |
| 12447 | } |
| 12448 | |
| 12449 | if( !ctx.completedCycle() && !tracker->isComplete() ) { |
| 12450 | tracker->open(); |
| 12451 | } |
| 12452 | |
| 12453 | return *tracker; |
| 12454 | } |
| 12455 | |
| 12456 | // TrackerBase interface |
| 12457 | bool isGeneratorTracker() const override { return true; } |
| 12458 | auto hasGenerator() const -> bool override { |
| 12459 | return !!m_generator; |
| 12460 | } |
| 12461 | void close() override { |
| 12462 | TrackerBase::close(); |
| 12463 | // Generator interface only finds out if it has another item on atual move |
| 12464 | if (m_runState == CompletedSuccessfully && m_generator->next()) { |
| 12465 | m_children.clear(); |
| 12466 | m_runState = Executing; |
| 12467 | } |
| 12468 | } |
| 12469 | |
| 12470 | // IGeneratorTracker interface |
| 12471 | auto getGenerator() const -> GeneratorBasePtr const& override { |
| 12472 | return m_generator; |
| 12473 | } |
| 12474 | void setGenerator( GeneratorBasePtr&& generator ) override { |
| 12475 | m_generator = std::move( generator ); |
| 12476 | } |
| 12477 | }; |
| 12478 | GeneratorTracker::~GeneratorTracker() {} |
| 12479 | } |
| 12480 |
nothing calls this directly
no test coverage detected