public void ReturnsUpdatedGameUsingFactory()
        {
            var sourceNameRule = ConstantRulesFactory.CreateConstantRule <string>("some fancy name");
            var nameChangeRule = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(g => g.Name, sourceNameRule);

            var sourceRankRule    = ConstantRulesFactory.CreateConstantRule <int>("1000");
            var rankingChangeRule = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(g => g.Ranking, sourceRankRule);

            var sourceDescRule        = ConstantRulesFactory.CreateConstantRule <string>("some cool description");
            var descriptionChangeRule = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(g => g.Description, sourceDescRule);

            var selfReturnRule = new SelfReturnRule <Game>();

            var subRules = new List <Rule>
            {
                nameChangeRule,
                rankingChangeRule,
                descriptionChangeRule,
                selfReturnRule
            };

            var blockRule = BlockRulesFactory.CreateFuncBlockRule <Game, Game>(subRules);

            var compileResult = blockRule.Compile();

            compileResult.Should().BeTrue();

            var game = blockRule.Execute(new Game());

            game.Name.Should().Be("some fancy name");
            game.Ranking.Should().Be(1000);
            game.Description.Should().Be("some cool description");
            _testOutputHelper.WriteLine($"{game}");
        }
        public void EmptyBlockRuleThrowsExceptionUsingFactory()
        {
            var emptyBlockRule = BlockRulesFactory.CreateFuncBlockRule <object, object>();
            var exception      = Assert.Throws <RuleEngineException>(() => emptyBlockRule.Compile());

            exception.Message.Should().Be("last rule must return a value of System.Object");
        }
        public void ExceptionWhenLastRuleReturnsNoValueUsingFactory()
        {
            var someRule      = new ConditionalIfThActionRule <object>();
            var someBlockRule = BlockRulesFactory.CreateFuncBlockRule <object, object>(new List <Rule> {
                someRule
            });
            var exception = Assert.Throws <RuleEngineException>(() => someBlockRule.Compile());

            exception.Message.Should().Be("last rule must return a value of System.Object");
        }
        public void ReturnsNewOrUpdatedGameUsingFactory()
        {
            var nullGame          = ConstantRulesFactory.CreateConstantRule <Game>("null");
            var nullGameCheckRule =
                ValidationRulesFactory.CreateValidationRule <Game>(LogicalOperatorAtTheRootLevel.Equal, nullGame);

            var newGameRule = MethodCallRulesFactory.CreateStaticMethodCallRule <Game>("CreateGame", "ModelForUnitTests.Game", null);

            var selfReturnRule = SelfReturnRuleFactory.CreateSelfReturnRule <Game>();
            var gameObjectRule = ConditionalRulesFactory.CreateConditionalFuncRule <Game, Game>(nullGameCheckRule, newGameRule,
                                                                                                selfReturnRule);

            var assignRule = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(gameObjectRule);

            var nameConstRule         = ConstantRulesFactory.CreateConstantRule <string>("some fancy name");
            var nameChangeRule        = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(g => g.Name, nameConstRule);
            var rankConstRule         = ConstantRulesFactory.CreateConstantRule <int>("1000");
            var rankingChangeRule     = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(g => g.Ranking, rankConstRule);
            var descConstRule         = ConstantRulesFactory.CreateConstantRule <string>("some cool description");
            var descriptionChangeRule = UpdateValueRulesFactory.CreateUpdateValueRule <Game>(g => g.Description, descConstRule);

            IList <Rule> rules = new List <Rule>
            {
                assignRule,
                nameChangeRule,
                rankingChangeRule,
                descriptionChangeRule,
                selfReturnRule
            };
            var blockRule = BlockRulesFactory.CreateFuncBlockRule <Game, Game>(rules);

            var compileResult = blockRule.Compile();

            compileResult.Should().BeTrue();

            var game = blockRule.Execute(null);

            game.Name.Should().Be("some fancy name");
            game.Ranking.Should().Be(1000);
            game.Description.Should().Be("some cool description");
            game.Rating.Should().BeNullOrEmpty();
            _testOutputHelper.WriteLine($"{game}");

            var newGame = new Game {
                Rating = "high"
            };

            // newGame is not same as game object
            ReferenceEquals(game, newGame).Should().BeFalse();
            game = blockRule.Execute(newGame);
            // this call shall return the same newGame object with updated values
            ReferenceEquals(game, newGame).Should().BeTrue();
            game.Rating.Should().Be("high");
            _testOutputHelper.WriteLine($"newGame: {game}");
        }
        public void FuncBlockRuleReturnsLastRuleResultUsingFactory()
        {
            var ruleReturning5 = ConstantRulesFactory.CreateConstantRule <int, int>("5");
            var blockRule      = BlockRulesFactory.CreateFuncBlockRule <int, int>(new List <Rule> {
                ruleReturning5
            });
            var compileResult = blockRule.Compile();

            compileResult.Should().BeTrue();

            var five = blockRule.Execute(99);

            five.Should().Be(5);
        }