public void TuplesBasicOperatorTest()
        {
            // rule DTO  #1
            var car = new CarDTO
            {
                Make = "Ford",
                Year = 2010,
                Model = "Expedition",
                AskingPrice = 10000.0000m,
                SellingPrice = 9000.0000m
            };

            // rule DTO  #2
            var salesperson = new SalesPersonDTO
            {
                State = "PA",
                IsManager = true,
                MaximumDiscount = 1000.0000m
            };

            // programatic mix in of claims rule and rule against the DTO user
            var carRule1 = new Rule("Year", "2010", "GreaterThanOrEqual","CarDTO");
            var salePersonRule1 = new Rule("State", "PA", "Equals", "SalesPersonDTO");
            var salePersonRule2 = new Rule("IsManager", "true", "Equals", "SalesPersonDTO");
            var re = new TupleRuleEngine();

            // Compile the rules as a seperate step
            Expression<Func<CarDTO, SalesPersonDTO, bool>> carRule1Expression = re.GetExpression<CarDTO, SalesPersonDTO>(carRule1);
            Expression<Func<CarDTO, SalesPersonDTO, bool>> salePersonRuleExpression1 = re.GetExpression<CarDTO, SalesPersonDTO>(salePersonRule1);
            Expression<Func<CarDTO, SalesPersonDTO, bool>> salePersonRuleExpression2 = re.GetExpression<CarDTO, SalesPersonDTO>(salePersonRule2);
            Expression<Func<CarDTO, SalesPersonDTO, bool>> compositeRule
                = carRule1Expression.Or(salePersonRuleExpression1).Or(salePersonRuleExpression2);

            Assert.AreEqual(true, compositeRule.Compile()(car, salesperson));
        }
        public void IdentityBasicOperatorTest()
        {
            // rule DTO
            var car = new CarDTO
            {
                Make = "Ford",
                Year = 2010,
                Model = "Expedition",
                AskingPrice = 10000.0000m,
                SellingPrice = 9000.0000m
            };

            // programatic mix in of claims rule and rule against the DTO user
            var carRule1 = new Rule("Year", "2010", "GreaterThanOrEqual");
            var claimRule = new Rule("@User", "S-1-5-21-2493390151-660934664-2262481224-513", "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid");
            var re = new IdentityRuleEngine();
            // Compile the rules as a seperate step
            Expression<Func<CarDTO, IClaimsPrincipal, bool>> carRule1Expression = re.GetExpression<CarDTO>(carRule1);
            Expression<Func<CarDTO, IClaimsPrincipal, bool>> claimRuleExpression = re.GetExpression<CarDTO>(claimRule);
            Expression<Func<CarDTO, IClaimsPrincipal, bool>> compositeRule = carRule1Expression.Or(claimRuleExpression);

            // invoke the rules as a third step
            IClaimsPrincipal id = new ClaimsPrincipal(System.Threading.Thread.CurrentPrincipal);
            Assert.AreEqual(true,compositeRule.Compile()(car,id));
        }
        public void BasicOperatorTest()
        {
            // rule DTO
            var car = new CarDTO
            {
                Make = "Ford",
                Year=2010,
                Model="Expedition",
                AskingPrice=10000.0000m,
                SellingPrice=9000.0000m
            };

            // build up some rules
            var carRule1 = new Rule("Year", "2010", "GreaterThanOrEqual");
            var carRule2 = new Rule("AskingPrice", "10000.0000", "LessThanOrEqual");
            var carRule3= new Rule("Make", "Ford", "Equals");
            var carRule4 = new Rule("Model", "Ex", "StartsWith");  //gets the excursion, explorer, expedition -gass guzzlers

            var re = new RuleEngine();

            // Compile the rules as a seperate step
            Func<CarDTO, bool> carRule1Compiled = re.Compile<CarDTO>(carRule1);
            Func<CarDTO, bool> carRule2Compiled = re.Compile<CarDTO>(carRule2);
            Func<CarDTO, bool> carRule3Compiled = re.Compile<CarDTO>(carRule3);
            Func<CarDTO, bool> carRule4Compiled = re.Compile<CarDTO>(carRule4);

            Assert.AreEqual(true,carRule1Compiled(car));
            Assert.AreEqual(true,carRule2Compiled(car));
            Assert.AreEqual(true,carRule3Compiled(car));
            Assert.AreEqual(true,carRule4Compiled(car));
        }
        public void IdentityTupleBasicOperatorTest()
        {
            // rule DTO
            var car = new CarDTO
            {
                Make = "Ford",
                Year = 2010,
                Model = "Expedition",
                AskingPrice = 10000.0000m,
                SellingPrice = 9000.0000m
            };

            var salesperson = new SalesPersonDTO
            {
                State = "PA",
                IsManager = true,
                MaximumDiscount = 1000.0000m
            };

            // programatic mix in of claims rule and rule against the DTO for Car and SalesPerson
            var carRule1 = new Rule("Year", "2010", "GreaterThanOrEqual","CarDTO");
            var claimRule = new Rule("@User", "S-1-5-21-2493390151-660934664-2262481224-513", "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid");
            var salePersonRule1 = new Rule("State", "PA", "Equals","SalesPersonDTO");
            var salePersonRule2 = new Rule("IsManager", "true", "Equals", "SalesPersonDTO");

            var re = new IdentityTupleRuleEngine();

            // build Some Expressions
            Expression<Func<CarDTO, SalesPersonDTO,IClaimsPrincipal, bool>> carRule1Expression = re.GetExpression<CarDTO,SalesPersonDTO>(carRule1);
            Expression<Func<CarDTO, SalesPersonDTO, IClaimsPrincipal, bool>> claimRuleExpression = re.GetExpression<CarDTO, SalesPersonDTO>(claimRule);
            Expression<Func<CarDTO, SalesPersonDTO, IClaimsPrincipal, bool>> sp1Expression = re.GetExpression<CarDTO, SalesPersonDTO>(salePersonRule1);
            Expression<Func<CarDTO, SalesPersonDTO, IClaimsPrincipal, bool>> sp2Expression = re.GetExpression<CarDTO, SalesPersonDTO>(salePersonRule2);

            Expression<Func<CarDTO, SalesPersonDTO, IClaimsPrincipal, bool>> coumpoundExpr =
                carRule1Expression.Or(claimRuleExpression).Or(sp1Expression).Or(sp2Expression);

            IClaimsPrincipal id = new ClaimsPrincipal(System.Threading.Thread.CurrentPrincipal);
            Assert.AreEqual(true, coumpoundExpr.Compile()(car,salesperson,id));
        }
        public void PredicatesTest()
        {
            // rule DTO
            var car = new CarDTO
            {
                Make = "Ford",
                Year = 2010,
                Model = "Expedition",
                AskingPrice = 10000.0000m,
                SellingPrice = 9000.0000m
            };

            // build up some rules
            var carRule1 = new Rule("Year", "2010", "GreaterThanOrEqual");
            var carRule2 = new Rule("AskingPrice", "10000.0000", "LessThanOrEqual");
            var carRule3 = new Rule("Make", "Ford", "Equals");
            var carRule4 = new Rule("Model", "Ex", "StartsWith");  //gets the excursion, explorer, expedition -gas guzzlers

            var re = new RuleEngine();

            // Compile the rules as a seperate step
            Expression<Func<CarDTO, bool>> carRule1Exp = re.GetExpression<CarDTO>(carRule1);
            Expression<Func<CarDTO, bool>> carRule2Exp = re.GetExpression<CarDTO>(carRule2);
            Expression<Func<CarDTO, bool>> carRule3Exp = re.GetExpression<CarDTO>(carRule3);
            Expression<Func<CarDTO, bool>> carRule4Exp = re.GetExpression<CarDTO>(carRule4);

            // join the rules with fluent syntax ala predicate builder
            Expression<Func<CarDTO, bool>> compundedRule = carRule1Exp.Or(carRule2Exp).Or(carRule3Exp).Or(carRule4Exp);
            Func<CarDTO, bool> compiledRule = compundedRule.Compile();
            Assert.AreEqual(true, compiledRule(car), "car");
        }
        public void StoreSomeRules()
        {
            // rule DTO
            var car = new CarDTO
            {
                Make = "Ford",
                Year = 2010,
                Model = "Expedition",
                AskingPrice = 10000.0000m,
                SellingPrice = 9000.0000m
            };

            // build up some rules
            var carRule1 = new Rule("Year", "2010", "GreaterThanOrEqual");

            var re = new RuleEngine();

            // Get the rule expressions
            Expression<Func<CarDTO, bool>> carRule1Exp =re.GetExpression<CarDTO>(carRule1);

            // Save a rule Expression to the the list
            re.LoadRule("carrule", carRule1Exp);
            Assert.AreEqual(true, (re.GetRule<CarDTO>("carrule").Compile()(car)),
                "This car is greater than or equal to year 2010 but failed to rule as such");
        }