예제 #1
0
        public async Task Builder_Should_BeAbleToBuildANewStateMachineWithPreviousState()
        {
            var dummy = new DummyData();

            var builder = StateMachineBuilder.Create <DummyData>()
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep());

            var machine1 = builder.Build(dummy);

            Assert.Equal(0, machine1.State);
            Assert.True(await machine1.MoveNextAsync());

            Assert.Equal(1, machine1.State);
            Assert.True(await machine1.MoveNextAsync());

            var machine2 = builder.Build(machine1.State, dummy);

            Assert.Equal(2, machine2.State);
            Assert.True(await machine2.MoveNextAsync());

            Assert.Equal(3, machine2.State);
            Assert.True(await machine2.MoveNextAsync());

            Assert.Equal(4, machine2.State);
            Assert.True(await machine2.MoveNextAsync());

            Assert.Equal(5, machine2.State);
            Assert.False(await machine2.MoveNextAsync());
        }
예제 #2
0
        public void Build_Should_Throw_When_NoStepIsProvided()
        {
            var builder = StateMachineBuilder.Create <DummyState, DummyData>()
                          .SetEndState(DummyState.Done);

            Assert.Throws <MissingStepException>(() => builder.Build(DummyState.Start, new DummyData()));
        }
예제 #3
0
        public async Task StateMachineBuiltWithBuilder_Should_BeAbleToStartFromAState()
        {
            var dummy = new DummyData();

            var machine = StateMachineBuilder.Create <DummyData>()
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .Build(2, dummy);

            Assert.Equal(2, machine.State);
            Assert.True(await machine.MoveNextAsync());

            Assert.Equal(3, machine.State);
            Assert.True(await machine.MoveNextAsync());

            Assert.Equal(4, machine.State);
            Assert.True(await machine.MoveNextAsync());

            Assert.Equal(5, machine.State);
            Assert.False(await machine.MoveNextAsync());

            Assert.Equal(5, machine.State);
            Assert.False(await machine.MoveNextAsync());
            Assert.Equal(5, machine.State);
            Assert.False(await machine.MoveNextAsync());
            Assert.Equal(5, machine.State);
            Assert.False(await machine.MoveNextAsync());

            Assert.Equal(3, dummy.StepCount);
        }
예제 #4
0
        public async Task StateMachineBuiltWithBuilder_Should_RunTheFinalStep()
        {
            var dummy = new DummyData();

            var machine = StateMachineBuilder.Create <DummyData>()
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .AddStep(new CounterStep())
                          .Build(dummy);

            Assert.Equal(0, machine.State);
            Assert.True(await machine.MoveNextAsync());

            Assert.Equal(1, machine.State);
            Assert.True(await machine.MoveNextAsync());

            Assert.Equal(2, machine.State);
            Assert.True(await machine.MoveNextAsync());

            Assert.Equal(3, machine.State);
            Assert.False(await machine.MoveNextAsync());

            Assert.Equal(3, machine.State);
            Assert.False(await machine.MoveNextAsync());
            Assert.Equal(3, machine.State);
            Assert.False(await machine.MoveNextAsync());
            Assert.Equal(3, machine.State);
            Assert.False(await machine.MoveNextAsync());

            Assert.Equal(3, dummy.StepCount);
        }
