Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        public void Matches()
        {
            var rule   = new TrueRule();
            var result = rule.Matches(null, null);

            Assert.AreEqual(true, result);
        }
Exemplo n.º 3
0
 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");
 }
Exemplo n.º 4
0
 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");
 }
Exemplo n.º 5
0
 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");
 } 
Exemplo n.º 6
0
        public void GetValidationResults_IRule_Returns_One_Validation_Result()
        {
            var rule = new TrueRule().IfValidThenValidate
                       (
                new TrueRule(), new FalseRule1(), new TrueRule()
                       );

            rule.GetValidationResults().Count().ShouldBe(1);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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>();
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        public void Three_Rule_Chain_Executes_Successfully()
        {
            var rule = new TrueRule()
                            .IfValidThenValidate(new TrueRule()
                                                      .IfValidThenValidate(new TrueRule())).Validate();

            rule.IsValid.ShouldBe(true);
        }
Exemplo n.º 12
0
 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");
 }
Exemplo n.º 13
0
 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");
 }
Exemplo n.º 14
0
 public void Valid_Rule_Is_Valid_After_Validation()
 {
     var rule = new TrueRule().Validate();
     rule.IsValid.ShouldBe(true);
 }
Exemplo n.º 15
0
 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");
 }
Exemplo n.º 16
0
 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");
 }
Exemplo n.º 17
0
 public void Valid_Rule_Does_Not_Contain_An_Error_Message_After_Validation()
 {
     var rule = new TrueRule().Validate();
     rule.ErrorMessage.ShouldBe(null);
 }
Exemplo n.º 18
0
 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");
 }
Exemplo n.º 19
0
 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");
 }