Skip to content

Commit

Permalink
Merge pull request #281 from tienvx/generator-options
Browse files Browse the repository at this point in the history
Generator options
  • Loading branch information
tienvx committed Jun 16, 2019
2 parents bc918fd + 94a7251 commit cdd772e
Show file tree
Hide file tree
Showing 23 changed files with 282 additions and 45 deletions.
2 changes: 1 addition & 1 deletion src/Command/ExecuteTaskCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
$path->add(null, null, $workflow->getDefinition()->getInitialPlaces());

try {
foreach ($generator->getAvailableTransitions($workflow, $subject, $task->getMetaData()) as $transitionName) {
foreach ($generator->getAvailableTransitions($workflow, $subject, $task->getGeneratorOptions()) as $transitionName) {
try {
if (!$generator->applyTransition($workflow, $subject, $transitionName)) {
throw new Exception(sprintf("Generator '%s' generated transition '%s' that can not be applied", $task->getGenerator()->getName(), $transitionName));
Expand Down
7 changes: 4 additions & 3 deletions src/Command/TestModelCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Workflow\Registry;
use Tienvx\Bundle\MbtBundle\Entity\GeneratorOptions;
use Tienvx\Bundle\MbtBundle\Generator\GeneratorManager;
use Tienvx\Bundle\MbtBundle\Graph\Path;
use Tienvx\Bundle\MbtBundle\Subject\SubjectManager;
Expand Down Expand Up @@ -47,7 +48,7 @@ protected function configure()
->setHelp('Generate path for model.')
->addArgument('model', InputArgument::REQUIRED, 'The model to test.')
->addOption('generator', 'g', InputOption::VALUE_OPTIONAL, 'The generator to generate path from the model.', 'random')
->addOption('meta-data', 'm', InputOption::VALUE_OPTIONAL, 'The meta data for the generator.');
->addOption('generator-options', 'o', InputOption::VALUE_OPTIONAL, 'The options for the generator.');
}

public function setWorkflowRegistry(Registry $workflowRegistry)
Expand All @@ -71,7 +72,7 @@ protected function execute(InputInterface $input, OutputInterface $output)

$model = $input->getArgument('model');
$generatorName = $input->getOption('generator');
$metaData = $input->getOption('meta-data');
$generatorOptions = $input->getOption('generator-options');
$generator = $this->generatorManager->getGenerator($generatorName);
$subject = $this->subjectManager->createSubject($model);
$subject->setTestingModel(true);
Expand All @@ -82,7 +83,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
$path->add(null, null, $workflow->getDefinition()->getInitialPlaces());

try {
foreach ($generator->getAvailableTransitions($workflow, $subject, $metaData) as $transitionName) {
foreach ($generator->getAvailableTransitions($workflow, $subject, GeneratorOptions::denormalize($generatorOptions)) as $transitionName) {
try {
if (!$generator->applyTransition($workflow, $subject, $transitionName)) {
throw new Exception(sprintf("Generator '%s' generated transition '%s' that can not be applied", $generatorName, $transitionName));
Expand Down
7 changes: 4 additions & 3 deletions src/Command/TestSubjectCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Workflow\Registry;
use Throwable;
use Tienvx\Bundle\MbtBundle\Entity\GeneratorOptions;
use Tienvx\Bundle\MbtBundle\Generator\GeneratorManager;
use Tienvx\Bundle\MbtBundle\Subject\SubjectManager;

Expand Down Expand Up @@ -47,7 +48,7 @@ protected function configure()
->setHelp('Call system under test to test model.')
->addArgument('model', InputArgument::REQUIRED, 'The model to test.')
->addOption('generator', 'g', InputOption::VALUE_OPTIONAL, 'The generator to generate path from the model.', 'random')
->addOption('meta-data', 'm', InputOption::VALUE_OPTIONAL, 'The meta data for the generator.');
->addOption('generator-options', 'o', InputOption::VALUE_OPTIONAL, 'The options for the generator.');
}

public function setWorkflowRegistry(Registry $workflowRegistry)
Expand All @@ -71,15 +72,15 @@ protected function execute(InputInterface $input, OutputInterface $output)

$model = $input->getArgument('model');
$generatorName = $input->getOption('generator');
$metaData = $input->getOption('meta-data');
$generatorOptions = $input->getOption('generator-options');
$generator = $this->generatorManager->getGenerator($generatorName);
$subject = $this->subjectManager->createSubject($model);
$subject->setTestingSubject(true);
$subject->setUp();
$workflow = $this->workflowRegistry->get($subject, $model);

try {
foreach ($generator->getAvailableTransitions($workflow, $subject, $metaData) as $transitionName) {
foreach ($generator->getAvailableTransitions($workflow, $subject, GeneratorOptions::denormalize($generatorOptions)) as $transitionName) {
if (!$generator->applyTransition($workflow, $subject, $transitionName)) {
throw new Exception(sprintf("Generator '%s' generated transition '%s' that can not be applied", $generatorName, $transitionName));
}
Expand Down
6 changes: 3 additions & 3 deletions src/Entity/Generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ public function __construct(string $name)
}

/**
* @return mixed
* @return string
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
* @param string $name
*/
public function setName($name): void
public function setName(string $name): void
{
$this->name = $name;
}
Expand Down
163 changes: 163 additions & 0 deletions src/Entity/GeneratorOptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
<?php

namespace Tienvx\Bundle\MbtBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Tienvx\Bundle\MbtBundle\Validator\Constraints as MbtAssert;

class GeneratorOptions
{
/**
* @var int
* @Assert\Range(
* min = 0,
* max = 100
* )
*/
private $transitionCoverage;

/**
* @var int|null
* @Assert\Range(
* min = 0,
* max = 100
* )
*/
private $placeCoverage;

/**
* @var int|null
* @Assert\Positive
*/
private $maxPathLength;

/**
* @var int|null
* @MbtAssert\BugId
*/
private $bugId;

/**
* @return int|null
*/
public function getBugId(): ?int
{
return $this->bugId;
}

/**
* @param int|null $bugId
*/
public function setBugId(?int $bugId): void
{
$this->bugId = $bugId;
}

/**
* @return int|null
*/
public function getMaxPathLength(): ?int
{
return $this->maxPathLength;
}

/**
* @param int|null $maxPathLength
*/
public function setMaxPathLength(?int $maxPathLength): void
{
$this->maxPathLength = $maxPathLength;
}

/**
* @return int|null
*/
public function getPlaceCoverage(): ?int
{
return $this->placeCoverage;
}

/**
* @param int|null $placeCoverage
*/
public function setPlaceCoverage(?int $placeCoverage): void
{
$this->placeCoverage = $placeCoverage;
}

/**
* @return int|null
*/
public function getTransitionCoverage(): ?int
{
return $this->transitionCoverage;
}

/**
* @param int|null $transitionCoverage
*/
public function setTransitionCoverage(?int $transitionCoverage): void
{
$this->transitionCoverage = $transitionCoverage;
}

/**
* @param GeneratorOptions $generatorOptions
*
* @return array
*/
public static function normalize(GeneratorOptions $generatorOptions): array
{
$values = [
'transitionCoverage' => $generatorOptions->getTransitionCoverage(),
'placeCoverage' => $generatorOptions->getPlaceCoverage(),
'maxPathLength' => $generatorOptions->getMaxPathLength(),
'bugId' => $generatorOptions->getBugId(),
];

return $values;
}

/**
* @param GeneratorOptions $generatorOptions
*
* @return string
*/
public static function serialize(GeneratorOptions $generatorOptions): string
{
return json_encode(self::normalize($generatorOptions));
}

/**
* @param array $data
*
* @return GeneratorOptions
*/
public static function denormalize(?array $data): GeneratorOptions
{
if (!$data) {
return new GeneratorOptions();
}
$generatorOptions = new GeneratorOptions();
$generatorOptions->setTransitionCoverage($data['transitionCoverage'] ?? null);
$generatorOptions->setPlaceCoverage($data['placeCoverage'] ?? null);
$generatorOptions->setMaxPathLength($data['maxPathLength'] ?? null);
$generatorOptions->setBugId($data['bugId'] ?? null);

return $generatorOptions;
}

/**
* @param string $data
*
* @return GeneratorOptions
*/
public static function deserialize(?string $data): GeneratorOptions
{
if (!$data) {
return new GeneratorOptions();
}

return self::denormalize(json_decode($data, true));
}
}
6 changes: 3 additions & 3 deletions src/Entity/Model.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ public function __construct(string $name)
}

/**
* @return mixed
* @return string
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
* @param string $name
*/
public function setName($name): void
public function setName(string $name): void
{
$this->name = $name;
}
Expand Down
6 changes: 3 additions & 3 deletions src/Entity/Reducer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ public function __construct(string $name)
}

/**
* @return mixed
* @return string
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
* @param string $name
*/
public function setName($name): void
public function setName(string $name): void
{
$this->name = $name;
}
Expand Down
6 changes: 3 additions & 3 deletions src/Entity/Reporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ public function __construct(string $name)
}

/**
* @return mixed
* @return string
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
* @param string $name
*/
public function setName($name): void
public function setName(string $name): void
{
$this->name = $name;
}
Expand Down
10 changes: 5 additions & 5 deletions src/Entity/Task.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class Task
/**
* @ORM\Column(type="text", nullable=true)
*/
private $metaData;
private $generatorOptions;

/**
* @ORM\Column(type="string")
Expand Down Expand Up @@ -162,14 +162,14 @@ public function setGenerator(Generator $generator)
$this->generator = $generator->getName();
}

public function setMetaData(array $metaData)
public function setGeneratorOptions(?GeneratorOptions $generatorOptions)
{
$this->metaData = json_encode($metaData);
$this->generatorOptions = GeneratorOptions::serialize($generatorOptions);
}

public function getMetaData(): ?array
public function getGeneratorOptions(): GeneratorOptions
{
return json_decode($this->metaData, true);
return GeneratorOptions::deserialize($this->generatorOptions);
}

/**
Expand Down
3 changes: 2 additions & 1 deletion src/Generator/AllPlacesGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Psr\Cache\InvalidArgumentException;
use Symfony\Component\Workflow\StateMachine;
use Symfony\Component\Workflow\Workflow;
use Tienvx\Bundle\MbtBundle\Entity\GeneratorOptions;
use Tienvx\Bundle\MbtBundle\Service\GraphBuilder;
use Tienvx\Bundle\MbtBundle\Subject\AbstractSubject;

Expand All @@ -29,7 +30,7 @@ public function __construct(GraphBuilder $graphBuilder)
* @throws Exception
* @throws InvalidArgumentException
*/
public function getAvailableTransitions(Workflow $workflow, AbstractSubject $subject, array $metaData = null): Generator
public function getAvailableTransitions(Workflow $workflow, AbstractSubject $subject, GeneratorOptions $generatorOptions = null): Generator
{
if (!$workflow instanceof StateMachine) {
throw new Exception(sprintf('Generator %s only support model type state machine', static::getName()));
Expand Down
3 changes: 2 additions & 1 deletion src/Generator/AllTransitionsGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Symfony\Component\Workflow\StateMachine;
use Symfony\Component\Workflow\Workflow;
use Tienvx\Bundle\MbtBundle\Algorithm\Eulerian;
use Tienvx\Bundle\MbtBundle\Entity\GeneratorOptions;
use Tienvx\Bundle\MbtBundle\Helper\VertexHelper;
use Tienvx\Bundle\MbtBundle\Service\GraphBuilder;
use Tienvx\Bundle\MbtBundle\Subject\AbstractSubject;
Expand All @@ -31,7 +32,7 @@ public function __construct(GraphBuilder $graphBuilder)
* @throws Exception
* @throws InvalidArgumentException
*/
public function getAvailableTransitions(Workflow $workflow, AbstractSubject $subject, array $metaData = null): Generator
public function getAvailableTransitions(Workflow $workflow, AbstractSubject $subject, GeneratorOptions $generatorOptions = null): Generator
{
if (!$workflow instanceof StateMachine) {
throw new Exception(sprintf('Generator %s only support model type state machine', static::getName()));
Expand Down
Loading

0 comments on commit cdd772e

Please sign in to comment.