public void TestUnrelatedParameters()
        {
            var masters = new List <ItemMaster>();
            Expression <Func <ItemMaster, bool> > exp = m => masters.Contains(m) && masters.Where(m2 => masters.Contains(m2)).Select(m3 => m3.id).Any();

            Assert.AreEqual("m => (value(...).masters.Contains(m) AndAlso value(...).masters.Where(m2 => value(...).masters.Contains(m2)).Select(m3 => m3.id).Any())", SimpleReport(exp));

            var rep = new ReplaceWithReference <ItemMaster, Item>(exp, "master", "item").NewExpression;

            Assert.AreEqual("item => (value(...).masters.Contains(item.master) AndAlso value(...).masters.Where(m2 => value(...).masters.Contains(m2)).Select(m3 => m3.id).Any())", SimpleReport(rep));
        }
        public void TestContains()
        {
            {
                var parents = new List <Parent>();
                Expression <Func <ItemMaster, bool> > exp = m => parents.Contains(m.parent);
                Assert.AreEqual("m => value(...).parents.Contains(m.parent)", SimpleReport(exp));

                var rep = new ReplaceWithReference <ItemMaster, Item>(exp, "master", "item").NewExpression;
                Assert.AreEqual("item => value(...).parents.Contains(item.master.parent)", SimpleReport(rep));
            }
        }
 public void OptimizedCopiedProperties()
 {
     {
         // Control:
         Expression <Func <OptimizeParent, bool> > exp = p => p.A2 > 1 && p.B2 > 2;
         var res = new ReplaceWithReference <OptimizeParent, OptimizeChild>(exp, "Parent", "c").NewExpression;
         Assert.AreEqual("c => ((c.Parent.A2 > 1) AndAlso (c.Parent.B2 > 2))", res.ToString());
     }
     {
         Expression <Func <OptimizeParent, bool> > exp = p => p.A2 > 1 && p.B2 > 2;
         var res = new ReplaceWithReference <OptimizeParent, OptimizeChild>(exp, "Parent", "c", new Tuple <string, string>[] { Tuple.Create("A1", "A2") }).NewExpression;
         Assert.AreEqual("c => ((c.A1 > 1) AndAlso (c.Parent.B2 > 2))", res.ToString());
     }
 }
        public void TestInvalid()
        {
            {
                Expression <Func <ItemMaster, bool> > exp = a => a.id > 5;
                TestUtility.ShouldFail(
                    () => { var rep = new ReplaceWithReference <ItemMaster, Item>(exp, "noreference", "item").NewExpression; },
                    "Item", "noreference");
            }

            {
                Expression <Func <ItemMaster, bool> > exp = a => a.id > 5;
                TestUtility.ShouldFail(
                    () => { var rep = new ReplaceWithReference <ItemMaster, Item>(exp, "invalid reference format", "item").NewExpression; },
                    "Item", "invalid reference format");
            }
        }
        public void TestInvalid()
        {
            {
                Expression<Func<ItemMaster, bool>> exp = a => a.id > 5;
                TestUtility.ShouldFail(
                    () => { var rep = new ReplaceWithReference<ItemMaster, Item>(exp, "noreference", "item").NewExpression; },
                    "Item", "noreference");
            }

            {
                Expression<Func<ItemMaster, bool>> exp = a => a.id > 5;
                TestUtility.ShouldFail(
                    () => { var rep = new ReplaceWithReference<ItemMaster, Item>(exp, "invalid reference format", "item").NewExpression; },
                    "Item", "invalid reference format");
            }
        }
        public void TestContainsWithoutMemberAccess()
        {
            {
                var masters = new List <ItemMaster>();
                Expression <Func <ItemMaster, bool> > exp = m => masters.Contains(m);
                Assert.AreEqual("m => value(...).masters.Contains(m)", SimpleReport(exp));

                var rep = new ReplaceWithReference <ItemMaster, Item>(exp, "master", "item").NewExpression;
                Assert.AreEqual("item => value(...).masters.Contains(item.master)", SimpleReport(rep));
            }
            {
                var masters = new List <ItemMaster>().AsQueryable();
                Expression <Func <ItemMaster, bool> > exp = m => masters.Contains(m);
                Assert.AreEqual("m => value(...).masters.Contains(m)", SimpleReport(exp));

                var rep = new ReplaceWithReference <ItemMaster, Item>(exp, "master", "item").NewExpression;
                Assert.AreEqual("item => value(...).masters.Contains(item.master)", SimpleReport(rep));
            }
        }
