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)); } }
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()); } }
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()); } }