Esempio n. 1
0
        public void GoBack()
        {
            var sm = new SolidMachine <TelephoneTrigger>();

            var isGoingToDialling = false;

            sm.State <IdleState>()
            .On(TelephoneTrigger.PickingUpPhone).GoesTo <DiallingState>();

            sm.State <DiallingState>()
            .On(TelephoneTrigger.Answered, () => isGoingToDialling).GoesTo <ConversationState>()
            .On(TelephoneTrigger.Answered, () => !isGoingToDialling).GoesTo <WaitForAnswerState>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);
            sm.Trigger(TelephoneTrigger.Answered);

            Assert.IsTrue(sm.CurrentState is WaitForAnswerState, "Expected state WaitForAnswerState");
            sm.GoBack();
            Assert.IsTrue(sm.CurrentState is DiallingState,
                          string.Format("Expected state DiallingState, was {0}", sm.CurrentState.GetType().Name));

            // Shift the track
            isGoingToDialling = true;
            sm.Trigger(TelephoneTrigger.Answered);

            Assert.IsTrue(sm.CurrentState is ConversationState, "Expected state ConversationState");
            sm.GoBack();
            Assert.IsTrue(sm.CurrentState is DiallingState, "Expected state DiallingState... again");
        }
Esempio n. 2
0
        public void CorrectOrderOnTransitions()
        {
            var states = new List <string>();

            var sm = new SolidMachine <int>();

            sm.Transitioned += (sender, args) =>
            {
                var stateName = args.TargetState.Name;
                Console.WriteLine("Transitioned to " + stateName);

                states.Add(stateName);
                if (states.Count == 5)
                {
                    var stateOrder = string.Join("_", states);
                    Assert.IsTrue(stateOrder == "IdleState_StepState1_StepState2_StepState3_StepState4",
                                  string.Format("Wrong state order: {0}", stateOrder));
                }
            };

            sm.State <IdleState>()
            .On(0).GoesTo <StepState1>();
            sm.State <StepState1>()
            .On(1).GoesTo <StepState2>();
            sm.State <StepState2>()
            .On(2).GoesTo <StepState3>();
            sm.State <StepState3>()
            .On(3).GoesTo <StepState4>();
            sm.Start();

            sm.Trigger(0);
        }
        // Protected methods

        protected virtual void DoEntering(SolidMachine<int> machine)
        {
            // Just fire the trigger based on the type name (e.g. StepState1 -> fire trigger 1)
            var typeName = GetType().Name;
            var trigger = Convert.ToInt32(typeName.Substring(typeName.Length - 1, 1));

            if (trigger < 4)
                machine.Trigger(trigger);
        }
Esempio n. 4
0
        /// <summary>
        /// This method is called when any of the trigger buttons is pushed.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TriggerButton_Click(object sender, EventArgs e)
        {
            // Get the Tag property of the button as a string
            var tag = (sender as Button).Tag.ToString();

            // Convert it to a TelephoneTrigger
            var trigger = (TelephoneTrigger)Enum.Parse(typeof(TelephoneTrigger), tag);

            _sm.Trigger(trigger);
        }
Esempio n. 5
0
        // Protected methods

        protected virtual void DoEntering(SolidMachine <int> machine)
        {
            // Just fire the trigger based on the type name (e.g. StepState1 -> fire trigger 1)
            var typeName = GetType().Name;
            var trigger  = Convert.ToInt32(typeName.Substring(typeName.Length - 1, 1));

            if (trigger < 4)
            {
                machine.Trigger(trigger);
            }
        }
Esempio n. 6
0
        public void UsingStateResolver()
        {
            // Lets this test class act as the state resolver...
            var sm = new SolidMachine <TelephoneTrigger>(null, this);

            sm.State <IdleState>()
            .On(TelephoneTrigger.PickingUpPhone).GoesTo <StateWithoutParameterlessConstructor>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(sm.CurrentState is StateWithoutParameterlessConstructor);
        }
