Mercurial > pub > bltoolkit
diff UnitTests/Linq/ExpressionsTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UnitTests/Linq/ExpressionsTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,288 @@ +using System; +using System.Linq; +using System.Linq.Expressions; + +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; + +using NUnit.Framework; + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class ExpressionsTest : TestBase + { + static int Count1(Parent p) { return p.Children.Count(c => c.ChildID > 0); } + + [Test] + public void MapMember1() + { + Expressions.MapMember<Parent,int>(p => Count1(p), p => p.Children.Count(c => c.ChildID > 0)); + + ForEachProvider(db => AreEqual(Parent.Select(p => Count1(p)), db.Parent.Select(p => Count1(p)))); + } + + static int Count2(Parent p, int id) { return p.Children.Count(c => c.ChildID > id); } + + [Test] + public void MapMember2() + { + Expressions.MapMember<Parent,int,int>((p,id) => Count2(p, id), (p, id) => p.Children.Count(c => c.ChildID > id)); + + ForEachProvider(db => AreEqual(Parent.Select(p => Count2(p, 1)), db.Parent.Select(p => Count2(p, 1)))); + } + + static int Count3(Parent p, int id) { return p.Children.Count(c => c.ChildID > id) + 2; } + + [Test] + public void MapMember3() + { + Expressions.MapMember<Parent,int,int>((p,id) => Count3(p, id), (p, id) => p.Children.Count(c => c.ChildID > id) + 2); + + var n = 2; + + ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(Parent.Select(p => Count3(p, n)), db.Parent.Select(p => Count3(p, n)))); + } + + [MethodExpression("Count4Expression")] + static int Count4(Parent p, int id, int n) + { + return (_count4Expression ?? (_count4Expression = Count4Expression().Compile()))(p, id, n); + } + + static Func<Parent,int,int,int> _count4Expression; + + static Expression<Func<Parent,int,int,int>> Count4Expression() + { + return (p, id, n) => p.Children.Count(c => c.ChildID > id) + n; + } + + [Test] + public void MethodExpression4() + { + var n = 3; + + ForEachProvider(db => AreEqual( + Parent.Select(p => Count4(p, n, 4)), + db.Parent.Select(p => Count4(p, n, 4)))); + } + + [MethodExpression("Count5Expression")] + static int Count5(ITestDataContext db, Parent p, int n) + { + return (_count5Expression ?? (_count5Expression = Count5Expression().Compile()))(db, p, n); + } + + static Func<ITestDataContext,Parent,int,int> _count5Expression; + + static Expression<Func<ITestDataContext,Parent,int,int>> Count5Expression() + { + return (db, p, n) => Sql.AsSql(db.Child.Where(c => c.ParentID == p.ParentID).Count() + n); + } + + [Test] + public void MethodExpression5() + { + var n = 2; + + ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual( + Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count() + n), + db.Parent.Select(p => Count5(db, p, n)))); + } + + [MethodExpression("Count6Expression")] + static int Count6(Table<Child> c, Parent p) + { + return (_count6Expression ?? (_count6Expression = Count6Expression().Compile()))(c, p); + } + + static Func<Table<Child>,Parent,int> _count6Expression; + + static Expression<Func<Table<Child>,Parent,int>> Count6Expression() + { + return (ch, p) => ch.Where(c => c.ParentID == p.ParentID).Count(); + } + + [Test] + public void MethodExpression6() + { + ForEachProvider(db => AreEqual( + Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count()), + db.Parent.Select(p => Count6(db.Child, p)))); + } + + [MethodExpression("Count7Expression")] + static int Count7(Table<Child> ch, Parent p, int n) + { + return (_count7Expression ?? (_count7Expression = Count7Expression().Compile()))(ch, p, n); + } + + static Func<Table<Child>,Parent,int,int> _count7Expression; + + static Expression<Func<Table<Child>,Parent,int,int>> Count7Expression() + { + return (ch, p, n) => Sql.AsSql(ch.Where(c => c.ParentID == p.ParentID).Count() + n); + } + + [Test] + public void MethodExpression7() + { + var n = 2; + + ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual( + Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count() + n), + db.Parent.Select(p => Count7(db.Child, p, n)))); + } + + [MethodExpression("Expression8")] + static IQueryable<Parent> GetParent(ITestDataContext db, Child ch) + { + throw new InvalidOperationException(); + } + + static Expression<Func<ITestDataContext,Child,IQueryable<Parent>>> Expression8() + { + return (db,ch) => + from p in db.Parent + where p.ParentID == (int)Math.Floor(ch.ChildID / 10.0) + select p; + } + + [Test] + public void MethodExpression8() + { + ForEachProvider(db => AreEqual( + from ch in Child + from p in + from p in Parent + where p.ParentID == ch.ChildID / 10 + select p + where ch.ParentID == p.ParentID + select ch + , + from ch in db.Child + from p in GetParent(db, ch) + where ch.ParentID == p.ParentID + select ch)); + } + + [Test] + public void MethodExpression9() + { + using (var db = new TestDbManager()) + AreEqual( + from ch in Child + from p in + from p in Parent + where p.ParentID == ch.ChildID / 10 + select p + where ch.ParentID == p.ParentID + select ch + , + from ch in db.Child + from p in TestDbManager.GetParent9(db, ch) + where ch.ParentID == p.ParentID + select ch); + } + + [Test] + public void MethodExpression10() + { + using (var db = new TestDbManager()) + AreEqual( + from ch in Child + from p in + from p in Parent + where p.ParentID == ch.ChildID / 10 + select p + where ch.ParentID == p.ParentID + select ch + , + from ch in db.Child + from p in db.GetParent10(ch) + where ch.ParentID == p.ParentID + select ch); + } + + [MethodExpression("GetBoolExpression1")] + static bool GetBool1<T>(T obj) + { + throw new InvalidOperationException(); + } + + static Expression<Func<T,bool>> GetBoolExpression1<T>() + where T : class + { + return obj => obj != null; + } + + [Test] + public void TestGenerics1() + { + using (var db = new TestDbManager()) + { + var q = + from ch in db.Child + where GetBool1(ch.Parent) + select ch; + + q.ToList(); + } + } + + [MethodExpression("GetBoolExpression2_{0}")] + static bool GetBool2<T>(T obj) + { + throw new InvalidOperationException(); + } + + static Expression<Func<Parent,bool>> GetBoolExpression2_Parent() + { + return obj => obj != null; + } + + [Test] + public void TestGenerics2() + { + using (var db = new TestDbManager()) + { + var q = + from ch in db.Child + where GetBool2(ch.Parent) + select ch; + + q.ToList(); + } + } + + class TestClass<T> + { + [MethodExpression("GetBoolExpression3")] + public static bool GetBool3(Parent obj) + { + throw new InvalidOperationException(); + } + + static Expression<Func<Parent,bool>> GetBoolExpression3() + { + return obj => obj != null; + } + } + + [Test] + public void TestGenerics3() + { + using (var db = new TestDbManager()) + { + var q = + from ch in db.Child + where TestClass<int>.GetBool3(ch.Parent) + select ch; + + q.ToList(); + } + } + } +}