From d40e38d2570941dd3f92179abde16bf73b3c17b9 Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Sat, 12 Nov 2016 10:54:23 +0100 Subject: [PATCH] [Workflow] Fixed dumping StateMachine with GraphvizDumper --- .../Workflow/Dumper/GraphvizDumper.php | 26 +++---- .../Tests/Dumper/GraphvizDumperTest.php | 74 +++++++++++++++++++ 2 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/Symfony/Component/Workflow/Dumper/GraphvizDumper.php b/src/Symfony/Component/Workflow/Dumper/GraphvizDumper.php index 916c4bd460622..1afce3b9001a0 100644 --- a/src/Symfony/Component/Workflow/Dumper/GraphvizDumper.php +++ b/src/Symfony/Component/Workflow/Dumper/GraphvizDumper.php @@ -84,7 +84,7 @@ private function findTransitions(Definition $definition) $transitions = array(); foreach ($definition->getTransitions() as $transition) { - $transitions[] = array( + $transitions[$transition->getName()] = array( 'attributes' => array('shape' => 'box', 'regular' => true), 'name' => $transition->getName(), ); @@ -126,21 +126,20 @@ private function addTransitions(array $transitions) private function findEdges(Definition $definition) { $dotEdges = array(); + $getEdge = function ($from, $to, $direction) use (&$dotEdges) { + $dotEdges[$from.$to.$direction] = array( + 'from' => $from, + 'to' => $to, + 'direction' => $direction, + ); + }; foreach ($definition->getTransitions() as $transition) { foreach ($transition->getFroms() as $from) { - $dotEdges[] = array( - 'from' => $from, - 'to' => $transition->getName(), - 'direction' => 'from', - ); + $getEdge($from, $transition->getName(), 'from'); } foreach ($transition->getTos() as $to) { - $dotEdges[] = array( - 'from' => $transition->getName(), - 'to' => $to, - 'direction' => 'to', - ); + $getEdge($transition->getName(), $to, 'to'); } } @@ -152,10 +151,11 @@ private function addEdges($edges) $code = ''; foreach ($edges as $edge) { + $from = 'from' === $edge['direction']; $code .= sprintf(" %s_%s -> %s_%s [style=\"solid\"];\n", - 'from' === $edge['direction'] ? 'place' : 'transition', + $from ? 'place' : 'transition', $this->dotize($edge['from']), - 'from' === $edge['direction'] ? 'transition' : 'place', + $from ? 'transition' : 'place', $this->dotize($edge['to']) ); } diff --git a/src/Symfony/Component/Workflow/Tests/Dumper/GraphvizDumperTest.php b/src/Symfony/Component/Workflow/Tests/Dumper/GraphvizDumperTest.php index f24bb003a892a..0c3a704c85ec5 100644 --- a/src/Symfony/Component/Workflow/Tests/Dumper/GraphvizDumperTest.php +++ b/src/Symfony/Component/Workflow/Tests/Dumper/GraphvizDumperTest.php @@ -9,6 +9,9 @@ class GraphvizDumperTest extends \PHPUnit_Framework_TestCase { + /** + * @var GraphvizDumper + */ private $dumper; public function setUp() @@ -36,6 +39,16 @@ public function testWorkflowWithMarking($definition, $marking, $expected) $this->assertEquals($expected, $dump); } + /** + * @dataProvider provideStateMachineDefinition + */ + public function testStateMachine($definition, $expected) + { + $dump = $this->dumper->dump($definition); + + $this->assertEquals($expected, $dump); + } + public function provideWorkflowDefinitionWithMarking() { yield array( @@ -57,6 +70,11 @@ public function provideWorkflowDefinitionWithoutMarking() yield array($this->provideSimpleWorkflowDefinition(), $this->provideSimpleWorkflowDumpWithoutMarking()); } + public function provideStateMachineDefinition() + { + yield array($this->provideComplexStateMachineDefinition(), $this->provideComplexStateMachineDump()); + } + public function provideComplexWorkflowDefinition() { $builder = new DefinitionBuilder(); @@ -85,6 +103,25 @@ public function provideSimpleWorkflowDefinition() return $builder->build(); } + public function provideComplexStateMachineDefinition() + { + $builder = new DefinitionBuilder(); + + $builder->addPlaces(range('a', 'g')); + + $builder->addTransition(new Transition('t1', 'a', 'c')); + $builder->addTransition(new Transition('t1', 'b', 'c')); + $builder->addTransition(new Transition('t2', 'c', 'd')); + $builder->addTransition(new Transition('t2', 'e', 'd')); + $builder->addTransition(new Transition('t2', 'f', 'd')); + $builder->addTransition(new Transition('t3', 'd', 'g')); + $builder->addTransition(new Transition('t4', 'f', 'e')); + $builder->addTransition(new Transition('t4', 'g', 'e')); + $builder->addTransition(new Transition('t5', 'f', 'b')); + + return $builder->build(); + } + public function createComplexWorkflowDumpWithMarking() { return 'digraph workflow { @@ -198,6 +235,43 @@ public function provideSimpleWorkflowDumpWithoutMarking() place_b -> transition_t2 [style="solid"]; transition_t2 -> place_c [style="solid"]; } +'; + } + + public function provideComplexStateMachineDump() + { + return 'digraph workflow { + ratio="compress" rankdir="LR" + node [fontsize="9" fontname="Arial" color="#333333" fillcolor="lightblue" fixedsize="1" width="1"]; + edge [fontsize="9" fontname="Arial" color="#333333" arrowhead="normal" arrowsize="0.5"]; + + place_a [label="a", shape=circle, style="filled"]; + place_b [label="b", shape=circle]; + place_c [label="c", shape=circle]; + place_d [label="d", shape=circle]; + place_e [label="e", shape=circle]; + place_f [label="f", shape=circle]; + place_g [label="g", shape=circle]; + transition_t1 [label="t1", shape=box, shape="box", regular="1"]; + transition_t2 [label="t2", shape=box, shape="box", regular="1"]; + transition_t3 [label="t3", shape=box, shape="box", regular="1"]; + transition_t4 [label="t4", shape=box, shape="box", regular="1"]; + transition_t5 [label="t5", shape=box, shape="box", regular="1"]; + place_a -> transition_t1 [style="solid"]; + transition_t1 -> place_c [style="solid"]; + place_b -> transition_t1 [style="solid"]; + place_c -> transition_t2 [style="solid"]; + transition_t2 -> place_d [style="solid"]; + place_e -> transition_t2 [style="solid"]; + place_f -> transition_t2 [style="solid"]; + place_d -> transition_t3 [style="solid"]; + transition_t3 -> place_g [style="solid"]; + place_f -> transition_t4 [style="solid"]; + transition_t4 -> place_e [style="solid"]; + place_g -> transition_t4 [style="solid"]; + place_f -> transition_t5 [style="solid"]; + transition_t5 -> place_b [style="solid"]; +} '; } }