Esempio n. 7
0
        public void OneStepGuardedTransition()
        {
            var isPhoneWorking = false;

            var sm = new SolidMachine <TelephoneTrigger>();

            sm.State <IdleState>()
            .On(TelephoneTrigger.PickingUpPhone, () => isPhoneWorking).GoesTo <DiallingState>()
            .On(TelephoneTrigger.PickingUpPhone, () => !isPhoneWorking).GoesTo <TelephoneBrokenState>()
            .On(TelephoneTrigger.IncomingCall).GoesTo <RingingState>();

            sm.State <RingingState>()
            .On(TelephoneTrigger.PickingUpPhone).GoesTo <ConversationState>()
            .On(TelephoneTrigger.NotAnswering).GoesTo <IdleState>();

            sm.State <TelephoneBrokenState>()
            .On(TelephoneTrigger.HangingUp).GoesTo <IdleState>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(sm.CurrentState is TelephoneBrokenState,
                          string.Format("Telephone state is {0}, expected {1}", sm.CurrentState.GetType().Name,
                                        typeof(TelephoneBrokenState).Name));

            // Reset the machine to IdleState
            sm.Trigger(TelephoneTrigger.HangingUp);

            isPhoneWorking = true;

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(sm.CurrentState is DiallingState,
                          string.Format("Telephone state is {0}, expected {1}", sm.CurrentState.GetType().Name,
                                        typeof(DiallingState).Name));
        }
Esempio n. 8
0
        public void InvalidTriggerWithHandler()
        {
            var _handlerCalledMessage = "";

            var sm = new SolidMachine <TelephoneTrigger>();

            sm.OnInvalidTrigger((state, trigger) =>
                                { _handlerCalledMessage = string.Format("{0}_{1}", state.Name, trigger); });

            sm.State <IdleState>()
            .On(TelephoneTrigger.PickingUpPhone).GoesTo <DiallingState>();

            sm.State <DiallingState>()
            .On(TelephoneTrigger.HangingUp).GoesTo <IdleState>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);
            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(_handlerCalledMessage ==
                          string.Format("{0}_{1}", typeof(DiallingState).Name, TelephoneTrigger.PickingUpPhone),
                          string.Format("HandlerCalledMessage not what expected : {0}", _handlerCalledMessage));
        }
Esempio n. 9
0
        public void UsingExplicitContext()
        {
            var dateTime = new DateHolder();

            var sm = new SolidMachine <TelephoneTrigger>(dateTime);

            sm.State <IdleState>()
            .On(TelephoneTrigger.PickingUpPhone).GoesTo <DateReportingState>();
            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            // The state should be able to use the specified context (dateTime variable) to report the date.
            Assert.IsTrue(dateTime.CurrentDate.Equals(DateTime.Now.Date), "Wrong date in context!");
        }
Esempio n. 10
0
        public void TriggerWithoutStarted()
        {
            try
            {
                var sm = new SolidMachine <TelephoneTrigger>();

                sm.State <IdleState>()
                .IsInitialState()
                .On(TelephoneTrigger.PickingUpPhone).GoesTo <DiallingState>()
                .On(TelephoneTrigger.IncomingCall).GoesTo <RingingState>();

                sm.Trigger(TelephoneTrigger.IncomingCall);

                Assert.Fail("Trigger on unstarted state machine succeeded!");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Assert.IsTrue(ex is SolidStateException);
                Assert.IsTrue((ex as SolidStateException).ErrorId == SolidStateConstants.ErrorStateMachineNotStarted);
            }
        }
        public void MultipleGuardsEvaluateToTrue()
        {
            try
            {
                var sm = new SolidMachine<TelephoneTrigger>();

                sm.State<IdleState>()
                    .IsInitialState()
                    .On(TelephoneTrigger.PickingUpPhone, () => ((1 + 1) == 2)).GoesTo<DiallingState>()
                    .On(TelephoneTrigger.PickingUpPhone, () => ((6 / 2) == 3)).GoesTo<RingingState>();

                sm.Start();

                sm.Trigger(TelephoneTrigger.PickingUpPhone);

                Assert.Fail("Multiple guard clauses that return True as permitted!");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Assert.IsTrue(ex is SolidStateException);
                Assert.IsTrue((ex as SolidStateException).ErrorId == SolidStateConstants.ErrorMultipleGuardClausesAreTrue);
            }
        }
