public void TestSendEventFromState()
        {
            var controller = new TestController();
            var fsm        = new AltoFSM <TestController>(controller);

            SetTransition(fsm);
            fsm.ChangeState <StandState>();

            fsm.SendEvent(StateEvent.Flash);
            fsm.Update();
            fsm.SendEvent(StateEvent.Walk);

            Assert.That(controller.sequence, Is.EqualTo("_in1_out1_in5_out5_in1_up1_out1_in2"));
        }
        public void TestTransitionEventHandlers()
        {
            var controller = new TestController();
            var fsm        = new AltoFSM <TestController>(controller);

            SetTransition(fsm);
            fsm.SetState <StandState>();

            fsm.SendEvent(StateEvent.Walk);
            fsm.Update();
            fsm.SendEvent(StateEvent.Run);

            Assert.That(controller.sequence, Is.EqualTo("_out1_in2_up2_out2_in3"));
        }
        public void TestFreeTransition()
        {
            var controller = new TestController();
            var fsm        = new AltoFSM <TestController>(controller);

            SetTransition(fsm);

            fsm.SetState <StandState>();
            fsm.SendEvent(StateEvent.Talk);
            Assert.That(fsm.IsState <TalkState>, Is.True);

            fsm.SetState <WalkState>();
            fsm.SendEvent(StateEvent.Talk);
            Assert.That(fsm.IsState <TalkState>, Is.True);
        }
        void SetTransition(AltoFSM <TestController> fsm)
        {
            // Stand <--> Walk <--> Run
            fsm.AddTransition <StandState, WalkState>(StateEvent.Walk);
            fsm.AddTransition <WalkState, RunState>(StateEvent.Run);
            fsm.AddTransition <RunState, WalkState>(StateEvent.Walk);
            fsm.AddTransition <WalkState, StandState>(StateEvent.Stand);

            // [AnyState] -> Talk, Flash
            fsm.AddFreeTransition <TalkState>(StateEvent.Talk);
            fsm.AddFreeTransition <FlashState>(StateEvent.Flash);

            // Talk, Flash -> Stand
            fsm.AddTransition <TalkState, StandState>(StateEvent.Stand);
            fsm.AddTransition <FlashState, StandState>(StateEvent.GoNext);
        }
        public void TestBasic()
        {
            var controller = new TestController();
            var fsm        = new AltoFSM <TestController>(controller);

            SetTransition(fsm);

            fsm.SetState <StandState>();
            Assert.That(fsm.currentState.GetType(), Is.EqualTo(typeof(StandState)));

            fsm.SendEvent(StateEvent.Run);
            fsm.SendEvent(StateEvent.Stand);
            fsm.SendEvent(StateEvent.Walk);

            Assert.That(fsm.currentState.GetType(), Is.EqualTo(typeof(WalkState)));
            Assert.That(fsm.IsState <WalkState>, Is.True);
            Assert.That(fsm.IsState <RunState>, Is.False);
        }
        public void TestGuard()
        {
            var controller = new TestController();
            var fsm        = new AltoFSM <TestController>(controller);

            SetTransition(fsm);
            fsm.SetState <StandState>();

            fsm.SendEvent(StateEvent.Talk);
            Assert.That(fsm.IsState <TalkState>(), Is.True);

            fsm.SendEvent(StateEvent.Stand);
            Assert.That(fsm.IsState <StandState>(), Is.True);

            fsm.SetState <TalkState>();
            controller.guardFromTalk = true;
            fsm.SendEvent(StateEvent.Stand);
            Assert.That(fsm.IsState <StandState>(), Is.False, "ガードされて遷移しない");
        }