Skip to content

Commit

Permalink
Check can run step while reducing steps
Browse files Browse the repository at this point in the history
  • Loading branch information
tienvx committed Apr 24, 2022
1 parent dc81000 commit f4520c8
Show file tree
Hide file tree
Showing 19 changed files with 311 additions and 67 deletions.
8 changes: 4 additions & 4 deletions src/Reducer/HandlerTemplate.php
Expand Up @@ -8,21 +8,21 @@
use Tienvx\Bundle\MbtBundle\Model\BugInterface;
use Tienvx\Bundle\MbtBundle\Repository\BugRepositoryInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Builder\StepsBuilderInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\BugStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\ReduceStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\StepHelperInterface;

abstract class HandlerTemplate implements HandlerInterface
{
protected BugRepositoryInterface $bugRepository;
protected MessageBusInterface $messageBus;
protected BugStepsRunner $stepsRunner;
protected ReduceStepsRunner $stepsRunner;
protected StepsBuilderInterface $stepsBuilder;
protected StepHelperInterface $stepHelper;

public function __construct(
BugRepositoryInterface $bugRepository,
MessageBusInterface $messageBus,
BugStepsRunner $stepsRunner,
ReduceStepsRunner $stepsRunner,
StepsBuilderInterface $stepsBuilder,
StepHelperInterface $stepHelper
) {
Expand All @@ -42,7 +42,7 @@ public function handle(BugInterface $bug, int $from, int $to): void

$bug->setDebug(false);
$this->stepsRunner->run(
$this->stepHelper->cloneStepsAndResetColor($newSteps),
$this->stepHelper->cloneAndResetSteps($newSteps, $bug->getTask()->getModelRevision()),
$bug,
function (Throwable $throwable) use ($bug, $newSteps): void {
if ($throwable->getMessage() === $bug->getMessage()) {
Expand Down
28 changes: 20 additions & 8 deletions src/Resources/config/services.php
Expand Up @@ -64,10 +64,11 @@
use Tienvx\Bundle\MbtBundle\Service\SelenoidHelperInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Builder\ShortestPathStepsBuilder;
use Tienvx\Bundle\MbtBundle\Service\Step\Builder\StepsBuilderInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\BugStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\ExploreStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\RecordStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\ReduceStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\StepRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\StepRunnerInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\TaskStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\StepHelper;
use Tienvx\Bundle\MbtBundle\Service\Step\StepHelperInterface;
use Tienvx\Bundle\MbtBundle\Service\Task\TaskHelper;
Expand Down Expand Up @@ -136,7 +137,7 @@
->args([
service(BugRepositoryInterface::class),
service(MessageBusInterface::class),
service(BugStepsRunner::class),
service(ReduceStepsRunner::class),
service(StepsBuilderInterface::class),
service(StepHelperInterface::class),
])
Expand All @@ -154,7 +155,7 @@
->args([
service(BugRepositoryInterface::class),
service(MessageBusInterface::class),
service(BugStepsRunner::class),
service(ReduceStepsRunner::class),
service(StepsBuilderInterface::class),
service(StepHelperInterface::class),
])
Expand Down Expand Up @@ -235,7 +236,7 @@
service(MessageBusInterface::class),
service(BugNotifierInterface::class),
service(StepHelperInterface::class),
service(BugStepsRunner::class),
service(RecordStepsRunner::class),
service(ConfigInterface::class),
])
->alias(BugHelperInterface::class, BugHelper::class)
Expand All @@ -244,7 +245,7 @@
->args([
service(GeneratorManagerInterface::class),
service(TaskRepositoryInterface::class),
service(TaskStepsRunner::class),
service(ExploreStepsRunner::class),
service(ConfigInterface::class),
])
->alias(TaskHelperInterface::class, TaskHelper::class)
Expand All @@ -264,6 +265,9 @@
->alias(PetrinetDomainLogicInterface::class, PetrinetDomainLogic::class)

->set(StepHelper::class)
->args([
service(ModelHelperInterface::class),
])
->alias(StepHelperInterface::class, StepHelper::class)

->set(StepRunner::class)
Expand All @@ -272,13 +276,21 @@
])
->alias(StepRunnerInterface::class, StepRunner::class)

->set(TaskStepsRunner::class)
->set(ExploreStepsRunner::class)
->args([
service(SelenoidHelperInterface::class),
service(StepRunnerInterface::class),
service(ConfigInterface::class),
])
->set(BugStepsRunner::class)
->set(ReduceStepsRunner::class)
->args([
service(SelenoidHelperInterface::class),
service(StepRunnerInterface::class),
service(PetrinetHelperInterface::class),
service(MarkingHelperInterface::class),
service(GuardedTransitionServiceInterface::class),
])
->set(RecordStepsRunner::class)
->args([
service(SelenoidHelperInterface::class),
service(StepRunnerInterface::class),
Expand Down
8 changes: 4 additions & 4 deletions src/Service/Bug/BugHelper.php
Expand Up @@ -13,7 +13,7 @@
use Tienvx\Bundle\MbtBundle\Reducer\ReducerManagerInterface;
use Tienvx\Bundle\MbtBundle\Repository\BugRepositoryInterface;
use Tienvx\Bundle\MbtBundle\Service\ConfigInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\BugStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\RecordStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\StepHelperInterface;

class BugHelper implements BugHelperInterface
Expand All @@ -23,7 +23,7 @@ class BugHelper implements BugHelperInterface
protected MessageBusInterface $messageBus;
protected BugNotifierInterface $bugNotifier;
protected StepHelperInterface $stepHelper;
protected BugStepsRunner $stepsRunner;
protected RecordStepsRunner $stepsRunner;
protected ConfigInterface $config;

public function __construct(
Expand All @@ -32,7 +32,7 @@ public function __construct(
MessageBusInterface $messageBus,
BugNotifierInterface $bugNotifier,
StepHelperInterface $stepHelper,
BugStepsRunner $stepsRunner,
RecordStepsRunner $stepsRunner,
ConfigInterface $config
) {
$this->reducerManager = $reducerManager;
Expand Down Expand Up @@ -100,7 +100,7 @@ public function recordVideo(int $bugId): void
$this->bugRepository->startRecording($bug);
$bug->setDebug(true);
$this->stepsRunner->run(
$this->stepHelper->cloneStepsAndResetColor($bug->getSteps()),
$this->stepHelper->cloneAndResetSteps($bug->getSteps(), $bug->getTask()->getModelRevision()),
$bug,
function (Throwable $throwable) use ($bug) {
$bug->getVideo()->setErrorMessage(
Expand Down
2 changes: 1 addition & 1 deletion src/Service/Step/Runner/BugStepsRunner.php
Expand Up @@ -5,7 +5,7 @@
use Throwable;
use Tienvx\Bundle\MbtBundle\Model\Bug\StepInterface;

class BugStepsRunner extends StepsRunner
abstract class BugStepsRunner extends StepsRunner
{
protected function catchException(callable $handleException, Throwable $throwable, ?StepInterface $step): void
{
Expand Down
Expand Up @@ -8,10 +8,11 @@
use Tienvx\Bundle\MbtBundle\Model\Bug\StepInterface;
use Tienvx\Bundle\MbtBundle\Model\BugInterface;
use Tienvx\Bundle\MbtBundle\Model\DebugInterface;
use Tienvx\Bundle\MbtBundle\Model\Model\RevisionInterface;
use Tienvx\Bundle\MbtBundle\Service\ConfigInterface;
use Tienvx\Bundle\MbtBundle\Service\SelenoidHelperInterface;

class TaskStepsRunner extends StepsRunner
class ExploreStepsRunner extends StepsRunner
{
protected array $steps;
protected ConfigInterface $config;
Expand Down Expand Up @@ -47,11 +48,12 @@ protected function stop(?RemoteWebDriver $driver): void
$this->steps = [];
}

protected function canStop(StepInterface $step): bool
protected function runStep(StepInterface $step, RevisionInterface $revision, RemoteWebDriver $driver): bool
{
parent::runStep($step, $revision, $driver);
$this->steps[] = clone $step;

return count($this->steps) >= $this->config->getMaxSteps();
return count($this->steps) < $this->config->getMaxSteps();
}

protected function createBug(array $steps, string $message): BugInterface
Expand Down
7 changes: 7 additions & 0 deletions src/Service/Step/Runner/RecordStepsRunner.php
@@ -0,0 +1,7 @@
<?php

namespace Tienvx\Bundle\MbtBundle\Service\Step\Runner;

class RecordStepsRunner extends BugStepsRunner
{
}
58 changes: 58 additions & 0 deletions src/Service/Step/Runner/ReduceStepsRunner.php
@@ -0,0 +1,58 @@
<?php

namespace Tienvx\Bundle\MbtBundle\Service\Step\Runner;

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Petrinet\Model\PetrinetInterface;
use SingleColorPetrinet\Service\GuardedTransitionServiceInterface;
use Tienvx\Bundle\MbtBundle\Model\Bug\StepInterface;
use Tienvx\Bundle\MbtBundle\Model\DebugInterface;
use Tienvx\Bundle\MbtBundle\Model\Model\RevisionInterface;
use Tienvx\Bundle\MbtBundle\Service\Petrinet\MarkingHelperInterface;
use Tienvx\Bundle\MbtBundle\Service\Petrinet\PetrinetHelperInterface;
use Tienvx\Bundle\MbtBundle\Service\SelenoidHelperInterface;

class ReduceStepsRunner extends BugStepsRunner
{
protected ?PetrinetInterface $petrinet = null;
protected PetrinetHelperInterface $petrinetHelper;
protected MarkingHelperInterface $markingHelper;
protected GuardedTransitionServiceInterface $transitionService;

public function __construct(
SelenoidHelperInterface $selenoidHelper,
StepRunnerInterface $stepRunner,
PetrinetHelperInterface $petrinetHelper,
MarkingHelperInterface $markingHelper,
GuardedTransitionServiceInterface $transitionService
) {
parent::__construct($selenoidHelper, $stepRunner);
$this->petrinetHelper = $petrinetHelper;
$this->markingHelper = $markingHelper;
$this->transitionService = $transitionService;
}

protected function start(DebugInterface $entity): RemoteWebDriver
{
$this->petrinet = $this->petrinetHelper->build($entity->getTask()->getModelRevision());

return parent::start($entity);
}

protected function stop(?RemoteWebDriver $driver): void
{
parent::stop($driver);
$this->petrinet = null;
}

protected function runStep(StepInterface $step, RevisionInterface $revision, RemoteWebDriver $driver): bool
{
$marking = $this->markingHelper->getMarking($this->petrinet, $step->getPlaces(), $step->getColor());
$transition = $this->petrinet->getTransitions()[$step->getTransition()];
if ($this->transitionService->isEnabled($transition, $marking)) {
return parent::runStep($step, $revision, $driver);
}

return false;
}
}
10 changes: 3 additions & 7 deletions src/Service/Step/Runner/StepsRunner.php
Expand Up @@ -33,8 +33,7 @@ public function run(iterable $steps, DebugInterface $entity, callable $handleExc
if (!$step instanceof StepInterface) {
throw new UnexpectedValueException(sprintf('Step must be instance of "%s".', StepInterface::class));
}
$this->runStep($step, $entity->getTask()->getModelRevision(), $driver);
if ($this->canStop($step)) {
if (!$this->runStep($step, $entity->getTask()->getModelRevision(), $driver)) {
break;
}
}
Expand All @@ -52,14 +51,11 @@ protected function start(DebugInterface $entity): RemoteWebDriver
return $this->selenoidHelper->createDriver($entity);
}

protected function runStep(StepInterface $step, RevisionInterface $revision, RemoteWebDriver $driver): void
protected function runStep(StepInterface $step, RevisionInterface $revision, RemoteWebDriver $driver): bool
{
$this->stepRunner->run($step, $revision, $driver);
}

protected function canStop(StepInterface $step): bool
{
return false;
return true;
}

abstract protected function catchException(
Expand Down
18 changes: 15 additions & 3 deletions src/Service/Step/StepHelper.php
Expand Up @@ -5,21 +5,33 @@
use SingleColorPetrinet\Model\Color;
use Tienvx\Bundle\MbtBundle\Exception\UnexpectedValueException;
use Tienvx\Bundle\MbtBundle\Model\Bug\StepInterface;
use Tienvx\Bundle\MbtBundle\Model\Model\RevisionInterface;
use Tienvx\Bundle\MbtBundle\Service\Model\ModelHelperInterface;

class StepHelper implements StepHelperInterface
{
public function cloneStepsAndResetColor(array $steps): array
protected ModelHelperInterface $modelHelper;

public function __construct(ModelHelperInterface $modelHelper)
{
$this->modelHelper = $modelHelper;
}

public function cloneAndResetSteps(array $steps, RevisionInterface $revision): array
{
$lastColor = null;
$lastColor = new Color();
$lastPlaces = $this->modelHelper->getStartPlaceIds($revision);
$newSteps = [];
foreach ($steps as $step) {
if (!$step instanceof StepInterface) {
throw new UnexpectedValueException(sprintf('Step must be instance of "%s".', StepInterface::class));
}
$newStep = clone $step;
$newStep->setColor($lastColor ?? new Color());
$newStep->setColor($lastColor);
$newStep->setPlaces($lastPlaces);
$newSteps[] = $newStep;
$lastColor = clone $step->getColor();
$lastPlaces = $step->getPlaces();
}

return $newSteps;
Expand Down
4 changes: 3 additions & 1 deletion src/Service/Step/StepHelperInterface.php
Expand Up @@ -2,7 +2,9 @@

namespace Tienvx\Bundle\MbtBundle\Service\Step;

use Tienvx\Bundle\MbtBundle\Model\Model\RevisionInterface;

interface StepHelperInterface
{
public function cloneStepsAndResetColor(array $steps): array;
public function cloneAndResetSteps(array $steps, RevisionInterface $revision): array;
}
6 changes: 3 additions & 3 deletions src/Service/Task/TaskHelper.php
Expand Up @@ -9,19 +9,19 @@
use Tienvx\Bundle\MbtBundle\Model\TaskInterface;
use Tienvx\Bundle\MbtBundle\Repository\TaskRepositoryInterface;
use Tienvx\Bundle\MbtBundle\Service\ConfigInterface;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\TaskStepsRunner;
use Tienvx\Bundle\MbtBundle\Service\Step\Runner\ExploreStepsRunner;

class TaskHelper implements TaskHelperInterface
{
protected GeneratorManagerInterface $generatorManager;
protected TaskRepositoryInterface $taskRepository;
protected TaskStepsRunner $stepsRunner;
protected ExploreStepsRunner $stepsRunner;
protected ConfigInterface $config;

public function __construct(
GeneratorManagerInterface $generatorManager,
TaskRepositoryInterface $taskRepository,
TaskStepsRunner $stepsRunner,
ExploreStepsRunner $stepsRunner,
ConfigInterface $config
) {
$this->generatorManager = $generatorManager;
Expand Down

0 comments on commit f4520c8

Please sign in to comment.