public void AndOrTests()
        {
            var isHeavyOrExpensive = UserDefinedExpression <SalesOrderHeader, bool> .Create("TotalDue > 1000 || Freight > 1000");

            var isHeavyAndExpensive = UserDefinedExpression <SalesOrderHeader, bool> .Create("TotalDue > 1000 && Freight > 1000");

            var order1 = new SalesOrderHeader()
            {
                TotalDue = 1200, Freight = 700
            };
            var order2 = new SalesOrderHeader()
            {
                TotalDue = 800, Freight = 1300
            };
            var order3 = new SalesOrderHeader()
            {
                TotalDue = 800, Freight = 700
            };
            var order4 = new SalesOrderHeader()
            {
                TotalDue = 1200, Freight = 1300
            };

            Assert.IsTrue(isHeavyOrExpensive.Invoke(order1));
            Assert.IsTrue(isHeavyOrExpensive.Invoke(order2));
            Assert.IsFalse(isHeavyOrExpensive.Invoke(order3));
            Assert.IsTrue(isHeavyOrExpensive.Invoke(order4));

            Assert.IsFalse(isHeavyAndExpensive.Invoke(order1));
            Assert.IsFalse(isHeavyAndExpensive.Invoke(order2));
            Assert.IsFalse(isHeavyAndExpensive.Invoke(order3));
            Assert.IsTrue(isHeavyAndExpensive.Invoke(order4));
        }
 public void UnsafeScopeTest()
 {
     Assert.Throws <UnsafeExpressionException>(() =>
     {
         var unsafeExpression = UserDefinedExpression <SalesOrderHeader, bool> .Create("Customer.PersonId != null");
         bool result          = unsafeExpression.Invoke(order);
     });
 }
 public void SafeScopeTest()
 {
     Assert.DoesNotThrow(() =>
     {
         var safeExpression = UserDefinedExpression <SalesOrderHeader, bool> .Create("Customer != null && DueDate >= DateTime.Today");
         bool result        = safeExpression.Invoke(order);
     });
 }
 public void UnsafeScopeTestAllowance()
 {
     Assert.DoesNotThrow(() =>
     {
         TypesValidator.Defaults.AddAllowedType(typeof(Customer));
         var unsafeExpression = UserDefinedExpression <SalesOrderHeader, bool> .Create("Customer.PersonId != null");
         bool result          = unsafeExpression.Invoke(order);
     });
 }
        public void UnsafeExpressionsShouldPass(string unsafeExpression, Func <IUserDefinedExpression, ISafetyValidator> validatorFactory)
        {
            var order1 = new SalesOrderHeader()
            {
                DueDate = DateTime.Today.AddDays(-1)
            };

            UserDefinedExpression.DefaultSafetyValidatorFactory = validatorFactory;
            Assert.DoesNotThrow(() =>
            {
                var unsafeUDE = UserDefinedExpression <SalesOrderHeader, bool> .Create(unsafeExpression);
                bool result   = unsafeUDE.Invoke(order1);
            });
        }
        public void ComplexExpressionTest()
        {
            var creditInfo = new CreditInfo()
            {
                HardInquiries = new List <DateTime>()
                {
                    new DateTime(2020, 12, 12),
                    new DateTime(2019, 05, 06),
                    new DateTime(2017, 03, 03)
                },
                Accounts = new List <CreditAccount>()
                {
                    new CreditAccount()
                    {
                        TotalCredit = 10000, UsedCredit = 3000
                    },
                    new CreditAccount()
                    {
                        TotalCredit = 5000, UsedCredit = 300
                    }
                }
            };

            //creditInfo.HardInquiries.Count(h => h.Date > DateTime.Today.AddDays(-300)) > 1;
            //creditInfo.Accounts.Sum(a => a.UsedCredit) / creditInfo.Accounts.Sum(a => a.TotalCredit);

            // The input model (CreditInfo) is automatically added to white-list, but other non-primitive types should be explicitly added
            SafetyValidators.TypesValidator.Defaults.AddAllowedType(typeof(CreditAccount));


            // Past 2 years
            var recentHardInquiriesFormula = UserDefinedExpression <CreditInfo, int>
                                             .Create("HardInquiries.Count(h => h.Date > DateTime.Today.AddYears(-2))");

            var creditUsageFormula = UserDefinedExpression <CreditInfo, decimal>
                                     .Create("Accounts.Sum(a => a.UsedCredit) / Accounts.Sum(a => a.TotalCredit)");


            var recentHardInquiries = recentHardInquiriesFormula.Invoke(creditInfo);

            Assert.AreEqual(2, recentHardInquiries);
            var creditUsage = creditUsageFormula.Invoke(creditInfo);

            Assert.AreEqual(0.22, creditUsage);
        }
        public void SinglePropertyTest()
        {
            var isOrderPastDueFormula = UserDefinedExpression <SalesOrderHeader, bool> .Create("DueDate < DateTime.Today");

            var order1 = new SalesOrderHeader()
            {
                DueDate = DateTime.Today.AddDays(-1)
            };
            var order2 = new SalesOrderHeader()
            {
                DueDate = DateTime.Today.AddDays(1)
            };

            bool isOrderPastDue1 = isOrderPastDueFormula.Invoke(order1);
            bool isOrderPastDue2 = isOrderPastDueFormula.Invoke(order2);

            Assert.IsTrue(isOrderPastDue1);
            Assert.IsFalse(isOrderPastDue2);
        }
 public void UnsafeExpressionsShouldThrow(string unsafeExpression, Func <IUserDefinedExpression, ISafetyValidator> validatorFactory)
 {
     UserDefinedExpression.DefaultSafetyValidatorFactory = validatorFactory;
     Assert.Throws <UnsafeExpressionException>(() => UserDefinedExpression <SalesOrderHeader, bool> .Create(unsafeExpression));
 }