diff UnitTests/Linq/Functions.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/Functions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,349 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Functions : TestBase
+	{
+		[Test]
+		public void Contains1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where new[] { 1, 2 }.Contains(p.ParentID) select p,
+				from p in db.Parent where new[] { 1, 2 }.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains2()
+		{
+			var arr = new[] { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains3()
+		{
+			var n = 2;
+
+			var expected =
+				from p in Parent
+				where new[] { 1, n }.Contains(p.ParentID)
+				select p;
+
+			ForEachProvider(data => AreEqual(expected, CompiledQuery.Compile<ITestDataContext,IQueryable<Parent>>(db =>
+				from p in db.Parent
+				where new[] { 1, n }.Contains(p.ParentID)
+				select p)(data)));
+		}
+
+		[Test]
+		public void Contains4()
+		{
+			var arr = new[] { 1, 2 };
+
+			var expected =
+				from p in Parent
+				where arr.Contains(p.ParentID)
+				select p;
+
+			ForEachProvider(data => AreEqual(expected, CompiledQuery.Compile<ITestDataContext,IQueryable<Parent>>(db =>
+				from p in db.Parent
+				where arr.Contains(p.ParentID)
+				select p)(data)));
+		}
+
+		[Test]
+		public void Contains5()
+		{
+			var arr1 = new[] { 1, 2 };
+			var arr2 = new[] { 1, 2, 4 };
+
+			var expected1 = from p in Parent where arr1.Contains(p.ParentID) select p;
+			var expected2 = from p in Parent where arr2.Contains(p.ParentID) select p;
+
+			ForEachProvider(data =>
+			{
+				var cq = CompiledQuery.Compile<ITestDataContext,int[],IQueryable<Parent>>((db,a) =>
+					from p in db.Parent
+					where a.Contains(p.ParentID)
+					select p);
+
+				AreEqual(expected1, cq(data, arr1));
+				AreEqual(expected2, cq(data, arr2));
+			});
+		}
+
+		[Test]
+		public void Contains6()
+		{
+			var arr = new List<int> { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains7()
+		{
+			IEnumerable<int> arr = new[] { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsKey1()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Keys.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Keys.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsKey2()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.ContainsKey(p.ParentID) select p,
+				from p in db.Parent where arr.ContainsKey(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsValue1()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Values.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Values.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsValue2()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.ContainsValue(p.ParentID) select p,
+				from p in db.Parent where arr.ContainsValue(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsHashSet1()
+		{
+			var arr = new HashSet<int> { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void EmptyContains1()
+		{
+			var expected =
+				from p in Parent
+				where new int[0].Contains(p.ParentID) || p.ParentID == 2
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+				where new int[0].Contains(p.ParentID) || p.ParentID == 2
+				select p));
+		}
+
+		[Test]
+		public void ContainsString11()
+		{
+			var arr = new List<string> { "John" };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where arr.Contains(p.FirstName) select p,
+				from p in db.Person where arr.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString12()
+		{
+			var nm = "John";
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new List<string> { nm }.Contains(p.FirstName) select p,
+				from p in db.Person where new List<string> { nm }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString13()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new List<string> { "John" }.Contains(p.FirstName) select p,
+				from p in db.Person where new List<string> { "John" }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString21()
+		{
+			var arr = new[] { "John" };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where arr.Contains(p.FirstName) select p,
+				from p in db.Person where arr.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString22()
+		{
+			var nm = "John";
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new[] { nm }.Contains(p.FirstName) select p,
+				from p in db.Person where new[] { nm }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString23()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new[] { "John" }.Contains(p.FirstName) select p,
+				from p in db.Person where new[] { "John" }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void Equals1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID.Equals(2) select p,
+				from p in db.Parent where p.ParentID.Equals(2) select p));
+		}
+
+		[Test]
+		public void Equals2()
+		{
+			var child    = (from ch in Child where ch.ParentID == 2 select ch).First();
+			var expected = from ch in Child where !ch.Equals(child) select ch;
+
+			ForEachProvider(db => AreEqual(expected, from ch in db.Child where !ch.Equals(child) select ch));
+		}
+
+		[Test]
+		public void Equals3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.Value1.Equals(null) select p,
+				from p in db.Parent where p.Value1.Equals(null) select p));
+		}
+
+		[Test]
+		public void Equals4([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					   Customer.Where(c => !c.Address.Equals(null)),
+					db.Customer.Where(c => !c.Address.Equals(null)));
+		}
+
+		[Test]
+		public void NewGuid1()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db => AreEqual(
+				from p in    Types where p.GuidValue != Sql.NewGuid() select p.GuidValue,
+				from p in db.Types where p.GuidValue != Sql.NewGuid() select p.GuidValue));
+		}
+
+		[Test]
+		public void NewGuid2()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db =>
+				Assert.AreNotEqual(Guid.Empty, (from p in db.Types select Sql.NewGuid()).First()));
+		}
+
+		[Test]
+		public void CustomFunc()
+		{
+			Expressions.MapMember<Person>(p => p.FullName(), (Expression<Func<Person,string>>)(p => p.LastName + ", " + p.FirstName));
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.FullName() == "Pupkin, John" select p.FullName(),
+				from p in db.Person where p.FullName() == "Pupkin, John" select p.FullName()));
+		}
+
+		[Test]
+		public void Count1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Count(c => c.ParentID == 1),
+				db.Child.Count(c => c.ParentID == 1)));
+		}
+
+		[Test]
+		public void Sum1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Sum(c => c.ParentID),
+				db.Child.Sum(c => c.ParentID)));
+		}
+
+		[MethodExpression("ChildCountExpression")]
+		public static int ChildCount(Parent parent)
+		{
+			throw new NotSupportedException();
+		}
+
+		static Expression ChildCountExpression()
+		{
+			return
+				(Expression<Func<Parent, int>>)
+				(p => p.Children.Where(c => c.ParentID > 2).Sum(c => c.ParentID * c.ChildID));
+		}
+
+		[Test]
+		public void Sum2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Select(p => p.Children.Where(c => c.ParentID > 2).Sum(c => c.ParentID * c.ChildID)),
+				db.Parent.Select(p => ChildCount(p))));
+		}
+	}
+
+	public static class PersonExtension
+	{
+		static public string FullName(this Person person)
+		{
+			return person.LastName + ", " + person.FirstName;
+		}
+	}
+}