[Workflow] Fixed marking state on leave and enter events
This commit is contained in:
parent
94d059d530
commit
175858a67e
@ -5,6 +5,7 @@ namespace Symfony\Component\Workflow\Tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\EventDispatcher\EventDispatcher;
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
use Symfony\Component\Workflow\Definition;
|
use Symfony\Component\Workflow\Definition;
|
||||||
|
use Symfony\Component\Workflow\Event\Event;
|
||||||
use Symfony\Component\Workflow\Event\GuardEvent;
|
use Symfony\Component\Workflow\Event\GuardEvent;
|
||||||
use Symfony\Component\Workflow\Marking;
|
use Symfony\Component\Workflow\Marking;
|
||||||
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
|
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
|
||||||
@ -252,6 +253,41 @@ class WorkflowTest extends TestCase
|
|||||||
$this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEvents);
|
$this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMarkingStateOnApplyWithEventDispatcher()
|
||||||
|
{
|
||||||
|
$definition = new Definition(range('a', 'f'), array(new Transition('t', range('a', 'c'), range('d', 'f'))));
|
||||||
|
|
||||||
|
$subject = new \stdClass();
|
||||||
|
$subject->marking = array('a' => 1, 'b' => 1, 'c' => 1);
|
||||||
|
|
||||||
|
$dispatcher = new EventDispatcher();
|
||||||
|
|
||||||
|
$workflow = new Workflow($definition, new MultipleStateMarkingStore(), $dispatcher, 'test');
|
||||||
|
|
||||||
|
$assertInitialState = function (Event $event) {
|
||||||
|
$this->assertEquals(new Marking(array('a' => 1, 'b' => 1, 'c' => 1)), $event->getMarking());
|
||||||
|
};
|
||||||
|
$assertTransitionState = function (Event $event) {
|
||||||
|
$this->assertEquals(new Marking(array()), $event->getMarking());
|
||||||
|
};
|
||||||
|
|
||||||
|
$dispatcher->addListener('workflow.leave', $assertInitialState);
|
||||||
|
$dispatcher->addListener('workflow.test.leave', $assertInitialState);
|
||||||
|
$dispatcher->addListener('workflow.test.leave.a', $assertInitialState);
|
||||||
|
$dispatcher->addListener('workflow.test.leave.b', $assertInitialState);
|
||||||
|
$dispatcher->addListener('workflow.test.leave.c', $assertInitialState);
|
||||||
|
$dispatcher->addListener('workflow.transition', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.test.transition', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.test.transition.t', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.enter', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.test.enter', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.test.enter.d', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.test.enter.e', $assertTransitionState);
|
||||||
|
$dispatcher->addListener('workflow.test.enter.f', $assertTransitionState);
|
||||||
|
|
||||||
|
$workflow->apply($subject, 't');
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetEnabledTransitions()
|
public function testGetEnabledTransitions()
|
||||||
{
|
{
|
||||||
$definition = $this->createComplexWorkflowDefinition();
|
$definition = $this->createComplexWorkflowDefinition();
|
||||||
|
@ -223,20 +223,22 @@ class Workflow
|
|||||||
|
|
||||||
private function leave($subject, Transition $transition, Marking $marking)
|
private function leave($subject, Transition $transition, Marking $marking)
|
||||||
{
|
{
|
||||||
|
$places = $transition->getFroms();
|
||||||
|
|
||||||
if (null !== $this->dispatcher) {
|
if (null !== $this->dispatcher) {
|
||||||
$event = new Event($subject, $marking, $transition);
|
$event = new Event($subject, $marking, $transition);
|
||||||
|
|
||||||
$this->dispatcher->dispatch('workflow.leave', $event);
|
$this->dispatcher->dispatch('workflow.leave', $event);
|
||||||
$this->dispatcher->dispatch(sprintf('workflow.%s.leave', $this->name), $event);
|
$this->dispatcher->dispatch(sprintf('workflow.%s.leave', $this->name), $event);
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($transition->getFroms() as $place) {
|
foreach ($places as $place) {
|
||||||
$marking->unmark($place);
|
|
||||||
|
|
||||||
if (null !== $this->dispatcher) {
|
|
||||||
$this->dispatcher->dispatch(sprintf('workflow.%s.leave.%s', $this->name, $place), $event);
|
$this->dispatcher->dispatch(sprintf('workflow.%s.leave.%s', $this->name, $place), $event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($places as $place) {
|
||||||
|
$marking->unmark($place);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function transition($subject, Transition $transition, Marking $marking)
|
private function transition($subject, Transition $transition, Marking $marking)
|
||||||
@ -254,20 +256,22 @@ class Workflow
|
|||||||
|
|
||||||
private function enter($subject, Transition $transition, Marking $marking)
|
private function enter($subject, Transition $transition, Marking $marking)
|
||||||
{
|
{
|
||||||
|
$places = $transition->getTos();
|
||||||
|
|
||||||
if (null !== $this->dispatcher) {
|
if (null !== $this->dispatcher) {
|
||||||
$event = new Event($subject, $marking, $transition);
|
$event = new Event($subject, $marking, $transition);
|
||||||
|
|
||||||
$this->dispatcher->dispatch('workflow.enter', $event);
|
$this->dispatcher->dispatch('workflow.enter', $event);
|
||||||
$this->dispatcher->dispatch(sprintf('workflow.%s.enter', $this->name), $event);
|
$this->dispatcher->dispatch(sprintf('workflow.%s.enter', $this->name), $event);
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($transition->getTos() as $place) {
|
foreach ($places as $place) {
|
||||||
$marking->mark($place);
|
|
||||||
|
|
||||||
if (null !== $this->dispatcher) {
|
|
||||||
$this->dispatcher->dispatch(sprintf('workflow.%s.enter.%s', $this->name, $place), $event);
|
$this->dispatcher->dispatch(sprintf('workflow.%s.enter.%s', $this->name, $place), $event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($places as $place) {
|
||||||
|
$marking->mark($place);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function announce($subject, Transition $initialTransition, Marking $marking)
|
private function announce($subject, Transition $initialTransition, Marking $marking)
|
||||||
|
Reference in New Issue
Block a user