Mercurial > pub > bltoolkit
diff UnitTests/Linq/SetTest.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/SetTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,579 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +using BLToolkit.Data.Linq; + +using NUnit.Framework; + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class SetTest : TestBase + { + [Test] + public void Except1() + { + ForEachProvider(db => AreEqual( + Child.Except( Child.Where(p => p.ParentID == 3)), + db.Child.Except(db.Child.Where(p => p.ParentID == 3)))); + } + + //[Test] + public void Except2() + { + var ids = new[] { 1, 2 }; + + ForEachProvider(db => Assert.AreEqual( + Child.Where(c => c.GrandChildren.Select(_ => _.ParentID ?? 0).Except(ids).Count() == 0), + db.Child.Where(c => c.GrandChildren.Select(_ => _.ParentID ?? 0).Except(ids).Count() == 0))); + } + + [Test] + public void Intersect() + { + ForEachProvider(db => AreEqual( + Child.Intersect( Child.Where(p => p.ParentID == 3)), + db.Child.Intersect(db.Child.Where(p => p.ParentID == 3)))); + } + + [Test] + public void Any1() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => Child.Where(c => c.ParentID == p.ParentID).Any(c => c.ParentID > 3)), + db.Parent.Where(p => db.Child.Where(c => c.ParentID == p.ParentID).Any(c => c.ParentID > 3)))); + } + + [Test] + public void Any2() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => Child.Where(c => c.ParentID == p.ParentID).Any()), + db.Parent.Where(p => db.Child.Where(c => c.ParentID == p.ParentID).Any()))); + } + + [Test] + public void Any3() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.Children.Any(c => c.ParentID > 3)), + db.Parent.Where(p => p.Children.Any(c => c.ParentID > 3)))); + } + + [Test] + public void Any31() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.ParentID > 0 && p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3)), + db.Parent.Where(p => p.ParentID > 0 && p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3)))); + } + + [MethodExpression("SelectAnyExpression")] + static bool SelectAny(Parent p) + { + return p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3); + } + + static Expression<Func<Parent,bool>> SelectAnyExpression() + { + return p => p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3); + } + + [Test] + public void Any32() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.ParentID > 0 && SelectAny(p)), + db.Parent.Where(p => p.ParentID > 0 && SelectAny(p)))); + } + + [Test] + public void Any4() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.Children.Any()), + db.Parent.Where(p => p.Children.Any()))); + } + + [Test] + public void Any5() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.Children.Any(c => c.GrandChildren.Any(g => g.ParentID > 3))), + db.Parent.Where(p => p.Children.Any(c => c.GrandChildren.Any(g => g.ParentID > 3))))); + } + + [Test] + public void Any6() + { + ForEachProvider(db => Assert.AreEqual( + Child.Any(c => c.ParentID > 3), + db.Child.Any(c => c.ParentID > 3))); + } + + [Test] + public void Any61([DataContexts] string context) + { + using (var db = GetDataContext(context)) + Assert.AreEqual( + Child. Any(c => c.ParentID > 3), + db.GetTable<Child>().Any(c => c.ParentID > 3)); + } + + [Test] + public void Any7() + { + ForEachProvider(db => Assert.AreEqual(Child.Any(), db.Child.Any())); + } + + [Test] + public void Any8() + { + ForEachProvider(db => AreEqual( + from p in Parent select Child.Select(c => c.Parent).Any(c => c == p), + from p in db.Parent select db.Child.Select(c => c.Parent).Any(c => c == p))); + } + + [Test] + public void Any9() + { + ForEachProvider(db => AreEqual( + from p in + from p in Parent + from g in p.GrandChildren + join c in Child on g.ChildID equals c.ChildID + select c + where !p.GrandChildren.Any(x => x.ParentID < 0) + select p, + from p in + from p in db.Parent + from g in p.GrandChildren + join c in db.Child on g.ChildID equals c.ChildID + select c + where !p.GrandChildren.Any(x => x.ParentID < 0) + select p)); + } + + [Test] + public void Any10() + { + ForEachProvider(db => AreEqual( + from p in + from p in Parent + from g in p.GrandChildren + join c in Child on g.ChildID equals c.ChildID + select p + where !p.GrandChildren.Any(x => x.ParentID < 0) + select p, + from p in + from p in db.Parent + from g in p.GrandChildren + join c in db.Child on g.ChildID equals c.ChildID + select p + where !p.GrandChildren.Any(x => x.ParentID < 0) + select p)); + } + + [Test] + public void Any11() + { + ForEachProvider(db => AreEqual( + from p in + from p in Parent + from g in p.GrandChildren + join c in Child on g.ChildID equals c.ChildID + join t in Types on c.ParentID equals t.ID + select c + where !p.GrandChildren.Any(x => x.ParentID < 0) + select p, + from p in + from p in db.Parent + from g in p.GrandChildren + join c in db.Child on g.ChildID equals c.ChildID + join t in db.Types on c.ParentID equals t.ID + select c + where !p.GrandChildren.Any(x => x.ParentID < 0) + select p)); + } + + [Test] + public void Any12() + { + ForEachProvider(db => AreEqual( + from p in Parent where Child. Any(c => p.ParentID == c.ParentID && c.ChildID > 3) select p, + from p in db.GetTable<Parent>() where db.GetTable<Child>().Any(c => p.ParentID == c.ParentID && c.ChildID > 3) select p)); + } + + [Test] + public void All1() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => Child.Where(c => c.ParentID == p.ParentID).All(c => c.ParentID > 3)), + db.Parent.Where(p => db.Child.Where(c => c.ParentID == p.ParentID).All(c => c.ParentID > 3)))); + } + + [Test] + public void All2() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.Children.All(c => c.ParentID > 3)), + db.Parent.Where(p => p.Children.All(c => c.ParentID > 3)))); + } + + [Test] + public void All3() + { + ForEachProvider(db => AreEqual( + Parent.Where(p => p.Children.All(c => c.GrandChildren.All(g => g.ParentID > 3))), + db.Parent.Where(p => p.Children.All(c => c.GrandChildren.All(g => g.ParentID > 3))))); + } + + [Test] + public void All4() + { + ForEachProvider(db => Assert.AreEqual( + Child.All(c => c.ParentID > 3), + db.Child.All(c => c.ParentID > 3))); + } + + [Test] + public void All5() + { + int n = 3; + + ForEachProvider(db => Assert.AreEqual( + Child.All(c => c.ParentID > n), + db.Child.All(c => c.ParentID > n))); + } + + [Test] + public void SubQueryAllAny() + { + ForEachProvider(db => AreEqual( + from c in Parent + where Child.Where(o => o.Parent == c).All(o => Child.Where(e => o == e).Any(e => e.ChildID > 10)) + select c, + from c in db.Parent + where db.Child.Where(o => o.Parent == c).All(o => db.Child.Where(e => o == e).Any(e => e.ChildID > 10)) + select c)); + } + + [Test] + public void AllNestedTest([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + AreEqual( + from c in Customer + where Order.Where(o => o.Customer == c).All(o => Employee.Where(e => o.Employee == e).Any(e => e.FirstName.StartsWith("A"))) + select c, + from c in db.Customer + where db.Order.Where(o => o.Customer == c).All(o => db.Employee.Where(e => o.Employee == e).Any(e => e.FirstName.StartsWith("A"))) + select c); + } + + [Test] + public void ComplexAllTest([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + AreEqual( + from o in Order + where + Customer.Where(c => c == o.Customer).All(c => c.CompanyName.StartsWith("A")) || + Employee.Where(e => e == o.Employee).All(e => e.FirstName.EndsWith("t")) + select o, + from o in db.Order + where + db.Customer.Where(c => c == o.Customer).All(c => c.CompanyName.StartsWith("A")) || + db.Employee.Where(e => e == o.Employee).All(e => e.FirstName.EndsWith("t")) + select o); + } + + [Test] + public void Contains1() + { + ForEachProvider(db => AreEqual( + from p in Parent select Child.Select(c => c.Parent).Contains(p), + from p in db.Parent select db.Child.Select(c => c.Parent).Contains(p))); + } + + [Test] + public void Contains2() + { + ForEachProvider(db => AreEqual( + from p in Parent select Child.Select(c => c.ParentID).Contains(p.ParentID), + from p in db.Parent select db.Child.Select(c => c.ParentID).Contains(p.ParentID))); + } + + [Test] + public void Contains201() + { + ForEachProvider(db => AreEqual( + from p in Parent select Child.Select(c => c.ParentID).Contains(p.ParentID - 1), + from p in db.Parent select db.Child.Select(c => c.ParentID).Contains(p.ParentID - 1))); + } + + [Test] + public void Contains3() + { + ForEachProvider(db => AreEqual( + from p in Parent where Child.Select(c => c.Parent).Contains(p) select p, + from p in db.Parent where db.Child.Select(c => c.Parent).Contains(p) select p)); + } + + [Test] + public void Contains4() + { + ForEachProvider(db => AreEqual( + from p in Parent where Child.Select(c => c.ParentID).Contains(p.ParentID) select p, + from p in db.Parent where db.Child.Select(c => c.ParentID).Contains(p.ParentID) select p)); + } + + [Test] + public void Contains5() + { + ForEachProvider(db => AreEqual( + from p in Parent where Child.Select(c => c.ParentID).Contains(p.ParentID + 1) select p, + from p in db.Parent where db.Child.Select(c => c.ParentID).Contains(p.ParentID + 1) select p)); + } + + [Test] + public void Contains6() + { + var n = 1; + + ForEachProvider(db => AreEqual( + from p in Parent where Child.Select(c => c.ParentID).Contains(p.ParentID + n) select p, + from p in db.Parent where db.Child.Select(c => c.ParentID).Contains(p.ParentID + n) select p)); + } + + [Test] + public void Contains7() + { + ForEachProvider(db => Assert.AreEqual( + Child.Select(c => c.ParentID).Contains(11), + db.Child.Select(c => c.ParentID).Contains(11))); + } + + [Test] + public void Contains701() + { + ForEachProvider(db => Assert.AreEqual( + Child.Select(c => c.Parent).Contains(new Parent { ParentID = 11, Value1 = 11}), + db.Child.Select(c => c.Parent).Contains(new Parent { ParentID = 11, Value1 = 11}))); + } + + [Test] + public void Contains8() + { + var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) }; + + ForEachProvider(db => AreEqual( + from p in Parent + join ch in Child on p.ParentID equals ch.ParentID + join gc in GrandChild on ch.ChildID equals gc.ChildID + where arr.Contains(gc) + select p, + from p in db.Parent + join ch in db.Child on p.ParentID equals ch.ParentID + join gc in db.GrandChild on ch.ChildID equals gc.ChildID + where arr.Contains(gc) + select p)); + } + + [Test] + public void Contains801() + { + var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) }; + + ForEachProvider(db => AreEqual( + from p in Parent + join ch in Child on p.ParentID equals ch.ParentID + join gc in GrandChild on ch.ChildID equals gc.ChildID + select new GrandChild { ParentID = 2, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID } into gc + where arr.Contains(gc) + select gc, + from p in db.Parent + join ch in db.Child on p.ParentID equals ch.ParentID + join gc in db.GrandChild on ch.ChildID equals gc.ChildID + select new GrandChild { ParentID = 2, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID } into gc + where arr.Contains(gc) + select gc)); + } + + [Test] + public void Contains802() + { + var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) }; + + ForEachProvider(db => AreEqual( + from p in Parent + join ch in Child on p.ParentID equals ch.ParentID + join gc in GrandChild on ch.ChildID equals gc.ChildID + where arr.Contains(new GrandChild { ParentID = p.ParentID, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID }) + select p, + from p in db.Parent + join ch in db.Child on p.ParentID equals ch.ParentID + join gc in db.GrandChild on ch.ChildID equals gc.ChildID + where arr.Contains(new GrandChild { ParentID = p.ParentID, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID }) + select p)); + } + + [Test] + public void Contains803() + { + var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) }; + + ForEachProvider(db => AreEqual( + from p in Parent + join ch in Child on p.ParentID equals ch.ParentID + join gc in GrandChild on ch.ChildID equals gc.ChildID + where arr.Contains(new GrandChild { ParentID = 1, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID }) + select p, + from p in db.Parent + join ch in db.Child on p.ParentID equals ch.ParentID + join gc in db.GrandChild on ch.ChildID equals gc.ChildID + where arr.Contains(new GrandChild { ParentID = 1, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID }) + select p)); + } + + [Test] + public void Contains9() + { + var arr = Parent1.Take(2).ToArray(); + + ForEachProvider(db => AreEqual( + from p in Parent1 where arr.Contains(p) select p, + from p in db.Parent1 where arr.Contains(p) select p)); + } + + [Test] + public void Contains10([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var arr = new[] + { + new Northwind.Order { OrderID = 11000 }, + new Northwind.Order { OrderID = 11001 }, + new Northwind.Order { OrderID = 11002 } + }; + + var q = + from e in db.Employee + from o in e.Orders + where arr.Contains(o) + select new + { + e.FirstName, + o.OrderID, + }; + + q.ToList(); + } + } + + [Test] + public void Contains11([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var q = + from e in db.EmployeeTerritory + group e by e.Employee into g + where g.Key.EmployeeTerritories.Count() > 1 + select new + { + g.Key.LastName, + cnt = g.Where(t => t.Employee.FirstName.Contains("an")).Count(), + }; + + q.ToList(); + } + } + + [Test] + public void Contains12([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var q = + from e in db.EmployeeTerritory + group e by e.Employee into g + where g.Key.EmployeeTerritories.Count() > 1 && g.Count() > 2 + select new + { + g.Key.LastName, + //cnt = g.Where(t => t.Employee.FirstName.Contains("an")).Count(), + }; + + q.ToList(); + } + } + + [Test] + public void Contains13([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var arr = new[] + { + new Northwind.EmployeeTerritory { EmployeeID = 1, TerritoryID = "01581" }, + new Northwind.EmployeeTerritory { EmployeeID = 1, TerritoryID = "02116" }, + new Northwind.EmployeeTerritory { EmployeeID = 1, TerritoryID = "31406" } + }; + + var q = + from e in db.EmployeeTerritory + group e by e.EmployeeID into g + select new + { + g.Key, + cnt = g.Count(t => arr.Contains(t)), + }; + + q.ToList(); + } + } + + void TestContains(ITestDataContext db, Parent1 parent) + { + Assert.AreEqual( + Parent1.Where(p => p.ParentID == 1).Contains(parent), + db.Parent1.Where(p => p.ParentID == 1).Contains(parent)); + } + + [Test] + public void Contains14() + { + var ps = Parent1.OrderBy(p => p.ParentID).Take(2).ToArray(); + + ForEachProvider(db => Array.ForEach(ps, p => TestContains(db, p))); + } + + static void GetData(ITestDataContext db, IEnumerable<int?> d) + { + var r1 = db.GrandChild + .Where(x => d.Contains(x.ParentID)) + .ToList(); + + foreach (var g in r1) + { + Assert.AreEqual(d.First().Value, g.ParentID); + } + } + + [Test] + public void TestForGroupBy() + { + ForEachProvider(db => + { + GetData(db, new List<int?> { 2 }); + GetData(db, new List<int?> { 3 }); + }); + } + } +}