Пример #1
0
 /**
  * @param \Khaos\FSM\State\State $initialState
  * @param \Khaos\FSM\Stateful $context
  * @param \Khaos\FSM\Transition\Transition $t1
  * @param \Khaos\FSM\Transition\Transition $t2
  * @param \Khaos\FSM\State\State $s1
  * @param \Khaos\FSM\State\State $s2
  */
 function let($initialState, $context, $t1, $t2, $s1, $s2)
 {
     $context->setCurrentState($initialState)->willReturn();
     $context->getCurrentState()->willReturn($initialState);
     $this->beConstructedWith($initialState, $context);
     $t1->can('t1', $context, $this->getWrappedObject())->willReturn(true);
     $t1->can(Argument::any(), $context, $this->getWrappedObject())->willReturn(false);
     $t1->apply('t1', $context, $this->getWrappedObject())->willReturn('S1');
     $t1->getTo()->willReturn($s1);
     $t2->can('t2', $context, $this->getWrappedObject())->willReturn(true);
     $t2->can(Argument::any(), $context, $this->getWrappedObject())->willReturn(false);
     $t2->apply('t2', $context, $this->getWrappedObject())->willReturn('S2');
     $t2->getTo()->willReturn($s2);
     $initialState->getTransitions()->willReturn([$t1, $t2]);
 }
Пример #2
0
 /**
  * Can Advance
  *
  * Determine if the machine can be advanced, if so return the
  * valid transition.
  *
  * Usage :-
  *
  * can(Input)
  * can(Input, Transition)
  *
  * @param mixed      $input        Input against which transition(s) will be tested
  * @param Transition $transition   If specified only this transition will be tested
  *
  * @return Transition|false
  * @throws Exception
  */
 public function can($input, $transition = null)
 {
     $state = $this->context->getCurrentState();
     if (!$transition instanceof Transition) {
         foreach ($state->getTransitions() as $candidate) {
             if (!$candidate->can($input, $this->context, $this)) {
                 continue;
             }
             return $candidate;
         }
         return false;
     }
     return $transition->can($input, $this->context, $this) ? $transition : false;
 }
Пример #3
0
 /**
  * Apply Transition
  *
  * @param Transition $candidate
  *
  * @return mixed[]|null
  */
 private function apply($candidate)
 {
     if (($output = $candidate->apply($this->input, $this->context, $this)) !== null) {
         $this->output[] = $output;
     }
     return $this->backtrack();
 }