public void Execute_doesnt_change_state_if_condition_not_met()
        {
            const SaleState startState = SaleState.Open;
            const SaleState endState   = SaleState.Complete;
            var             sale       = new Sale(saleID: 66)
            {
                State = startState
            };

            var sut = new StateTransitionAutoForwardParameterized <Sale, SaleState, SaleEvent, string>(
                GetStateMachine()
                , endState
                , startState
                , condition: (_, stringParam) => false
                , name: "test"
                , priority: 1);

            var result = sut.Execute(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, request: "notUsed"),
                                     new StateTransitionResult <SaleState, SaleEvent>(SaleEvent.Pay
                                                                                      , startState
                                                                                      , startState
                                                                                      , startState
                                                                                      , "transactionName"));

            Assert.Equal(startState, sale.State);
            Assert.False(result.ConditionMet);
            Assert.False(result.WasTransitioned);
            Assert.True(result.TransitionDefined);
        }
        public void Execute_throws_ArgumentException_if_Request_is_wrong_type()
        {
            const SaleState startState = SaleState.Open;
            var             sale       = new Sale(saleID: 66)
            {
                State = startState
            };
            var sut = new StateTransitionAutoForwardParameterized <Sale, SaleState, SaleEvent, string>(
                GetStateMachine()
                , SaleState.Complete
                , SaleState.Open
                , condition: (_, stringParam) => true
                , name: "test"
                , priority: 1);

            var executionParams = new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, request: 1);

            Assert.Throws <ArgumentException>(() => sut.Execute(executionParams, GetDummyResult()));
        }
        public void Execute_changes_state_if_condition_met()
        {
            const SaleState startState = SaleState.Open;
            const SaleState endState   = SaleState.Complete;
            var             sale       = new Sale(saleID: 66)
            {
                State = startState
            };

            var sut = new StateTransitionAutoForwardParameterized <Sale, SaleState, SaleEvent, string>(
                GetStateMachine()
                , toState: endState
                , triggerState: startState
                , condition: (_, stringParam) => true
                , name: "test"
                , priority: 1);

            var result = sut.Execute(new ExecutionParameters <Sale, SaleEvent>(SaleEvent.Pay, sale, request: "notUsed"), GetDummyResult());

            Assert.True(result.WasTransitioned);
            Assert.Equal(endState, sale.State);
        }