示例#1
0
 /**
  * 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;
 }
示例#2
0
 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());
 }