Пример #1
0
        /// <summary>
        /// Fires the specified event.
        /// </summary>
        /// <param name="eventId">The event.</param>
        /// <param name="eventArgument">The event argument.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        public async Task Fire(TEvent eventId, object eventArgument)
        {
            this.CheckThatStateMachineIsInitialized();
            this.CheckThatStateMachineHasEnteredInitialState();

            await this.ForEach(extension => extension.FiringEvent(this, ref eventId, ref eventArgument))
            .ConfigureAwait(false);

            ITransitionContext <TState, TEvent> context = this.factory.CreateTransitionContext(this.CurrentState, new Missable <TEvent>(eventId), eventArgument, this);
            ITransitionResult <TState, TEvent>  result  = await this.CurrentState.Fire(context).ConfigureAwait(false);

            if (!result.Fired)
            {
                this.OnTransitionDeclined(context);
                return;
            }

            await this.SetCurrentState(result.NewState)
            .ConfigureAwait(false);

            await this.ForEach(extension => extension.FiredEvent(this, context))
            .ConfigureAwait(false);

            this.OnTransitionCompleted(context);
        }
Пример #2
0
        /// <summary>
        /// Goes recursively up the state hierarchy until a state is found that can handle the event.
        /// </summary>
        /// <param name="context">The event context.</param>
        /// <returns>The result of the transition.</returns>
        public ITransitionResult <TState, TEvent> Fire(ITransitionContext <TState, TEvent> context)
        {
            Ensure.ArgumentNotNull(context, "context");

            ITransitionResult <TState, TEvent> result = TransitionResult <TState, TEvent> .NotFired;

            var transitionsForEvent = this.transitions[context.EventId.Value];

            if (transitionsForEvent != null)
            {
                foreach (ITransition <TState, TEvent> transition in transitionsForEvent)
                {
                    result = transition.Fire(context);
                    if (result.Fired)
                    {
                        return(result);
                    }
                }
            }

            if (this.SuperState != null)
            {
                result = this.SuperState.Fire(context);
            }

            return(result);
        }
Пример #3
0
        public void ReturnsNotFiredTransitionResult_WhenGuardIsNotMet()
        {
            var guard = Builder <States, Events> .CreateGuardHolder().ReturningFalse().Build();

            this.Testee.Guard = guard;

            ITransitionResult <States, Events> result = this.Testee.Fire(this.TransitionContext);

            result.Should().BeNotFiredTransitionResult <States, Events>();
        }
        public static void BeNotFiredTransitionResult <TStates, TEvents>(this ObjectAssertions assertions)
            where TStates : IComparable
            where TEvents : IComparable
        {
            ITransitionResult <TStates, TEvents> transitionResult = (ITransitionResult <TStates, TEvents>)assertions.Subject;

            Execute.Assertion
            .ForCondition(!transitionResult.Fired)
            .FailWith("expected not fired transition result.");
        }
        public static void BeSuccessfulTransitionResultWithNewState <TStates, TEvents>(this ObjectAssertions assertions, IState <TStates, TEvents> expectedNewState)
            where TStates : IComparable
            where TEvents : IComparable
        {
            ITransitionResult <TStates, TEvents> transitionResult = (ITransitionResult <TStates, TEvents>)assertions.Subject;

            Execute.Assertion
            .ForCondition(transitionResult.Fired)
            .FailWith("expected successful (fired) transition result.");

            Execute.Assertion
            .ForCondition(transitionResult.NewState.Id.CompareTo(expectedNewState.Id) == 0)
            .FailWith("expected transition result with new state = `" + expectedNewState.Id + "`, but found `" + transitionResult.NewState.Id + "`.");
        }
Пример #6
0
        public void NotifiesExtensions_WhenGuardIsNotMet()
        {
            var extension = A.Fake <IExtension <States, Events> >();

            this.ExtensionHost.Extension = extension;

            IGuardHolder guard = Builder <States, Events> .CreateGuardHolder().ReturningFalse().Build();

            this.Testee.Guard = guard;

            ITransitionResult <States, Events> result = this.Testee.Fire(this.TransitionContext);

            A.CallTo(() => extension.SkippedTransition(
                         this.StateMachineInformation,
                         A <ITransition <States, Events> > .That.Matches(t => t.Source == this.Source && t.Target == this.Target),
                         this.TransitionContext)).MustHaveHappened();
        }
Пример #7
0
        protected void SetCookies(HttpResponse httpResponse, ITransitionResult result)
        {
            if (!(result is StateResult))
            {
                return;
            }

            var cookies = ((StateResult)result).Cookies;

            foreach (var cookie in cookies)
            {
                if (!cookie.Remove)
                {
                    httpResponse.Cookies.Append(cookie.Name, cookie.Value, cookie.Options);
                }
                else
                {
                    httpResponse.Cookies.Delete(cookie.Name, cookie.Options);
                }
            }
        }
Пример #8
0
        /// <summary>
        /// Fires the specified event.
        /// </summary>
        /// <param name="eventId">The event.</param>
        /// <param name="eventArgument">The event argument.</param>
        public void Fire(TEvent eventId, object eventArgument)
        {
            this.CheckThatStateMachineIsInitialized();
            this.CheckThatStateMachineHasEnteredInitialState();

            this.extensions.ForEach(extension => extension.FiringEvent(this, ref eventId, ref eventArgument));

            ITransitionContext <TState, TEvent> context = this.factory.CreateTransitionContext(this.CurrentState, new Missable <TEvent>(eventId), eventArgument, this);
            ITransitionResult <TState, TEvent>  result  = this.CurrentState.Fire(context);

            if (!result.Fired)
            {
                this.OnTransitionDeclined(context);
                return;
            }

            this.CurrentState = result.NewState;

            this.extensions.ForEach(extension => extension.FiredEvent(this, context));

            this.OnTransitionCompleted(context);
        }
Пример #9
0
        public void ReturnsFiredTransitionResult()
        {
            ITransitionResult <States, Events> result = this.Testee.Fire(this.TransitionContext);

            result.Fired.Should().BeTrue();
        }
        public void ReturnsSuccessfulTransitionResult()
        {
            ITransitionResult <States, Events> result = this.Testee.Fire(this.TransitionContext);

            result.Should().BeSuccessfulTransitionResultWithNewState(this.Target);
        }
Пример #11
0
        public async Task ReturnsNotFiredTransitionResult()
        {
            ITransitionResult <States, Events> result = await this.Testee.Fire(this.TransitionContext);

            result.Fired.Should().BeFalse();
        }