diff UnitTests/Linq/CountTest.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/CountTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,596 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class CountTest : TestBase
+	{
+		[Test]
+		public void Count1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.Count(),
+				db.Parent.Count()));
+		}
+
+		[Test]
+		public void Count2()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.Count(p => p.ParentID > 2),
+				db.Parent.Count(p => p.ParentID > 2)));
+		}
+
+		[Test]
+		public void Count3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Children.Count(),
+				from p in db.Parent select p.Children.Count()));
+		}
+
+		[Test]
+		public void Count4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child.Count(),
+				from p in db.Parent select db.Child.Count()));
+		}
+
+		[Test]
+		public void Count5()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from ch in    Child group ch by ch.ParentID).Count(),
+				(from ch in db.Child group ch by ch.ParentID).Count()));
+		}
+
+		[Test]
+		public void Count6()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from ch in    Child group ch by ch.ParentID).Count(g => g.Key > 2),
+				(from ch in db.Child group ch by ch.ParentID).Count(g => g.Key > 2)));
+		}
+
+		[Test]
+		public void Count7()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent where p.Children.Count > 2 select p,
+				from p in db.Parent where p.Children.Count > 2 select p));
+		}
+
+		[Test]
+		public void SubQueryCount([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				AreEqual(
+					from p in Parent
+					select Parent.Where(t => t.ParentID == p.ParentID).Count()
+					,
+					from p in db.Parent
+					//select Sql.AsSql(db.Parent.Count()));
+					select Sql.AsSql(db.GetParentByID(p.ParentID).Count()));
+			}
+		}
+
+		[Test]
+		public void GroupBy1()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Count(ch => ch.ChildID > 20);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Count(ch => ch.ChildID > 20)));
+		}
+
+		[Test]
+		public void GroupBy101()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Count();
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Count()));
+		}
+
+		[Test]
+		public void GroupBy102()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				},
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				}));
+		}
+
+		[Test]
+		public void GroupBy103()
+		{
+			var expected =
+				from ch in Child
+				group ch by new { Parent = ch.ParentID, ch.ChildID } into g
+				select g.Count(ch => ch.ChildID > 20);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by new { Parent = ch.ParentID, ch.ChildID } into g
+				select g.Count(ch => ch.ChildID > 20)));
+		}
+
+
+		[Test]
+		public void GroupBy21([DataContexts] string context)
+		{
+			var n = 1;
+
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from ch in
+						from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+					where ch.ParentID + 1 > n
+					group ch by ch into g
+					select g.Count(p => p.ParentID < 3),
+					from ch in
+						from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+					where ch.ParentID + 1 > n
+					group ch by ch into g
+					select g.Count(p => p.ParentID < 3));
+		}
+
+		[Test]
+		public void GroupBy22()
+		{
+			var n = 1;
+
+			var expected =
+				from ch in
+					from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID + 1 > n
+				group ch by new { ch.ParentID } into g
+				select g.Count(p => p.ParentID < 3);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in
+					from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID + 1 > n
+				group ch by new { ch.ParentID } into g
+				select g.Count(p => p.ParentID < 3)));
+		}
+
+		[Test]
+		public void GroupBy23()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe, "Oracle", "DevartOracle", "Sql2000", ProviderName.Sybase, ProviderName.Access }, db => AreEqual(
+				from p in
+					from p in Parent select new { ParentID = p.ParentID + 1, p.Value1 }
+				where p.ParentID + 1 > 1
+				group p by new { p.Value1 } into g
+				select g.Count(p => p.ParentID < 3),
+				from p in
+					from p in db.Parent select new { ParentID = p.ParentID + 1, p.Value1 }
+				where p.ParentID + 1 > 1
+				group p by new { p.Value1 } into g
+				select g.Count(p => p.ParentID < 3)));
+		}
+
+		[Test]
+		public void GroupBy3()
+		{
+			var expected =
+				from ch in
+					from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID - 1 > 0
+				group ch by new { ch.ParentID } into g
+				select new
+				{
+					g.Key.ParentID,
+					ChildMin   = g.Min(p => p.ChildID),
+					ChildCount = g.Count(p => p.ChildID > 25)
+				};
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in
+					from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID - 1 > 0
+				group ch by new { ch.ParentID } into g
+				select new
+				{
+					g.Key.ParentID,
+					ChildMin   = g.Min(p => p.ChildID),
+					ChildCount = g.Count(p => p.ChildID > 25)
+				}));
+		}
+
+		[Test]
+		public void GroupBy4()
+		{
+			var expected = Child.Count();
+
+			ForEachProvider(db =>
+			{
+				var result = db.Child.Count();
+				Assert.AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void GroupBy5()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				},
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				}));
+		}
+
+		[Test]
+		public void GroupBy6()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from ch in    Child group ch by ch.ParentID).Count(),
+				(from ch in db.Child group ch by ch.ParentID).Count()));
+		}
+
+		[Test]
+		public void GroupBy7()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Count(),
+					ID2 = g.Max  (ch => ch.ChildID),
+				},
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Count(),
+					ID2 = g.Max  (ch => ch.ChildID),
+				}));
+		}
+
+		[Test]
+		public void GroupByWhere()
+		{
+			var expected = Child.Count(ch => ch.ChildID > 20);
+			Assert.AreNotEqual(0, expected);
+
+			ForEachProvider(db =>
+			{
+				var result = db.Child.Count(ch => ch.ChildID > 20);
+				Assert.AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void GroupByWhere1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Key > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Key > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere2()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere201()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere202()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Count(ch => ch.ChildID == 20) > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Count(ch => ch.ChildID == 20) > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere203()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Key > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Key > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere3()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2 && g.Key < 5
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2 && g.Key < 5
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere301()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count() > 3 || g.Key == 1
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count() > 3 || g.Key == 1
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere4()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2
+				select g.Key.ParentID
+				,
+				from ch in db.GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2
+				select g.Key.ParentID));
+		}
+
+		[Test]
+		public void SubQuery1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select new { p.ParentID, Count = p.Children.Where(c => c.ParentID == p.ParentID && c.ChildID != 0m).Count() },
+				from p in db.Parent
+				where p.ParentID != 5
+				select new { p.ParentID, Count = p.Children.Where(c => c.ParentID == p.ParentID && c.ChildID != 0m).Count() }));
+		}
+
+		[Test]
+		public void SubQuery2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count : p.Children.Count(c => c.ParentID == p.ParentID) },
+				from p in db.Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count : p.Children.Count(c => c.ParentID == p.ParentID) }));
+		}
+
+		[Test]
+		public void SubQuery3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count() : p.Children.Count(c => c.ParentID == p.ParentID) },
+				from p in db.Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count() : p.Children.Count(c => c.ParentID == p.ParentID) }));
+		}
+
+		[Test]
+		public void SubQuery4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Count =    Parent.Count(p1 => p1.ParentID == p.ParentID) },
+				from p in db.Parent select new { Count = db.Parent.Count(p1 => p1.ParentID == p.ParentID) }));
+		}
+
+		[Test]
+		public void SubQuery5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Count =    Parent.Where(p1 => p1.ParentID == p.ParentID).Count() },
+				from p in db.Parent select new { Count = db.Parent.Where(p1 => p1.ParentID == p.ParentID).Count() }));
+		}
+
+		[Test]
+		public void SubQuery6()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Sybase }, db => AreEqual(
+				   Parent.Take(5).OrderByDescending(p => p.ParentID).Select(p => p.Children.Count()),
+				db.Parent.Take(5).OrderByDescending(p => p.ParentID).Select(p => p.Children.Count())));
+		}
+
+		[Test]
+		public void SubQuery7()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, "Oracle", ProviderName.Sybase, ProviderName.Access }, ///// Fix It
+				db => AreEqual(
+					from p in    Parent select    Child.Count(c => c.Parent == p),
+					from p in db.Parent select db.Child.Count(c => c.Parent == p)));
+		}
+
+		[Test]
+		public void SubQueryMax1()
+		{
+			ForEachProvider(
+				db => Assert.AreEqual(
+					   Parent.Max(p =>    Child.Count(c => c.Parent.ParentID == p.ParentID)),
+					db.Parent.Max(p => db.Child.Count(c => c.Parent.ParentID == p.ParentID))));
+		}
+
+		[Test]
+		public void SubQueryMax2()
+		{
+			ForEachProvider(
+				db => Assert.AreEqual(
+					   Parent.Max(p => p.Children.Count()),
+					db.Parent.Max(p => p.Children.Count())));
+		}
+
+		[Test]
+		public void GroupJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				join g in GrandChild on p.ParentID equals g.ParentID into gg
+				select new
+				{
+					Count1 = gc.Count(),
+					Count2 = gg.Count()
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				join g in db.GrandChild on p.ParentID equals g.ParentID into gg
+				select new
+				{
+					Count1 = gc.Count(),
+					Count2 = gg.Count()
+				}));
+		}
+
+		[Test]
+		public void GroupJoin2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				join g in GrandChild on p.ParentID equals g.ParentID into gg
+				let gc1 = gc
+				let gg1 = gg
+				select new
+				{
+					Count1 = gc1.Count(),
+					Count2 = gg1.Count()
+				} ,
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				join g in db.GrandChild on p.ParentID equals g.ParentID into gg
+				let gc1 = gc
+				let gg1 = gg
+				select new
+				{
+					Count1 = gc.Count(),
+					Count2 = gg.Count()
+				}));
+		}
+
+		[Test]
+		public void GroupJoin3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count(),
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count(),
+				}));
+		}
+
+		[Test]
+		public void GroupJoin4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count() + gc.Count(),
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count() + gc.Count(),
+				}));
+		}
+	}
+}