public void EventsQueueing(
            IStateMachine <string, int> machine)
        {
            const int FirstEvent  = 0;
            const int SecondEvent = 1;

            var arrived = false;

            "establish a passive state machine with transitions".x(() =>
            {
                var stateMachineDefinitionBuilder = new StateMachineDefinitionBuilder <string, int>();
                stateMachineDefinitionBuilder.In("A").On(FirstEvent).Goto("B");
                stateMachineDefinitionBuilder.In("B").On(SecondEvent).Goto("C");
                stateMachineDefinitionBuilder.In("C").ExecuteOnEntry(() => arrived = true);
                machine = stateMachineDefinitionBuilder
                          .WithInitialState("A")
                          .Build()
                          .CreatePassiveStateMachine();
            });

            "when firing an event onto the state machine".x(() =>
            {
                machine.Fire(FirstEvent);
                machine.Fire(SecondEvent);
                machine.Start();
            });

            "it should queue event at the end".x(() =>
                                                 arrived
                                                 .Should()
                                                 .BeTrue("state machine should arrive at destination state"));
        }
예제 #2
0
        public void EventsQueueing(
            IStateMachine <string, int> machine,
            AutoResetEvent signal)
        {
            const int FirstEvent  = 0;
            const int SecondEvent = 1;

            "establish an active state machine with transitions".x(() =>
            {
                signal = new AutoResetEvent(false);

                var stateMachineDefinitionBuilder = new StateMachineDefinitionBuilder <string, int>();
                stateMachineDefinitionBuilder.In("A").On(FirstEvent).Goto("B");
                stateMachineDefinitionBuilder.In("B").On(SecondEvent).Goto("C");
                stateMachineDefinitionBuilder.In("C").ExecuteOnEntry(() => signal.Set());
                machine = stateMachineDefinitionBuilder
                          .WithInitialState("A")
                          .Build()
                          .CreateActiveStateMachine();
            });

            "when firing an event onto the state machine".x(() =>
            {
                machine.Fire(FirstEvent);
                machine.Fire(SecondEvent);
                machine.Start();
            });

            "it should queue event at the end".x(() =>
                                                 signal
                                                 .WaitOne(1000)
                                                 .Should()
                                                 .BeTrue("state machine should arrive at destination state"));
        }
예제 #3
0
        public void PriorityFire(string dummyName, Func <StateMachineDefinition <States, Events>, IStateMachine <States, Events> > createStateMachine)
        {
            const int Transitions = 3;
            var       exceptions  = new List <EventArgs>();
            var       transitionCompletedMessages = new List <TransitionCompletedEventArgs <States, Events> >();
            var       transitionDeclinedMessages  = new List <TransitionEventArgs <States, Events> >();

            IStateMachine <States, Events> testee = null;
            var stateMachineDefinitionBuilder     = new StateMachineDefinitionBuilder <States, Events>();

            stateMachineDefinitionBuilder
            .In(States.A)
            .On(Events.B).Goto(States.B).Execute(() =>
            {
                FireD();
                FirePriorityC();
            });
            stateMachineDefinitionBuilder
            .In(States.B)
            .On(Events.C).Goto(States.C);
            stateMachineDefinitionBuilder
            .In(States.C)
            .On(Events.D).Goto(States.D);
            var stateMachineDefinition = stateMachineDefinitionBuilder
                                         .WithInitialState(States.A)
                                         .Build();

            testee = createStateMachine(stateMachineDefinition);

            void FireD() => testee.Fire(Events.D);
            void FirePriorityC() => testee.FirePriority(Events.C);

            testee.TransitionExceptionThrown += (sender, e) => exceptions.Add(e);
            testee.TransitionCompleted       += (sender, e) => transitionCompletedMessages.Add(e);
            testee.TransitionDeclined        += (sender, e) => transitionDeclinedMessages.Add(e);

            var allTransitionsCompleted = SetUpWaitForAllTransitions(testee, 1);

            testee.Start();

            testee.Fire(Events.B);

            WaitForAllTransitions(allTransitionsCompleted);

            transitionCompletedMessages.Count.Should().Be(Transitions);
            transitionDeclinedMessages.Should().BeEmpty();
            exceptions.Should().BeEmpty();

            testee.Stop();
        }
예제 #4
0
        private async Task FindTaskAsync(CancellationToken ct)
        {
            GameObject player = null;

            while (player == null)
            {
                if (ct.IsCancellationRequested)
                {
                    return;
                }
                player = CheckFoundPlayer(canFollowingDistance);
                await Task.Delay((int)(Time.deltaTime * 1000));
            }
            partrolTaskCTS?.Cancel();
            playerTansform = player.transform;
            fsm.Fire(BlackKnightTrigger.Found);
            //fsm.Fire(BlackKnightTrigger.Confrontation);
            //await MoveToThePointAsync(playerTansform, ct);
        }
예제 #5
0
 static void Fire(IStateMachine <State, Trigger> phoneCall, Trigger trigger)
 {
     Debug.Log("[Firing:] " + trigger);
     phoneCall.Fire(trigger);
 }
예제 #6
0
 public void onMessageGenerated()
 {
     ImsgStateMachine.Fire(E_Msg_EVENT.HasBeenGenerated);
 }
예제 #7
0
 static void Fire(IStateMachine <State, Trigger> motionStateMachine, Trigger trigger)
 {
     Debug.Log("Triggering: " + trigger);
     motionStateMachine.Fire(trigger);
 }