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); }