diff UnitTests/Linq/Common.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/Common.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,461 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Common : TestBase
+	{
+		[Test]
+		public void AsQueryable()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from ch in    Child               select p,
+				from p in db.Parent from ch in db.Child.AsQueryable() select p));
+		}
+
+		[Test]
+		public void Convert()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from ch in                         Child                select p,
+				from p in db.Parent from ch in ((IEnumerable<Child>)db.Child).AsQueryable() select p));
+		}
+
+		[Test]
+		public void NewCondition()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Value = p.Value1 != null ? p.Value1 : 100 },
+				from p in db.Parent select new { Value = p.Value1 != null ? p.Value1 : 100 }));
+		}
+
+		[Test]
+		public void NewCoalesce()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Value = p.Value1 ?? 100 },
+				from p in db.Parent select new { Value = p.Value1 ?? 100 }));
+		}
+
+		[Test]
+		public void CoalesceNew()
+		{
+			Child ch = null;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select ch ?? new Child { ParentID = p.ParentID },
+				from p in db.Parent select ch ?? new Child { ParentID = p.ParentID }));
+		}
+
+		[Test]
+		public void ScalarCondition()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 != null ? p.Value1 : 100,
+				from p in db.Parent select p.Value1 != null ? p.Value1 : 100));
+		}
+
+		[Test]
+		public void ScalarCoalesce()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 ?? 100,
+				from p in db.Parent select p.Value1 ?? 100));
+		}
+
+		[Test]
+		public void ExprCoalesce()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select (p.Value1 ?? 100) + 50,
+				from p in db.Parent select (p.Value1 ?? 100) + 50));
+		}
+
+		static int GetDefault1()
+		{
+			return 100;
+		}
+
+		[Test]
+		public void ClientCoalesce1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 ?? GetDefault1(),
+				from p in db.Parent select p.Value1 ?? GetDefault1()));
+		}
+
+		static int GetDefault2(int n)
+		{
+			return n;
+		}
+
+		[Test]
+		public void ClientCoalesce2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 ?? GetDefault2(p.ParentID),
+				from p in db.Parent select p.Value1 ?? GetDefault2(p.ParentID)));
+		}
+
+		[Test]
+		public void CoalesceLike([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from p in    Person
+					where
+						(p.FirstName == null ? (bool?)null : (bool?)p.FirstName.StartsWith("Jo")) == null ?
+							false :
+							(p.FirstName == null ? (bool?)null : p.FirstName.StartsWith("Jo")).Value
+					select p,
+					from p in db.Person
+					where
+						(p.FirstName == null ? (bool?)null : (bool?)p.FirstName.StartsWith("Jo")) == null ?
+							false :
+							(p.FirstName == null ? (bool?)null : p.FirstName.StartsWith("Jo")).Value
+					select p);
+		}
+
+		[Test]
+		public void PreferServerFunc1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select p.FirstName.Length,
+				from p in db.Person select p.FirstName.Length));
+		}
+
+		[Test]
+		public void PreferServerFunc2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select p.FirstName.Length + "".Length,
+				from p in db.Person select p.FirstName.Length + "".Length));
+		}
+
+		class Test
+		{
+			class Entity
+			{
+				public Test TestField = null;
+			}
+
+			public Test TestClosure(ITestDataContext db)
+			{
+				return db.Person.Select(_ => new Entity { TestField = this }).First().TestField;
+			}
+		}
+
+		[Test]
+		public void ClosureTest()
+		{
+			ForEachProvider(db => Assert.AreNotEqual(
+				new Test().TestClosure(db),
+				new Test().TestClosure(db)));
+		}
+
+		[Test]
+		public void ExecuteTest([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var emp = db.Employee;
+
+				Expression<Func<int>> m = () => emp.Count();
+
+				var exp = Expression.Call(((MethodCallExpression)m.Body).Method, emp.Expression);
+
+				var results = (int)((IQueryable)emp).Provider.Execute(exp);
+			}
+		}
+
+		class MyClass
+		{
+			public int ID;
+
+			public override bool Equals(object obj)
+			{
+				return ((MyClass)obj).ID == ID;
+			}
+
+			public override int GetHashCode()
+			{
+				return ID;
+			}
+		}
+
+		[Test]
+		public void NewObjectTest1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p1
+				where p1.ID.ID == 1
+				select p1,
+				from p in db.Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p1
+				where p1.ID.ID == 1
+				select p1));
+		}
+
+		[Test]
+		public void NewObjectTest2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p
+				join j in
+					from c in Child
+					select new { ID = new MyClass { ID = c.ParentID } }
+				on p.ID.ID equals j.ID.ID
+				where p.ID.ID == 1
+				select p,
+				from p in db.Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p
+				join j in
+					from c in db.Child
+					select new { ID = new MyClass { ID = c.ParentID } }
+				on p.ID.ID equals j.ID.ID
+				where p.ID.ID == 1
+				select p));
+		}
+
+		public Table<Person> People2(DbManager db)
+		{
+			return db.GetTable<Person>();
+		}
+
+		[Test]
+		public void TableAsMethod()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from d in db.Patient
+					from p in People2(db)
+					select p;
+
+				q.ToList();
+
+				q =
+					from d in db.Patient
+					from p in People2(db)
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void TableAsExtensionMethod()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from d in db.Patient
+					from p in db.People()
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Condition1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { Name = !string.IsNullOrEmpty(p.FirstName) ? p.FirstName : !string.IsNullOrEmpty(p.MiddleName) ? p.MiddleName : p.LastName },
+				from p in db.Person select new { Name = !string.IsNullOrEmpty(p.FirstName) ? p.FirstName : !string.IsNullOrEmpty(p.MiddleName) ? p.MiddleName : p.LastName }));
+		}
+
+		[Test]
+		public void Condition2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { Name = !p.FirstName.IsNullOrEmpty() ? p.FirstName : !p.MiddleName.IsNullOrEmpty() ? p.MiddleName : p.LastName },
+				from p in db.Person select new { Name = !p.FirstName.IsNullOrEmpty() ? p.FirstName : !p.MiddleName.IsNullOrEmpty() ? p.MiddleName : p.LastName }));
+		}
+
+		enum PersonID
+		{
+			Person1 = 1,
+			Person2 = 2
+		}
+
+		[Test]
+		public void ConvertEnum1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.ID == (int)PersonID.Person1 select p,
+				from p in db.Person where p.ID == (int)PersonID.Person1 select p));
+		}
+
+		[Test]
+		public void ConvertEnum2()
+		{
+			var id = PersonID.Person1;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.ID == (int)id select p,
+				from p in db.Person where p.ID == (int)id select p));
+		}
+
+		[Test]
+		public void GroupByUnion1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in (
+					from c in Child
+					where c.ParentID < 4
+					select new { c.ParentID, ID = c.ChildID })
+				.Concat(
+					from g in GrandChild
+					where g.ParentID >= 4
+					select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+				group t by t.ParentID into gr
+				select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+				where tt.Sum != 0
+				select tt
+				,
+				from t in (
+					from c in db.Child
+					where c.ParentID < 4
+					select new { c.ParentID, ID = c.ChildID })
+				.Concat(
+					from g in db.GrandChild
+					where g.ParentID >= 4
+					select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+				group t by t.ParentID into gr
+				select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+				where tt.Sum != 0
+				select tt
+			));
+		}
+
+		[Test]
+		public void GroupByUnion2()
+		{
+			ForEachProvider(db =>
+			{
+				var qe1 =
+					from t in (
+						from c in Child
+						where c.ParentID < 4
+						select new { c.ParentID, ID = c.ChildID })
+					.Concat(
+						from g in GrandChild
+						where g.ParentID >= 4
+						select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+					group t by t.ParentID into gr
+					select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+					where tt.Sum != 0
+					select tt;
+
+				var qe2 =
+					from p in Parent
+						join tt in qe1 on p.ParentID equals tt.ParentID into gr
+						from tt in gr.DefaultIfEmpty()
+					select new { p.ParentID };
+
+				var qr1 =
+					from t in (
+						from c in db.Child
+						where c.ParentID < 4
+						select new { c.ParentID, ID = c.ChildID })
+					.Concat(
+						from g in db.GrandChild
+						where g.ParentID >= 4
+						select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+					group t by t.ParentID into gr
+					select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+					where tt.Sum != 0
+					select tt;
+
+				var qr2 =
+					from p in db.Parent
+						join tt in qr1 on p.ParentID equals tt.ParentID into gr
+						from tt in gr.DefaultIfEmpty()
+					select new { p.ParentID };
+
+				AreEqual(qe2, qr2);
+			});
+		}
+
+		[Test]
+		public void GroupByLeftJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join tt in
+						from t in Child
+						group t by t.ParentID into gr
+						select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ChildID) } into tt
+						where tt.Sum != 0
+						select tt
+					on p.ParentID equals tt.ParentID into gr
+					from tt in gr.DefaultIfEmpty()
+				select p.ParentID,
+				from p in db.Parent
+					join tt in
+						from t in db.Child
+						group t by t.ParentID into gr
+						select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ChildID) } into tt
+						where tt.Sum != 0
+						select tt
+					on p.ParentID equals tt.ParentID into gr
+					from tt in gr.DefaultIfEmpty()
+				select p.ParentID));
+		}
+
+		void ProcessItem(ITestDataContext db, int id)
+		{
+			var hashQuery1 = Parent.Where(t => t.ParentID == id);
+
+			var groups1 = Child
+				.Where(p => hashQuery1.Any(e => e.ParentID == p.ParentID))
+				.GroupBy(e => e.ParentID)
+				.Select(g => g.Key);
+
+			var hashQuery2 = db.Parent.Where(t => t.ParentID == id);
+
+			var groups2 = db.Child
+				.Where(p => hashQuery2.Any(e => e.ParentID == p.ParentID))
+				.GroupBy(e => e.ParentID)
+				.Select(g => g.Key);
+
+			AreEqual(groups1, groups2);
+		}
+
+		[Test]
+		public void ParameterTest1()
+		{
+			ForEachProvider(db =>
+			{
+				ProcessItem(db, 1);
+				ProcessItem(db, 2);
+			});
+		}
+	}
+
+	static class Extender
+	{
+		public static Table<Person> People(this DbManager db)
+		{
+			return db.GetTable<Person>();
+		}
+
+		public static bool IsNullOrEmpty(this string value)
+		{
+			return string.IsNullOrEmpty(value);
+		}
+	}
+}