diff UnitTests/Linq/AssociationTest.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/AssociationTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,427 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class AssociationTest : TestBase
+	{
+		[Test]
+		public void Test1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in    Child where ch.ParentID == 1 select new { ch, ch.Parent },
+				from ch in db.Child where ch.ParentID == 1 select new { ch, ch.Parent }));
+		}
+
+		[Test]
+		public void Test2()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID }));
+		}
+
+		[Test]
+		public void Test3()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID }));
+		}
+
+		[Test]
+		public void Test4()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID, ch.ChildID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID, ch.ChildID }));
+		}
+
+		[Test]
+		public void Test5()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children2
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children2
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID }));
+		}
+
+		[Test]
+		public void SelectMany1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.Select(ch => p)),
+				db.Parent.SelectMany(p => p.Children.Select(ch => p))));
+		}
+
+		[Test]
+		public void SelectMany2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child.Select(ch => p)),
+				db.Parent.SelectMany(p => db.Child.Select(ch => p))));
+		}
+
+		[Test]
+		public void SelectMany3()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent)),
+				db.Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent))));
+		}
+
+        [Test]
+		public void SelectMany4()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent.ParentID)),
+				db.Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent.ParentID))));
+		}
+
+		[Test]
+		public void SelectMany5()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.Select(ch => p.ParentID)),
+				db.Parent.SelectMany(p => p.Children.Select(ch => p.ParentID))));
+		}
+
+		[Test]
+		public void LeftJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { p, c },
+				from p in db.Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { p, c }));
+		}
+
+		[Test]
+		public void LeftJoin2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { c, p },
+				from p in db.Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { c, p }));
+		}
+
+		[Test]
+		public void GroupBy1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in    Child group ch by ch.Parent into g select g.Key,
+				from ch in db.Child group ch by ch.Parent into g select g.Key));
+		}
+
+		[Test]
+		public void GroupBy2()
+		{
+			ForEachProvider(db => AreEqual(
+				(from ch in    Child group ch by ch.Parent1).ToList().Select(g => g.Key),
+				(from ch in db.Child group ch by ch.Parent1).ToList().Select(g => g.Key)));
+		}
+
+		[Test]
+		public void GroupBy3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent group p by p.Types.DateTimeValue.Year into g select g.Key,
+				from p in db.Parent group p by p.Types.DateTimeValue.Year into g select g.Key));
+		}
+
+		[Test]
+		public void GroupBy4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types group p by p.DateTimeValue.Year into g select g.Key,
+				from p in db.Types group p by p.DateTimeValue.Year into g select g.Key));
+		}
+
+		[Test]
+		public void EqualsNull1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from employee in    Employee where employee.ReportsToEmployee != null select employee.EmployeeID,
+					from employee in db.Employee where employee.ReportsToEmployee != null select employee.EmployeeID);
+		}
+
+		[Test]
+		public void EqualsNull2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from employee in    Employee where employee.ReportsToEmployee != null select employee, 
+					from employee in db.Employee where employee.ReportsToEmployee != null select employee);
+		}
+
+		[Test]
+		public void EqualsNull3([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from employee in    Employee where employee.ReportsToEmployee != null select new { employee.ReportsToEmployee, employee },
+					from employee in db.Employee where employee.ReportsToEmployee != null select new { employee.ReportsToEmployee, employee });
+		}
+
+		[Test]
+		public void StackOverflow1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				Assert.AreEqual(
+					(from employee in    Employee where employee.Employees.Count > 0 select employee).FirstOrDefault(),
+					(from employee in db.Employee where employee.Employees.Count > 0 select employee).FirstOrDefault());
+		}
+
+		[Test]
+		public void StackOverflow2()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent5 where p.Children.Count != 0 select p,
+				from p in db.Parent5 where p.Children.Count != 0 select p));
+		}
+
+		[Test]
+		public void StackOverflow3()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from p in    Parent5 where p.Children.Count() != 0 select p,
+					from p in db.Parent5 where p.Children.Count() != 0 select p));
+		}
+
+		[Test]
+		public void StackOverflow4()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent5 select new { p.Children.Count },
+				from p in db.Parent5 select new { p.Children.Count }));
+		}
+
+		[Test]
+		public void DoubleJoin()
+		{
+			ForEachProvider(db => AreEqual(
+				from g in    GrandChild where g.Child.Parent.Value1 == 1 select g,
+				from g in db.GrandChild where g.Child.Parent.Value1 == 1 select g));
+		}
+
+		[Test]
+		public void Projection1()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in
+					from c in Child
+					where c.Parent.ParentID == 2
+					select c
+				join g in GrandChild on c.ParentID equals g.ParentID
+				where g.ChildID == 22
+				select new { c.Parent, c },
+				from c in
+					from c in db.Child
+					where c.Parent.ParentID == 2
+					select c
+				join g in db.GrandChild on c.ParentID equals g.ParentID
+				where g.ChildID == 22
+				select new { c.Parent, c }));
+		}
+
+		[TableName("Parent")]
+		public class Top
+		{
+			public int  ParentID;
+			public int? Value1;
+
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public Middle Middle { get; set; }
+		}
+
+		[TableName("Child")]
+		public class Middle
+		{
+			[PrimaryKey] public int ParentID;
+			[PrimaryKey] public int ChildID;
+
+			[Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = false)]
+			public Bottom Bottom { get; set; }
+
+			[Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = true)]
+			public Bottom Bottom1 { get; set; }
+		}
+
+		[TableName("GrandChild")]
+		public class Bottom
+		{
+			public int ParentID;
+			public int ChildID;
+			public int GrandChildID;
+		}
+
+		[Test]
+		public void TestTernary1([DataContexts(ProviderName.SQLite, ProviderName.Access)] string context)
+		{
+			var ids = new[] { 1, 5 };
+
+			using (var db = GetDataContext(context))
+			{
+				var q =
+					from t in db.GetTable<Top>()
+					where ids.Contains(t.ParentID)
+					orderby t.ParentID
+					select t.Middle == null ? null : t.Middle.Bottom;
+
+				var list = q.ToList();
+
+				Assert.NotNull(list[0]);
+				Assert.Null   (list[1]);
+			}
+		}
+
+		[Test]
+		public void TestTernary2()
+		{
+			var ids = new[] { 1, 5 };
+
+			ForEachProvider(
+				new[] { ProviderName.SQLite, ProviderName.Access },
+				db =>
+				{
+					var q =
+						from t in db.GetTable<Top>()
+						where ids.Contains(t.ParentID)
+						orderby t.ParentID
+						select t.Middle.Bottom;
+
+					var list = q.ToList();
+
+					Assert.NotNull(list[0]);
+					Assert.Null   (list[1]);
+				});
+		}
+
+		[Test]
+		public void TestTernary3()
+		{
+			var ids = new[] { 1, 5 };
+
+			ForEachProvider(db =>
+			{
+				var q =
+					from t in db.GetTable<Top>()
+					where ids.Contains(t.ParentID)
+					orderby t.ParentID
+					select t.Middle.Bottom1;
+
+				var list = q.ToList();
+
+				Assert.NotNull(list[0]);
+				Assert.Null   (list[1]);
+			});
+		}
+
+		[TableName("Child")]
+		[InheritanceMapping(Code = 1, IsDefault = true, Type = typeof(ChildForHeirarhy))]
+		public class ChildBaseForHeirarhy
+		{
+			[MapField(IsInheritanceDiscriminator = true)]
+			public int ChildID { get; set; }
+		}
+
+		public class ChildForHeirarhy : ChildBaseForHeirarhy
+		{
+			public int ParentID { get; set; }
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public Parent Parent { get; set; }
+		}
+
+		[Test]
+		public void AssociationInHeirarhy()
+		{
+			ForEachProvider(db =>
+			{
+				db.GetTable<ChildBaseForHeirarhy>()
+					.OfType<ChildForHeirarhy>()
+					.Select(ch => new ChildForHeirarhy { Parent = ch.Parent })
+					.ToList();
+			});
+		}
+
+		[Test]
+		public void LetTest1()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from p in Parent
+					let chs = p.Children
+					select new { p.ParentID, Count = chs.Count() },
+					from p in db.Parent
+					let chs = p.Children
+					select new { p.ParentID, Count = chs.Count() }));
+		}
+
+		[Test]
+		public void LetTest2()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from p in Parent
+					select new { p } into p
+					let chs = p.p.Children
+					select new { p.p.ParentID, Count = chs.Count() },
+					from p in db.Parent
+					select new { p } into p
+					let chs = p.p.Children
+					select new { p.p.ParentID, Count = chs.Count() }));
+		}
+	}
+}