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"]; +} '; } }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: