Beispiel #1
0
        public void EnterInitialState()
        {
            const States InitialState = States.A;

            var information    = A.Fake <IStateMachineInformation <States, Events> >();
            var extension      = A.Fake <IExtension <States, Events> >();
            var stateContainer = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);

            var stateDefinitionsBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionsBuilder.In(InitialState);
            var stateDefinitions = stateDefinitionsBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.EnterInitialState(stateContainer, information, stateDefinitions, InitialState);

            A.CallTo(() => extension.EnteringInitialState(information, InitialState))
            .MustHaveHappened();

            A.CallTo(() => extension.EnteredInitialState(
                         information,
                         InitialState,
                         A <ITransitionContext <States, Events> > .That.Matches(context => context.StateDefinition == null)))
            .MustHaveHappened();
        }
Beispiel #2
0
        public void EntryActionException()
        {
            var exception = new Exception();

            var extension      = A.Fake <IExtension <States, Events> >();
            var stateContainer = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);

            var stateDefinitionBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionBuilder
            .In(States.A)
            .On(Events.B)
            .Goto(States.B);
            stateDefinitionBuilder
            .In(States.B)
            .ExecuteOnEntry(() => throw exception);
            var stateDefinitions = stateDefinitionBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.TransitionExceptionThrown += (s, e) => { };

            testee.EnterInitialState(stateContainer, stateContainer, stateDefinitions, States.A);

            testee.Fire(Events.B, stateContainer, stateContainer, stateDefinitions);

            A.CallTo(() => extension.HandlingEntryActionException(
                         stateContainer,
                         State(States.B),
                         Context(States.A, Events.B),
                         ref exception))
            .MustHaveHappened();

            A.CallTo(() => extension.HandledEntryActionException(
                         stateContainer,
                         State(States.B),
                         Context(States.A, Events.B),
                         exception))
            .MustHaveHappened();
        }
Beispiel #3
0
        public void NotifiesAboutTransitions()
        {
            const States Source = States.A;
            const States Target = States.B;
            const Events Event  = Events.B;

            var extension      = A.Fake <IExtension <States, Events> >();
            var stateContainer = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);

            var stateDefinitionBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionBuilder
            .In(Source)
            .On(Event).Goto(Target);
            var stateDefinitions = stateDefinitionBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.EnterInitialState(stateContainer, stateContainer, stateDefinitions, States.A);

            testee.Fire(Event, stateContainer, stateContainer, stateDefinitions);

            A.CallTo(() => extension.ExecutingTransition(
                         stateContainer,
                         A <ITransitionDefinition <States, Events> > .That.Matches(
                             t => t.Source.Id == Source && t.Target.Id == Target),
                         A <ITransitionContext <States, Events> > .That.Matches(
                             c => c.EventId.Value == Event && c.StateDefinition.Id == Source)))
            .MustHaveHappened();

            A.CallTo(() => extension.ExecutedTransition(
                         stateContainer,
                         A <ITransitionDefinition <States, Events> > .That.Matches(
                             t => t.Source.Id == Source && t.Target.Id == Target),
                         A <ITransitionContext <States, Events> > .That.Matches(
                             c => c.EventId.Value == Event && c.StateDefinition.Id == Source)))
            .MustHaveHappened();
        }
Beispiel #4
0
        public void OverrideEntryActionException()
        {
            var exception           = new Exception();
            var overriddenException = new Exception();

            var extension         = A.Fake <IExtensionInternal <States, Events> >();
            var overrideExtension = new OverrideExtension();
            var stateContainer    = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);
            stateContainer.Extensions.Add(overrideExtension);

            var stateDefinitionBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionBuilder
            .In(States.A)
            .On(Events.B)
            .Goto(States.B);
            stateDefinitionBuilder
            .In(States.B)
            .ExecuteOnEntry(() => throw exception);
            var stateDefinitions = stateDefinitionBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.TransitionExceptionThrown += (s, e) => { };

            testee.EnterInitialState(stateContainer, stateDefinitions, States.A);

            overrideExtension.OverriddenException = overriddenException;

            testee.Fire(Events.B, stateContainer, stateContainer, stateDefinitions);

            A.CallTo(() => extension.HandledEntryActionException(
                         A <IStateDefinition <States, Events> > ._,
                         A <ITransitionContext <States, Events> > ._,
                         overriddenException))
            .MustHaveHappened();
        }
Beispiel #5
0
        public void Fire()
        {
            var extension      = A.Fake <IExtension <States, Events> >();
            var stateContainer = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);

            var stateDefinitionsBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionsBuilder
            .In(States.A)
            .On(Events.B)
            .Goto(States.B);
            var stateDefinitions = stateDefinitionsBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.EnterInitialState(stateContainer, stateContainer, stateDefinitions, States.A);

            var eventId       = Events.B;
            var eventArgument = new object();

            testee.Fire(eventId, eventArgument, stateContainer, stateContainer, stateDefinitions);

            A.CallTo(() => extension.FiringEvent(stateContainer, ref eventId, ref eventArgument))
            .MustHaveHappened();

            A.CallTo(() => extension.FiredEvent(
                         stateContainer,
                         A <ITransitionContext <States, Events> > .That.Matches(
                             context =>
                             context.StateDefinition.Id == States.A &&
                             context.EventId.Value == eventId &&
                             context.EventArgument == eventArgument)))
            .MustHaveHappened();
        }
Beispiel #6
0
        public void EntryActionExceptionDuringInitialization()
        {
            var exception = new Exception();

            var extension      = A.Fake <IExtension <States, Events> >();
            var stateContainer = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);

            var stateDefinitionBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionBuilder
            .In(States.A)
            .ExecuteOnEntry(() => throw exception);
            var stateDefinitions = stateDefinitionBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.TransitionExceptionThrown += (s, e) => { };

            testee.EnterInitialState(stateContainer, stateContainer, stateDefinitions, States.A);

            A.CallTo(() => extension.HandlingEntryActionException(
                         stateContainer,
                         State(States.A),
                         A <ITransitionContext <States, Events> > .That.Matches(context => context.StateDefinition == null),
                         ref exception))
            .MustHaveHappened();

            A.CallTo(() => extension.HandledEntryActionException(
                         stateContainer,
                         State(States.A),
                         A <ITransitionContext <States, Events> > .That.Matches(context => context.StateDefinition == null),
                         exception))
            .MustHaveHappened();
        }
Beispiel #7
0
        public void OverrideFiredEvent()
        {
            var extension         = A.Fake <IExtension <States, Events> >();
            var overrideExtension = new OverrideExtension();
            var stateContainer    = new StateContainer <States, Events>();

            stateContainer.Extensions.Add(extension);
            stateContainer.Extensions.Add(overrideExtension);

            var stateDefinitionsBuilder = new StateDefinitionsBuilder <States, Events>();

            stateDefinitionsBuilder
            .In(States.A)
            .On(Events.B).Goto(States.C)
            .On(Events.C).Goto(States.C);
            var stateDefinitions = stateDefinitionsBuilder.Build();

            var testee = new StateMachineBuilder <States, Events>()
                         .WithStateContainer(stateContainer)
                         .Build();

            testee.EnterInitialState(stateContainer, stateContainer, stateDefinitions, States.A);

            const Events NewEvent         = Events.C;
            var          newEventArgument = new object();

            overrideExtension.OverriddenEvent         = NewEvent;
            overrideExtension.OverriddenEventArgument = newEventArgument;

            testee.Fire(Events.B, stateContainer, stateContainer, stateDefinitions);

            A.CallTo(() => extension.FiredEvent(
                         stateContainer,
                         A <ITransitionContext <States, Events> > .That.Matches(
                             c => c.EventId.Value == NewEvent && c.EventArgument == newEventArgument)))
            .MustHaveHappened();
        }