예제 #5
0
        private static void Main(string[] args)
        {
            // Build a state machine with two states: "Hello, world!" and "Goodbye, world!"
            // Toggle between these two states when the trigger "Toggle state" gets set.
            // Don't worry, you can use whatever data type you'd like for the state and param ids.
            StateMachine stateMachine = StateMachineBuilder.Create().
                                        AddState("Hello, world!").GoTo("Goodbye, world!").WhenTrigger("Toggle state").
                                        AddState("Goodbye, world!").GoTo("Hello, world!").WhenTrigger("Toggle state").
                                        Build().As <StateMachine>();

            // Enable logging so you can see what goes on inside the state machine
            stateMachine.LogFlow = true;

            // Start the state machine, aka enter the first state: "Hello, world!"
            stateMachine.Start();

            // Toggle states by setting the "Toggle state" trigger every second 5 times
            int count = 5;

            while (count-- >= 0)
            {
                Print.Log(stateMachine.ActiveStateId);
                Thread.Sleep(1000);
                stateMachine.SetTrigger("Toggle state");
            }
        }
        public void Ctor_SuccessfullyCreateStateMachine_CurrentStateIsEqualToInitalState()
        {
            // Arrange
            var stateMachine = StateMachineBuilder.Create(State.Start);

            // Act
            var currentState = stateMachine.CurrentState;

            // Assert
            Assert.Equal(State.Start, currentState);
        }
        public void IsTransitionAllowedTo_InvalidTransition_ReturnFalse()
        {
            // Arrange
            var stateMachine = StateMachineBuilder.Create(State.Start);

            // Act
            var transitionAllowed = stateMachine.IsTransitionAllowedTo(State.Working);

            // Assert
            Assert.False(transitionAllowed);
        }
        public void ChangeState_InvalidTransition_ThrowInvalidTransitionException()
        {
            // Arrange
            var stateMachine = StateMachineBuilder.Create(State.Start);

            stateMachine.AddTransition(State.Start, State.Working);
            stateMachine.AddTransition(State.Working, State.Deleted);


            // Act, Assert
            Assert.Throws <InvalidTransitionException>(() => stateMachine.ChangeState(State.Deleted));
        }
        public void ChangeState_CurrentStateEqualsNewState_ReturnCurrentState()
        {
            // Arrange
            var stateMachine = StateMachineBuilder.Create(State.Start);

            stateMachine.AddTransition(State.Start, State.Working);

            // Act
            var newState = stateMachine.ChangeState(State.Start);

            // Assert
            Assert.Equal(State.Start, newState);
        }
예제 #10
0
        public void IsTransitionAllowedTo_ValidTransition_ReturnTrue()
        {
            // Arrange
            var stateMachine = StateMachineBuilder.Create(State.Start);

            stateMachine.AddTransition(State.Start, State.Working);

            // Act
            var transitionAllowed = stateMachine.IsTransitionAllowedTo(State.Working);

            // Assert
            Assert.True(transitionAllowed);
        }
예제 #11
0
        public static void Main(string[] args)
        {
            var builder = StateMachineBuilder <State, String, Fettle.Void> .Create();

            builder.Transition().From(State.Initial).To(State.One).On("hello");
            builder.Transition().From(State.One).To(State.Two).On("jump");

            var template = builder.BuildTransitionModel();
            var machine  = template.NewStateMachineWithInitialState(State.Initial);

            machine.FireEvent("hello");

            Console.WriteLine("State = " + machine.CurrentState);

            machine.FireEvent("jump");

            Console.WriteLine("State = " + machine.CurrentState);
        }
예제 #12
0
        private static void Main(string[] args)
        {
            var stateMachine = StateMachineBuilder.Create().
                               AddState("Enter").
                               OnEnterAsync(async(machine) => {
                Print.Log("Getting data.");
                string data = await GetData();
                Print.Log($"Data: {data}");
            }).
                               Build();

            stateMachine.LogFlow = true;
            stateMachine.StartAsync().ContinueWith(x => Print.Log("Done."));
            Print.Log($"First hello");
            Thread.Sleep(1000);
            Print.Log($"Second hello");
            Console.ReadLine();
        }
예제 #13
0
        public async Task BuilderWithState_Should_BeAbleToBuildANewStateMachineWithPreviousState()
        {
            var dummy = new DummyData();

            var builder = StateMachineBuilder.Create <DummyState, DummyData>()
                          .AddStep(new StartStep())
                          .AddStep(new MiddleStep())
                          .SetEndState(DummyState.Done);

            var machine1 = builder.Build(DummyState.Start, dummy);

            Assert.Equal(DummyState.Start, machine1.State);
            Assert.True(await machine1.MoveNextAsync());

            Assert.Equal(DummyState.Middle, machine1.State);

            var machine2 = builder.Build(machine1.State, dummy);

            Assert.Equal(DummyState.Middle, machine1.State);
            Assert.True(await machine2.MoveNextAsync());

            Assert.Equal(DummyState.Done, machine2.State);
            Assert.False(await machine2.MoveNextAsync());
        }
예제 #14
0
        public void AddSteps_Should_Throw_When_StepIsNull()
        {
            var builder = StateMachineBuilder.Create <DummyData>();

            Assert.Throws <ArgumentNullException>(() => builder.AddSteps((IEnumerable <IStateMachineStep <DummyData> >)null));
        }