Esempio n. 7
0
        public void TestTrivial()
        {
            {
                Expression <Func <ItemMaster, bool> > expTrue = a => true;
                var rep = new ReplaceWithReference <ItemMaster, Item>(expTrue, "master", "item").NewExpression;
                Assert.AreEqual("item => True", rep.ToString());
                Assert.AreEqual(typeof(Item), rep.Parameters.Single().Type);
            }

            {
                Expression <Func <ItemMaster, bool> > expFalse = b => false;
                var rep = new ReplaceWithReference <ItemMaster, Item>(expFalse, "master", "b").NewExpression;
                Assert.AreEqual("b => False", rep.ToString());
            }
            {
                Expression <Func <ItemMaster, bool> > expTaut = bliblo => bliblo == bliblo;
                var rep = new ReplaceWithReference <ItemMaster, Item>(expTaut, "master", "item").NewExpression;
                Assert.AreEqual("item => (item == item)", rep.ToString());
            }
        }
        public void TestTrivial()
        {
            {
                Expression<Func<ItemMaster, bool>> expTrue = a => true;
                var rep = new ReplaceWithReference<ItemMaster, Item>(expTrue, "master", "item").NewExpression;
                Assert.AreEqual("item => True", rep.ToString());
                Assert.AreEqual(typeof(Item), rep.Parameters.Single().Type);
            }

            {
                Expression<Func<ItemMaster, bool>> expFalse = b => false;
                var rep = new ReplaceWithReference<ItemMaster, Item>(expFalse, "master", "b").NewExpression; 
                Assert.AreEqual("b => False", rep.ToString());
            }
            {
                Expression<Func<ItemMaster, bool>> expTaut = bliblo => bliblo == bliblo;
                var rep = new ReplaceWithReference<ItemMaster, Item>(expTaut, "master", "item").NewExpression;
                Assert.AreEqual("item => (item == item)", rep.ToString());
            }
        }
        public void OptimizedExtension()
        {
            {
                // Control:
                Expression <Func <OptimizeBase, bool> > exp = p => p.A > 1 && p.Extension1.B > 2 && p.Extension1.Extension2.C > 3;

                var res = new ReplaceWithReference <OptimizeBase, OptimizeExtension1>(exp, "Base", "ext1").NewExpression;
                Assert.AreEqual("ext1 => (((ext1.Base.A > 1) AndAlso (ext1.Base.Extension1.B > 2)) AndAlso (ext1.Base.Extension1.Extension2.C > 3))", res.ToString());

                var res2 = new ReplaceWithReference <OptimizeExtension1, OptimizeExtension2>(res, "Base", "ext2").NewExpression;
                Assert.AreEqual("ext2 => (((ext2.Base.Base.A > 1) AndAlso (ext2.Base.Base.Extension1.B > 2)) AndAlso (ext2.Base.Base.Extension1.Extension2.C > 3))", res2.ToString());
            }
            {
                // Test:
                Expression <Func <OptimizeBase, bool> > exp = p => p.A > 1 && p.Extension1.B > 2 && p.Extension1.Extension2.C > 3;

                var res = new ReplaceWithReference <OptimizeBase, OptimizeExtension1>(exp, "Base", "ext1", null, "Extension1").NewExpression;
                Assert.AreEqual("ext1 => (((ext1.Base.A > 1) AndAlso (ext1.B > 2)) AndAlso (ext1.Extension2.C > 3))", res.ToString());

                var res2 = new ReplaceWithReference <OptimizeExtension1, OptimizeExtension2>(res, "Base", "ext2", null, "Extension2").NewExpression;
                Assert.AreEqual("ext2 => (((ext2.Base.Base.A > 1) AndAlso (ext2.Base.B > 2)) AndAlso (ext2.C > 3))", res2.ToString());
            }
        }
        public void TestNonTrivial()
        {
            {
                Expression<Func<ItemMaster, bool>> exp = a => a.id > 5 && a.id < 10;
                var res = new ReplaceWithReference<ItemMaster, Item>(exp, "master", "item").NewExpression;
                Assert.AreEqual("item => ((item.master.id > 5) AndAlso (item.master.id < 10))", res.ToString());
            }
            
            {
                Expression<Func<ItemMaster, bool>> exp = a => int.Equals(0, a.id + a.id * Math.Abs(a.id - 2 * a.id));
                var res = new ReplaceWithReference<ItemMaster, Item>(exp, "master", "b").NewExpression;
                Assert.AreEqual("b => Equals(Convert(0), Convert((b.master.id + (b.master.id * Abs((b.master.id - (2 * b.master.id)))))))", res.ToString());

                // lets try to execute it
                ItemMaster master = new ItemMaster() { id = 5 };
                Item item = new Item() { master = master };
                var func = res.Compile();
                Assert.AreEqual(false, func(item));
            }

            // parameter same name as member with double nested reference
            {
                Expression<Func<ItemMaster, bool>> exp = parent => parent.parent.id != Guid.Empty && parent.id > 0;
                var res = new ReplaceWithReference<ItemMaster, Item>(exp, "master", "master").NewExpression;
                Assert.AreEqual("master => ((master.master.parent.id != Guid.Empty) AndAlso (master.master.id > 0))", res.ToString());
            }
        }
Esempio n. 11
0
 public void OptimizedCopiedProperties()
 {
     {
         // Control:
         Expression<Func<OptimizeParent, bool>> exp = p => p.A2 > 1 && p.B2 > 2;
         var res = new ReplaceWithReference<OptimizeParent, OptimizeChild>(exp, "Parent", "c").NewExpression;
         Assert.AreEqual("c => ((c.Parent.A2 > 1) AndAlso (c.Parent.B2 > 2))", res.ToString());
     }
     {
         Expression<Func<OptimizeParent, bool>> exp = p => p.A2 > 1 && p.B2 > 2;
         var res = new ReplaceWithReference<OptimizeParent, OptimizeChild>(exp, "Parent", "c", new Tuple<string, string>[] { Tuple.Create("A1", "A2") }).NewExpression;
         Assert.AreEqual("c => ((c.A1 > 1) AndAlso (c.Parent.B2 > 2))", res.ToString());
     }
 }