Esempio n. 12
0
        public void MultipleGuardsEvaluateToTrue()
        {
            try
            {
                var sm = new SolidMachine <TelephoneTrigger>();

                sm.State <IdleState>()
                .IsInitialState()
                .On(TelephoneTrigger.PickingUpPhone, () => ((1 + 1) == 2)).GoesTo <DiallingState>()
                .On(TelephoneTrigger.PickingUpPhone, () => ((6 / 2) == 3)).GoesTo <RingingState>();

                sm.Start();

                sm.Trigger(TelephoneTrigger.PickingUpPhone);

                Assert.Fail("Multiple guard clauses that return True as permitted!");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Assert.IsTrue(ex is SolidStateException);
                Assert.IsTrue((ex as SolidStateException).ErrorId == SolidStateConstants.ErrorMultipleGuardClausesAreTrue);
            }
        }
        public void UsingStateResolver()
        {
            // Lets this test class act as the state resolver...
            var sm = new SolidMachine<TelephoneTrigger>(null, this);

            sm.State<IdleState>()
                .On(TelephoneTrigger.PickingUpPhone).GoesTo<StateWithoutParameterlessConstructor>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(sm.CurrentState is StateWithoutParameterlessConstructor);
        }
Esempio n. 14
0
 /// <summary>
 /// The Next button has been clicked.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void btnNext_Click(object sender, EventArgs e)
 {
     _sm.Trigger(WizardTrigger.Next);
 }
        public void TriggerWithoutStarted()
        {
            try
            {
                var sm = new SolidMachine<TelephoneTrigger>();

                sm.State<IdleState>()
                    .IsInitialState()
                    .On(TelephoneTrigger.PickingUpPhone).GoesTo<DiallingState>()
                    .On(TelephoneTrigger.IncomingCall).GoesTo<RingingState>();

                sm.Trigger(TelephoneTrigger.IncomingCall);

                Assert.Fail("Trigger on unstarted state machine succeeded!");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Assert.IsTrue(ex is SolidStateException);
                Assert.IsTrue((ex as SolidStateException).ErrorId == SolidStateConstants.ErrorStateMachineNotStarted);
            }
        }
        public void OneStepGuardedTransition()
        {
            var isPhoneWorking = false;

            var sm = new SolidMachine<TelephoneTrigger>();
            sm.State<IdleState>()
                .On(TelephoneTrigger.PickingUpPhone, () => isPhoneWorking).GoesTo<DiallingState>()
                .On(TelephoneTrigger.PickingUpPhone, () => !isPhoneWorking).GoesTo<TelephoneBrokenState>()
                .On(TelephoneTrigger.IncomingCall).GoesTo<RingingState>();

            sm.State<RingingState>()
                .On(TelephoneTrigger.PickingUpPhone).GoesTo<ConversationState>()
                .On(TelephoneTrigger.NotAnswering).GoesTo<IdleState>();

            sm.State<TelephoneBrokenState>()
                .On(TelephoneTrigger.HangingUp).GoesTo<IdleState>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(sm.CurrentState is TelephoneBrokenState,
                          string.Format("Telephone state is {0}, expected {1}", sm.CurrentState.GetType().Name,
                                        typeof (TelephoneBrokenState).Name));

            // Reset the machine to IdleState
            sm.Trigger(TelephoneTrigger.HangingUp);

            isPhoneWorking = true;

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(sm.CurrentState is DiallingState,
                          string.Format("Telephone state is {0}, expected {1}", sm.CurrentState.GetType().Name,
                                        typeof (DiallingState).Name));
        }
        public void GoBack()
        {
            var sm = new SolidMachine<TelephoneTrigger>();

            var isGoingToDialling = false;

            sm.State<IdleState>()
                .On(TelephoneTrigger.PickingUpPhone).GoesTo<DiallingState>();

            sm.State<DiallingState>()
                .On(TelephoneTrigger.Answered, () => isGoingToDialling).GoesTo<ConversationState>()
                .On(TelephoneTrigger.Answered, () => !isGoingToDialling).GoesTo<WaitForAnswerState>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);
            sm.Trigger(TelephoneTrigger.Answered);

            Assert.IsTrue(sm.CurrentState is WaitForAnswerState, "Expected state WaitForAnswerState");
            sm.GoBack();
            Assert.IsTrue(sm.CurrentState is DiallingState,
                          string.Format("Expected state DiallingState, was {0}", sm.CurrentState.GetType().Name));
            
            // Shift the track
            isGoingToDialling = true;
            sm.Trigger(TelephoneTrigger.Answered);

            Assert.IsTrue(sm.CurrentState is ConversationState, "Expected state ConversationState");
            sm.GoBack();
            Assert.IsTrue(sm.CurrentState is DiallingState, "Expected state DiallingState... again");

        }
        public void InvalidTriggerWithHandler()
        {
            var _handlerCalledMessage = "";

            var sm = new SolidMachine<TelephoneTrigger>();
            sm.OnInvalidTrigger((state, trigger) =>
                { _handlerCalledMessage = string.Format("{0}_{1}", state.Name, trigger); });

            sm.State<IdleState>()
                .On(TelephoneTrigger.PickingUpPhone).GoesTo<DiallingState>();

            sm.State<DiallingState>()
                .On(TelephoneTrigger.HangingUp).GoesTo<IdleState>();

            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);
            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            Assert.IsTrue(_handlerCalledMessage ==
                          string.Format("{0}_{1}", typeof (DiallingState).Name, TelephoneTrigger.PickingUpPhone),
                          string.Format("HandlerCalledMessage not what expected : {0}", _handlerCalledMessage));
        }
        public void CorrectOrderOnTransitions()
        {
            var states = new List<string>();

            var sm = new SolidMachine<int>();
            sm.Transitioned += (sender, args) =>
                {
                    var stateName = args.TargetState.Name;
                    Console.WriteLine("Transitioned to " + stateName);

                    states.Add(stateName);
                    if (states.Count == 5)
                    {
                        var stateOrder = string.Join("_", states);
                        Assert.IsTrue(stateOrder == "IdleState_StepState1_StepState2_StepState3_StepState4",
                                      string.Format("Wrong state order: {0}", stateOrder));
                    }

                };

            sm.State<IdleState>()
                .On(0).GoesTo<StepState1>();
            sm.State<StepState1>()
                .On(1).GoesTo<StepState2>();
            sm.State<StepState2>()
                .On(2).GoesTo<StepState3>();
            sm.State<StepState3>()
                .On(3).GoesTo<StepState4>();
            sm.Start();

            sm.Trigger(0);
        }
        public void UsingExplicitContext()
        {
            var dateTime = new DateHolder();

            var sm = new SolidMachine<TelephoneTrigger>(dateTime);

            sm.State<IdleState>()
                .On(TelephoneTrigger.PickingUpPhone).GoesTo<DateReportingState>();
            sm.Start();

            sm.Trigger(TelephoneTrigger.PickingUpPhone);

            // The state should be able to use the specified context (dateTime variable) to report the date.
            Assert.IsTrue(dateTime.CurrentDate.Equals(DateTime.Now.Date), "Wrong date in context!");
        }