コード例 #1
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task InterruptState()
        {
            int i1Called = 0;
            int i2Called = 0;

            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateTestState(States.S1)
                     .End()
                     .AsyncInterruptState(TrigType.T2, _ =>
            {
                i2Called++;
                return(Task.CompletedTask);
            }, States.INTER2)
                     .InterruptState(TrigType.T1, _ => i1Called++, States.INTER1)
                     .Build(States.S1);

            sm.Next(TrigType.T1);
            sm.Next(TrigType.T2);

            await sm.NextAsync(TrigType.T1);

            await sm.NextAsync(TrigType.T2);

            i1Called.ShouldBe(2);
            i2Called.ShouldBe(2);
            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S1).ShouldBe(0);
        }
コード例 #2
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task Next_async_called_on_context_enters_next_state_after_current_finished()
        {
            bool s1Called = false;
            bool s2Called = false;
            bool s3Called = false;
            bool s4Called = false;


            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateState(States.S0)
                     .Transition(TrigType.T1, States.S1)
                     .End()
                     .CreateState(States.S1)
                     .EnterAsync(args =>
            {
                args.Context.Next(TrigType.T1);
                s1Called = true;
                return(Task.CompletedTask);
            })
                     .Transition(TrigType.T1, States.S2)
                     .End()
                     .CreateState(States.S2)
                     .Enter(args =>
            {
                args.Context.NextAsync(TrigType.T2);
                s2Called = true;
            })
                     .Transition(TrigType.T2, States.S3)
                     .End()
                     .CreateState(States.S3)
                     .EnterAsync(args => { s3Called = true; return(Task.CompletedTask); })
                     .Transition(TrigType.T2, States.S4)
                     .End()
                     .CreateState(States.S4)
                     .EnterAsync(args =>
            {
                s4Called = true;
                return(Task.CompletedTask);
            })
                     .End()
                     .Build(States.S0);


            var current = await sm.NextAsync(TrigType.T1);

            current?.Name.ShouldBe(States.S3);
            s1Called.ShouldBeTrue();
            s2Called.ShouldBeTrue();
            s3Called.ShouldBeTrue();
            s4Called.ShouldBeFalse();


            //context clear test
            current = await sm.NextAsync(TrigType.T2);

            current?.Name.ShouldBe(States.S4);
            s4Called.ShouldBeTrue();
        }
コード例 #3
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task IgnoringState()
        {
            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateTestState(States.S1, true)
                     .Transition(TrigType.T1, States.S2)
                     .Ignoring()
                     .End()

                     .CreateTestState(States.S2, true)
                     .Ignoring()
                     .End()

                     .InterruptTestState(TrigType.T2, States.INTER1)

                     .Build(States.S1);


            sm.Next(TrigType.T3);
            await sm.NextAsync(TrigType.T3);

            TestStateMachineContext <TrigType, States> .Result.ShouldBe("");

            sm.Next(TrigType.T1);

            TestStateMachineContext <TrigType, States> .Result.ShouldBe("_ET1-ES1_T1-S2");

            sm.Next(TrigType.T2);

            TestStateMachineContext <TrigType, States> .Result.ShouldBe("_ET1-ES1_T1-S2_ET2-ES2_T2-INTER1");
        }
コード例 #4
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task TransitionPrecedenceTest()
        {
            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateTestState(States.S1)
                     .Transition(TrigType.T1, States.S2)
                     .End()

                     .InterruptTestState(TrigType.T1, States.INTER1)

                     .CreateTestState(States.S2)
                     .Loop(TrigType.T2)
                     .Transition(TrigType.T3, States.S1)
                     .End()

                     .Build(States.S1);



            sm.Next(TrigType.T1);
            sm.Next(TrigType.T1);

            sm.Next(TrigType.T3);
            await sm.NextAsync(TrigType.T1);

            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.INTER1).ShouldBe(1);

            TestStateMachineContext <TrigType, States> .Result.ShouldBe("_T1-S2_T1-INTER1_T3-S1_T1-S2");
        }
