/** * Build the state * * @param array Map of states keyed by name for the workflow * * @return State Newly minted state */ public function build(array $stateMap) { // Build each condition trigger foreach ($this->conditionBuilders as $conditionBuilder) { $this->state->addCondition($conditionBuilder->build($stateMap)); } // Build each event trigger foreach ($this->eventTriggers as $eventTrigger) { if (array_key_exists($eventTrigger->getStateName(), $stateMap)) { $eventTrigger->setState($stateMap[$eventTrigger->getStateName()]); $this->state->addEventTrigger($eventTrigger); } else { throw new StateNotFoundException($eventTrigger->getStateName(), array_keys($stateMap)); } } // Build each time limit trigger if (null !== $this->timeLimit) { if (array_key_exists($this->timeLimit->getStateName(), $stateMap)) { $this->timeLimit->setState($stateMap[$this->timeLimit->getStateName()]); $this->state->setTimeLimit($this->timeLimit); } else { throw new StateNotFoundException($this->timeLimit->getStateName(), array_keys($stateMap)); } } // Return the complete state return $this->state; }
public function testIsTerminal() { $state = new State('node'); $this->assertTrue($state->isTerminal()); $state->setTimeLimit(new TimeLimit(60, 'next')); $this->assertFalse($state->isTerminal()); $state = new State('node'); $state->addEventTrigger(new EventTrigger('go', 'next')); $this->assertFalse($state->isTerminal()); // Conditions will register as terminals, so the conditions and movements // from them will be used before the terminal check $state = new State('node'); $state->addCondition(new Condition(function ($context) { return true; }, 'next')); $this->assertTrue($state->isTerminal()); }