[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 Symfony\Component\EventDispatcher\EventDispatcher;
|
||||
use Symfony\Component\Workflow\Definition;
|
||||
use Symfony\Component\Workflow\Event\Event;
|
||||
use Symfony\Component\Workflow\Event\GuardEvent;
|
||||
use Symfony\Component\Workflow\Marking;
|
||||
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
|
||||
@ -252,6 +253,41 @@ class WorkflowTest extends TestCase
|
||||
$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()
|
||||
{
|
||||
$definition = $this->createComplexWorkflowDefinition();
|
||||
|
@ -223,20 +223,22 @@ class Workflow
|
||||
|
||||
private function leave($subject, Transition $transition, Marking $marking)
|
||||
{
|
||||
$places = $transition->getFroms();
|
||||
|
||||
if (null !== $this->dispatcher) {
|
||||
$event = new Event($subject, $marking, $transition);
|
||||
|
||||
$this->dispatcher->dispatch('workflow.leave', $event);
|
||||
$this->dispatcher->dispatch(sprintf('workflow.%s.leave', $this->name), $event);
|
||||
}
|
||||
|
||||
foreach ($transition->getFroms() as $place) {
|
||||
$marking->unmark($place);
|
||||
|
||||
if (null !== $this->dispatcher) {
|
||||
foreach ($places as $place) {
|
||||
$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)
|
||||
@ -254,20 +256,22 @@ class Workflow
|
||||
|
||||
private function enter($subject, Transition $transition, Marking $marking)
|
||||
{
|
||||
$places = $transition->getTos();
|
||||
|
||||
if (null !== $this->dispatcher) {
|
||||
$event = new Event($subject, $marking, $transition);
|
||||
|
||||
$this->dispatcher->dispatch('workflow.enter', $event);
|
||||
$this->dispatcher->dispatch(sprintf('workflow.%s.enter', $this->name), $event);
|
||||
}
|
||||
|
||||
foreach ($transition->getTos() as $place) {
|
||||
$marking->mark($place);
|
||||
|
||||
if (null !== $this->dispatcher) {
|
||||
foreach ($places as $place) {
|
||||
$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)
|
||||
|
Reference in New Issue
Block a user