public override Expression BuildExpression(params ParameterExpression[] parameters) { if (parameters == null || parameters.Length != 1 || parameters[0].Type != typeof(T)) { throw new RuleEngineException($"{nameof(BuildExpression)} must call with one parameter of {typeof(T)}"); } var conditionalExpression = ConditionRule.BuildExpression(parameters); if (!(conditionalExpression is LambdaExpression)) { conditionalExpression = Expression.Lambda(conditionalExpression, parameters); } var trueExpression = TrueRule.BuildExpression(parameters); if (!(trueExpression is LambdaExpression)) { trueExpression = Expression.Lambda(trueExpression, parameters); } var falseExpression = FalseRule.BuildExpression(parameters); if (!(falseExpression is LambdaExpression)) { falseExpression = Expression.Lambda(falseExpression, parameters); } ExpressionForThisRule = Expression.Condition(Expression.Invoke(conditionalExpression, parameters.Cast <Expression>()), Expression.Invoke(trueExpression, parameters.Cast <Expression>()), Expression.Invoke(falseExpression, parameters.Cast <Expression>())); return(ExpressionForThisRule); }
public void Matches() { var rule = new TrueRule(); var result = rule.Matches(null, null); Assert.AreEqual(true, result); }
public void All_Remaining_Successors_Skip_Validation_When_First_Successor_Fails() { var rule1 = new TrueRule() .IfValidThenValidate(new FalseRule1(), new FalseRule2(), new FalseRule3()) .Validate(); rule1.IsValid.ShouldBe(false); rule1.ErrorMessage.ShouldBe("FalseRule1 failed validation"); }
public void Last_Successor_Validates_When_First_Successors_Pass() { var rule1 = new TrueRule() .IfValidThenValidate(new TrueRule(), new TrueRule(), new FalseRule1()) .Validate(); rule1.IsValid.ShouldBe(false); rule1.ErrorMessage.ShouldBe("FalseRule1 failed validation"); }
public void Last_Successors_In_Successor_Chain_Are_Skipped_When_First_Successors_Fail() { var rule = new TrueRule() .IfValidThenValidate(new TrueRule(), new FalseRule1()) .IfValidThenValidate(new FalseRule2(), new FalseRule3()) .Validate(); rule.IsValid.ShouldBe(false); rule.ErrorMessage.ShouldBe("FalseRule1 failed validation"); }
public void GetValidationResults_IRule_Returns_One_Validation_Result() { var rule = new TrueRule().IfValidThenValidate ( new TrueRule(), new FalseRule1(), new TrueRule() ); rule.GetValidationResults().Count().ShouldBe(1); }
public async Task GetValidationResultsAsync_IRule_Returns_One_Validation_Result() { var rule = new TrueRule().IfValidThenValidate ( new TrueRule(), new FalseRule1(), new TrueRule() ); var results = await rule.GetValidationResultsAsync(); results.Count().ShouldBe(1); }
public async Task ValidateAsync_Of_T_IRule_Returns_One_Validation_Result() { var rule = new TrueRule().IfValidThenValidate ( new TrueRule(), new FalseRule1(), new TrueRule() ); var results = await rule.ValidateAsync <CustomValidationResult>(); results.Count().ShouldBe(1); }
public void GetValidationResults_Of_T_IRule_Returns_One_Validation_Result() { var rule = new TrueRule().IfValidThenValidate ( new TrueRule(), new FalseRule1(), new TrueRule() ); var results = rule.GetValidationResults <CustomValidationResult>(); results.Count().ShouldBe(1); results.First().ShouldBeOfType <CustomValidationResult>(); }
public override Expression BuildExpression(params ParameterExpression[] parameters) { if (parameters == null || parameters.Length != 1 || parameters[0].Type != typeof(T1)) { throw new RuleEngineException($"{nameof(BuildExpression)} must call with one parameter of {typeof(T1)}"); } var returnLabel = Expression.Label(typeof(T2), "returnLabel"); var conditionalExpression = ConditionRule.BuildExpression(parameters); if (!(conditionalExpression is LambdaExpression)) { conditionalExpression = Expression.Lambda(conditionalExpression, parameters); } var trueExpression = TrueRule.BuildExpression(parameters); if (!(trueExpression is LambdaExpression)) { trueExpression = Expression.Lambda(trueExpression, parameters); } var falseExpression = FalseRule.BuildExpression(parameters); if (!(falseExpression is LambdaExpression)) { falseExpression = Expression.Lambda(falseExpression, parameters); } var ifThenElseExpression = Expression.IfThenElse( Expression.Invoke(conditionalExpression, parameters.Cast <Expression>()), Expression.Return(returnLabel, Expression.Invoke(trueExpression, parameters.Cast <Expression>())), Expression.Return(returnLabel, Expression.Invoke(falseExpression, parameters.Cast <Expression>())) ); Debug.WriteLine($"ConditionRule:{Environment.NewLine}{ConditionRule.ExpressionDebugView()}"); Debug.WriteLine($"TrueRule:{Environment.NewLine}{TrueRule.ExpressionDebugView()}"); Debug.WriteLine($"FalseRule:{Environment.NewLine}{FalseRule.ExpressionDebugView()}"); var defaultForReturnLabel = Expression.Convert(Expression.Constant(default(T2)), typeof(T2)); ExpressionForThisRule = Expression.Block(ifThenElseExpression, Expression.Label(returnLabel, defaultForReturnLabel)); return(ExpressionForThisRule); }
public void Three_Rule_Chain_Executes_Successfully() { var rule = new TrueRule() .IfValidThenValidate(new TrueRule() .IfValidThenValidate(new TrueRule())).Validate(); rule.IsValid.ShouldBe(true); }
public void Valid_Parent_Fails_When_Successor_Fails_Validation() { var rule1 = new TrueRule().IfValidThenValidate(new FalseRule1()).Validate(); rule1.IsValid.ShouldBe(false); rule1.ErrorMessage.ShouldBe("FalseRule1 failed validation"); }
public void Three_Rule_Chain_Fail_Skips_Third_In_Chain_When_Second_Fails() { var rule = new TrueRule() .IfValidThenValidate(new FalseRule1() .IfValidThenValidate(new FalseRule2())).Validate(); rule.IsValid.ShouldBe(false); rule.ErrorMessage.ShouldBe("FalseRule1 failed validation"); }
public void Valid_Rule_Is_Valid_After_Validation() { var rule = new TrueRule().Validate(); rule.IsValid.ShouldBe(true); }
public void Three_Rule_Chain_Hits_Third_In_Chain_And_Fails_Parent() { var rule = new TrueRule() .IfValidThenValidate(new TrueRule() .IfValidThenValidate(new FalseRule1())).Validate(); rule.IsValid.ShouldBe(false); rule.ErrorMessage.ShouldBe("FalseRule1 failed validation"); }
public void Parent_Fails_When_Last_Successor_In_Chains_Fails_Validation() { var rule = new TrueRule() .IfValidThenValidate(new TrueRule(), new TrueRule()) .IfValidThenValidate(new TrueRule(), new FalseRule3()) .Validate(); rule.IsValid.ShouldBe(false); rule.ErrorMessage.ShouldBe("FalseRule3 failed validation"); }
public void Valid_Rule_Does_Not_Contain_An_Error_Message_After_Validation() { var rule = new TrueRule().Validate(); rule.ErrorMessage.ShouldBe(null); }
public void Second_Invalid_Rule_In_Second_Successor_Chain_Should_Execute() { var output = string.Empty; var rule = new TrueRule() .IfValidThenValidate(new TrueRule(), new TrueRule()) .IfValidThenValidate(new TrueRule(), new FalseRule3().IfInvalidThenExecute(r => output = "pass")) .Validate(); output.ShouldBe("pass"); }
public void First_Valid_Rule_In_Second_Successor_Chain_Should_Execute_But_Third_False_Rule_Should_Not() { var output = string.Empty; var output2 = string.Empty; var rule = new TrueRule() .IfValidThenValidate(new TrueRule().IfValidThenExecute(r => output = "pass"), new TrueRule()) .IfValidThenValidate(new FalseRule2().IfValidThenExecute(r => output2 = "pass"), new FalseRule3()) .Validate(); output.ShouldBe("pass"); output2.ShouldBe(string.Empty); rule.ErrorMessage.ShouldBe("FalseRule2 failed validation"); }