コード例 #5
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task ResetInterruptState()
        {
            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateTestState(States.S1)
                     .Transition(TrigType.T2, States.S2)
                     .End()
                     .CreateTestState(States.S2)
                     .Loop(TrigType.T2)
                     .End()
                     .ResetInterruptState(TrigType.T1, t => {}, States.RESETINTER1, States.S1)
                     .AsyncResetInterruptState(TrigType.T3, _ => Task.CompletedTask, States.RESETINTER2, States.S2)
                     .Build(States.S1);

            sm.Next(TrigType.T2);
            sm.Next(TrigType.T1);

            sm.CurrentState.Name.ShouldBe(States.S1);

            await sm.NextAsync(TrigType.T3);

            sm.CurrentState.Name.ShouldBe(States.S2);

            sm.Next(TrigType.T2);

            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S1).ShouldBe(0);

            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S2).ShouldBe(2);

            TestStateMachineContext <TrigType, States> .Result.ShouldBe("_T2-S2_T2-S2");

            sm.CurrentState.Name.ShouldBe(States.S2);
        }
コード例 #6
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task HoldingGlobState()
        {
            int i1Called = 0;
            int i2Called = 0;

            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateTestState(States.S1)
                     .End()
                     .AsyncHoldingGlobState(TrigType.T2, _ =>
            {
                i2Called++;
                return(Task.CompletedTask);
            }, States.INTER2, TrigType.RET)
                     .HoldingGlobState(TrigType.T1, _ => i1Called++, States.INTER1, TrigType.RET)
                     .Build(States.S1);


            sm.Next(TrigType.T1);
            sm.CurrentState.Name.ShouldBe(States.INTER1);

            await sm.NextAsync(TrigType.T1);

            sm.CurrentState.Name.ShouldBe(States.INTER1);
            sm.Next(TrigType.T2);
            sm.CurrentState.Name.ShouldBe(States.INTER1);

            sm.Next(TrigType.RET);
            sm.CurrentState.Name.ShouldBe(States.S1);

            await sm.NextAsync(TrigType.T2);

            sm.CurrentState.Name.ShouldBe(States.INTER2);

            await sm.NextAsync(TrigType.T1);

            sm.CurrentState.Name.ShouldBe(States.INTER2);
            sm.Next(TrigType.T2);
            sm.CurrentState.Name.ShouldBe(States.INTER2);

            await sm.NextAsync(TrigType.RET);

            sm.CurrentState.Name.ShouldBe(States.S1);

            i1Called.ShouldBe(1);
            i2Called.ShouldBe(1);
            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S1).ShouldBe(2);
        }
コード例 #7
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public void Enter_exit_null_does_not_throw()
        {
            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateState(States.S3)
                     .Transition(TrigType.T1, States.S2)
                     .End()
                     .CreateState(States.S2)
                     .Transition(TrigType.T1, States.S3)
                     .End()
                     .Build(States.S3);

            sm.NextAsync(TrigType.T1);
            sm.Next(TrigType.T1);
        }
コード例 #8
0
ファイル: UnitTest1.cs プロジェクト: pekalam/StateMachineLib
        public async Task AsynState()
        {
            var sm = new StateMachineBuilder <TrigType, States>()
                     .CreateTestAsyncState(States.S1, true)
                     .Transition(TrigType.T2, States.S2)
                     .End()
                     .CreateTestAsyncState(States.S2)
                     .Transition(TrigType.T1, States.S1)
                     .Transition(TrigType.T3, States.S3)
                     .End()
                     .CreateTestState(States.S3)
                     .Transition(TrigType.T3, States.S1)
                     .Loop(TrigType.T1)
                     .End()
                     .Build(States.S1);

            sm.CurrentState.Name.ShouldBe(States.S1);

            sm.Next(TrigType.T2);
            await sm.NextAsync(TrigType.T1);

            await sm.NextAsync(TrigType.T2);

            sm.Next(TrigType.T3);
            await sm.NextAsync(TrigType.T1);

            await sm.NextAsync(TrigType.T3);

            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S1).ShouldBe(2);

            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S2).ShouldBe(2);

            TestStateMachineContext <TrigType, States> .GetStateTimesCalled(States.S3).ShouldBe(2);

            TestStateMachineContext <TrigType, States> .Result.ShouldBe("_ET2-ES1_T2-S2_T1-S1_ET2-ES1_T2-S2_T3-S3_T1-S3_T3-S1");
        }