diff UnitTests/Linq/Types.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/Types.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,726 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Globalization;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Threading;
+
+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 Types : TestBase
+	{
+		[Test]
+		public void Bool1()
+		{
+			var value = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID > 2 && value && true && !false select p,
+				from p in db.Parent where p.ParentID > 2 && value && true && !false select p));
+		}
+
+		[Test]
+		public void Bool2()
+		{
+			var value = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID > 2 && value || true && !false select p,
+				from p in db.Parent where p.ParentID > 2 && value || true && !false select p));
+		}
+
+		[Test]
+		public void Bool3()
+		{
+			var values = new int[0];
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where values.Contains(p.ParentID) && !false || p.ParentID > 2 select p,
+				from p in db.Parent where values.Contains(p.ParentID) && !false || p.ParentID > 2 select p));
+		}
+
+		[Test]
+		public void BoolField1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where t.BoolValue select t.MoneyValue,
+				from t in db.Types where t.BoolValue select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where !t.BoolValue select t.MoneyValue,
+				from t in db.Types where !t.BoolValue select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField3()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where t.BoolValue == true select t.MoneyValue,
+				from t in db.Types where t.BoolValue == true select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField4()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where t.BoolValue == false select t.MoneyValue,
+				from t in db.Types where t.BoolValue == false select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select new { t.MoneyValue, b = !t.BoolValue } where p.b == false select p.MoneyValue,
+				from p in from t in db.Types select new { t.MoneyValue, b = !t.BoolValue } where p.b == false select p.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField6()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select new { t.MoneyValue, b = !t.BoolValue } where p.b select p.MoneyValue,
+				from p in from t in db.Types select new { t.MoneyValue, b = !t.BoolValue } where p.b select p.MoneyValue));
+		}
+
+		[Test]
+		public void BoolResult1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { p.Patient, IsPatient = p.Patient != null },
+				from p in db.Person select new { p.Patient, IsPatient = p.Patient != null }));
+		}
+
+		[Test]
+		public void BoolResult2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { IsPatient = Sql.AsSql(p.Patient != null) },
+				from p in db.Person select new { IsPatient = Sql.AsSql(p.Patient != null) }));
+		}
+
+		[Test]
+		public void BoolResult3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select Sql.AsSql(p.ID == 1),
+				from p in db.Person select Sql.AsSql(p.ID == 1)));
+		}
+
+		[Test]
+		public void GuidNew()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types where p.GuidValue != Guid.NewGuid() select p.GuidValue,
+				from p in db.Types where p.GuidValue != Guid.NewGuid() select p.GuidValue));
+		}
+
+		[Test]
+		public void Guid1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types where p.GuidValue == new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436") select p.GuidValue,
+				from p in db.Types where p.GuidValue == new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436") select p.GuidValue));
+		}
+
+		[Test]
+		public void Guid2()
+		{
+			var guid3 = new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436");
+			var guid4 = new Guid("40932fdb-1543-4e4a-ac2c-ca371604fb4b");
+
+			var parm = Expression.Parameter(typeof(LinqDataTypes), "p");
+
+			ForEachProvider(db =>
+				Assert.AreNotEqual(
+					db.Types
+						.Where(
+							Expression.Lambda<Func<LinqDataTypes,bool>>(
+								Expression.Equal(
+									Expression.PropertyOrField(parm, "GuidValue"),
+									Expression.Constant(guid3),
+									false,
+									typeof(Guid).GetMethod("op_Equality")),
+								new[] { parm }))
+						.Single().GuidValue,
+					db.Types
+						.Where(
+							Expression.Lambda<Func<LinqDataTypes,bool>>(
+								Expression.Equal(
+									Expression.PropertyOrField(parm, "GuidValue"),
+									Expression.Constant(guid4),
+									false,
+									typeof(Guid).GetMethod("op_Equality")),
+								new[] { parm }))
+						.Single().GuidValue)
+			);
+		}
+
+		[Test]
+		public void ContainsGuid()
+		{
+			var ids = new [] { new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436") };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Types where ids.Contains(p.GuidValue) select p.GuidValue,
+				from p in db.Types where ids.Contains(p.GuidValue) select p.GuidValue));
+		}
+
+		[Test]
+		public void NewGuid()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.Firebird, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access },
+				db =>
+				{
+					db.Types.Delete(_ => _.ID > 1000);
+					db.Types.Insert(() => new LinqDataTypes
+					{
+						ID            = 1001,
+						MoneyValue    = 1001,
+						DateTimeValue = Sql.CurrentTimestamp,
+						BoolValue     = true,
+						GuidValue     = Sql.NewGuid(),
+						BinaryValue   = new Binary(new byte[] { 1 }),
+						SmallIntValue = 1001
+					});
+
+					var guid = db.Types.Single(_ => _.ID == 1001).GuidValue;
+
+					Assert.AreEqual(1001, db.Types.Single(_ => _.GuidValue == guid).ID);
+
+					db.Types.Delete(_ => _.ID > 1000);
+				});
+		}
+
+        [Test]
+		public void BinaryLength()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db =>
+				{
+					db.Types
+						.Where(t => t.ID == 1)
+						.Set(t => t.BinaryValue, new Binary(new byte[] { 1, 2, 3, 4, 5 }))
+						.Update();
+
+					Assert.That(
+						(from t in db.Types where t.ID == 1 select t.BinaryValue.Length).First(),
+						Is.EqualTo(5));
+
+					db.Types
+						.Where(t => t.ID == 1)
+						.Set(t => t.BinaryValue, (Binary)null)
+						.Update();
+				});
+		}
+
+		[Test]
+		public void InsertBinary1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.Firebird, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access },
+				db =>
+				{
+					Binary data = null;
+
+					db.Types.Delete(_ => _.ID > 1000);
+					db.Types.Insert(() => new LinqDataTypes
+					{
+						ID          = 1001,
+						BinaryValue = data,
+						BoolValue   = true,
+					});
+					db.Types.Delete(_ => _.ID > 1000);
+				});
+		}
+
+		[Test]
+		public void UpdateBinary1()
+		{
+			ForEachProvider(db =>
+			{
+				db.Types
+					.Where(t => t.ID == 1)
+					.Set(t => t.BinaryValue, new Binary(new byte[] { 1, 2, 3, 4, 5 }))
+					.Update();
+
+				var g = from t in db.Types where t.ID == 1 select t.BinaryValue;
+
+				foreach (var binary in g)
+				{
+				}
+			});
+		}
+
+		[Test]
+		public void UpdateBinary2()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db =>
+			{
+				var ints     = new[] { 1, 2 };
+				var binaries = new[] { new byte[] { 1, 2, 3, 4, 5 }, new byte[] { 5, 4, 3, 2, 1 } };
+
+				for (var i = 1; i <= 2; i++)
+				{
+					db.Types
+						.Where(t => t.ID == ints[i - 1])
+						.Set(t => t.BinaryValue, binaries[i - 1])
+						.Update();
+				}
+
+				var g = from t in db.Types where new[] { 1, 2 }.Contains(t.ID) select t;
+
+				foreach (var binary in g)
+					Assert.AreEqual(binaries[binary.ID - 1], binary.BinaryValue.ToArray());
+			});
+		}
+
+		[Test]
+		public void DateTime1()
+		{
+			var dt = Types2[3].DateTimeValue;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where t.DateTimeValue.Value.Date > dt.Value.Date select t,
+				from t in db.Types2 where t.DateTimeValue.Value.Date > dt.Value.Date select t));
+		}
+
+		[Test]
+		public void DateTime21([DataContexts(ProviderName.SQLite)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue;
+				var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+
+				db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue = dt });
+
+				var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue;
+
+				db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue = pdt });
+
+				Assert.AreNotEqual(dt.Ticks, dt2.Value.Ticks);
+			}
+		}
+
+		[Test]
+		public void DateTime22()
+		{
+			ForEachProvider(
+				new[]
+				{
+					ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.DB2, ProviderName.Informix,
+					ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.Sybase
+				},
+				db =>
+				{
+					var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+					var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = dt });
+
+					var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = pdt });
+
+					Assert.AreEqual(dt, dt2);
+				});
+		}
+
+		[Test]
+		public void DateTime23()
+		{
+			ForEachProvider(
+				new[]
+				{
+					ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.DB2, ProviderName.Informix,
+					ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.Sybase
+				},
+				db =>
+				{
+					var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+					var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+
+					db.Types2
+						.Where(t => t.ID == 1)
+						.Set  (_ => _.DateTimeValue2, dt)
+						.Update();
+
+					var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = pdt });
+
+					Assert.AreEqual(dt, dt2);
+				});
+		}
+
+		[Test]
+		public void DateTime24()
+		{
+			ForEachProvider(
+				new[]
+				{
+					ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.DB2, ProviderName.Informix,
+					ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.Sybase
+				},
+				db =>
+				{
+					var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+					var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+					var tt  = db.Types2.First(t => t.ID == 1);
+
+					tt.DateTimeValue2 = dt;
+
+					db.Update(tt);
+
+					var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = pdt });
+
+					Assert.AreEqual(dt, dt2);
+				});
+		}
+
+		[Test]
+		public void DateTimeArray1()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from t in    Types2 where new DateTime?[] { new DateTime(2001, 1, 11, 1, 11, 21, 100) }.Contains(t.DateTimeValue) select t,
+					from t in db.Types2 where new DateTime?[] { new DateTime(2001, 1, 11, 1, 11, 21, 100) }.Contains(t.DateTimeValue) select t));
+		}
+
+        [Test]
+		public void DateTimeArray2()
+		{
+			var arr = new DateTime?[] { new DateTime(2001, 1, 11, 1, 11, 21, 100), new DateTime(2012, 11, 7, 19, 19, 29, 90) };
+
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db =>
+					AreEqual(
+						from t in    Types2 where arr.Contains(t.DateTimeValue) select t,
+						from t in db.Types2 where arr.Contains(t.DateTimeValue) select t));
+		}
+
+        [Test]
+		public void DateTimeArray3()
+		{
+			var arr = new List<DateTime?> { new DateTime(2001, 1, 11, 1, 11, 21, 100) };
+
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db =>
+					AreEqual(
+						from t in    Types2 where arr.Contains(t.DateTimeValue) select t,
+						from t in db.Types2 where arr.Contains(t.DateTimeValue) select t));
+		}
+
+		[Test]
+		public void DateTimeParams()
+		{
+			var arr = new List<DateTime?>
+			{
+				new DateTime(1992, 1, 11, 1, 11, 21, 100),
+				new DateTime(1993, 1, 11, 1, 11, 21, 100)
+			};
+
+			ForEachProvider(
+				db =>
+				{
+					foreach (var dateTime in arr)
+					{
+						var dt = DateTimeParams(db, dateTime);
+						Assert.AreEqual(dateTime, dt);
+					}
+				});
+		}
+
+		static DateTime DateTimeParams(ITestDataContext db, DateTime? dateTime)
+		{
+			var q =
+				from t in db.Types2
+				where t.DateTimeValue > dateTime
+				select new
+					{
+						t.DateTimeValue,
+						dateTime.Value
+					};
+
+			return q.First().Value;
+		}
+
+		[Test]
+		public void Nullable()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Value = p.Value1.GetValueOrDefault() },
+				from p in db.Parent select new { Value = p.Value1.GetValueOrDefault() }));
+		}
+
+		[Test]
+		public void Unicode()
+		{
+			ForEachProvider(new[] { "DevartOracle", ProviderName.Informix, ProviderName.Firebird, ProviderName.Sybase }, db =>
+			{
+				try
+				{
+					db.Person.Delete(p => p.ID > 2);
+
+					var id =
+						db.Person
+							.InsertWithIdentity(() => new Person
+							{
+								FirstName = "擊敗奴隸",
+								LastName  = "Юникодкин",
+								Gender    = Gender.Male
+							});
+
+					Assert.NotNull(id);
+
+					var person = db.Person.Single(p => p.FirstName == "擊敗奴隸" && p.LastName == "Юникодкин");
+
+					Assert.NotNull (person);
+					Assert.AreEqual(id, person.ID);
+					Assert.AreEqual("擊敗奴隸", person.FirstName);
+					Assert.AreEqual("Юникодкин", person.LastName);
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void TestCultureInfo([DataContexts] string context)
+		{
+			var current = Thread.CurrentThread.CurrentCulture;
+
+			Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
+
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from t in    Types where t.MoneyValue > 0.5m select t,
+					from t in db.Types where t.MoneyValue > 0.5m select t);
+
+			Thread.CurrentThread.CurrentCulture = current;
+		}
+
+		[Test]
+		public void SmallInt()
+		{
+			ForEachProvider(db => AreEqual(
+				from t1 in Types
+				join t2 in Types on t1.SmallIntValue equals t2.ID
+				select t1,
+				from t1 in db.Types
+				join t2 in db.Types on t1.SmallIntValue equals t2.ID
+				select t1)
+			);
+		}
+
+		[TableName("Person")]
+		public class PersonCharTest
+		{
+			public int    PersonID;
+			public string FirstName;
+			public string LastName;
+			public string MiddleName;
+			public char   Gender;
+		}
+
+		[Test]
+		public void CharTest1()
+		{
+			List<PersonCharTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonCharTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where p.Gender == 'M' select p.PersonID,
+				from p in db.GetTable<PersonCharTest>() where p.Gender == 'M' select p.PersonID));
+		}
+
+		[Test]
+		public void CharTest2()
+		{
+			List<PersonCharTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonCharTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where 'M' == p.Gender select p.PersonID,
+				from p in db.GetTable<PersonCharTest>() where 'M' == p.Gender select p.PersonID));
+		}
+
+		[TableName("Person")]
+		public class PersonBoolTest
+		{
+			public int    PersonID;
+			public string FirstName;
+			public string LastName;
+			public string MiddleName;
+			[MapField("Gender"), MapValue(true, "M"), MapValue(false, "F")]
+			public bool   IsMale;
+		}
+
+		//[Test]
+		public void BoolTest1()
+		{
+			List<PersonBoolTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonBoolTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where p.IsMale select p.PersonID,
+				from p in db.GetTable<PersonBoolTest>() where p.IsMale select p.PersonID));
+		}
+
+		//[Test]
+		public void BoolTest2()
+		{
+			List<PersonBoolTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonBoolTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where p.IsMale == true select p.PersonID,
+				from p in db.GetTable<PersonBoolTest>() where p.IsMale == true select p.PersonID));
+		}
+
+		[Test]
+		public void BoolTest31()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where (t.BoolValue ?? false) select t,
+				from t in db.Types2 where t.BoolValue.Value      select t));
+		}
+
+		[Test]
+		public void BoolTest32()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where (t.BoolValue ?? false) select t,
+				from t in db.Types2 where t.BoolValue == true    select t));
+		}
+
+		[Test]
+		public void BoolTest33()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where (t.BoolValue ?? false) select t,
+				from t in db.Types2 where true == t.BoolValue    select t));
+		}
+
+		[Test]
+		public void LongTest1()
+		{
+			ForEachProvider(db =>
+			{
+				uint value = 0;
+
+				var q =
+					from t in db.Types2
+					where t.BigIntValue == value
+					select t;
+
+				q.ToList();
+			});
+		}
+
+		[Test]
+		public void CompareNullableInt()
+		{
+			int? param = null;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Parent where param == null || t.Value1 == param select t,
+				from t in db.Parent where param == null || t.Value1 == param select t));
+
+			param = 1;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Parent where param == null || t.Value1 == param select t,
+				from t in db.Parent where param == null || t.Value1 == param select t));
+		}
+
+		[Test]
+		public void CompareNullableBoolean1()
+		{
+			bool? param = null;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types where param == null || t.BoolValue == param select t,
+				from t in db.Types where param == null || t.BoolValue == param select t));
+
+			param = true;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types where param == null || t.BoolValue == param select t,
+				from t in db.Types where param == null || t.BoolValue == param select t));
+		}
+
+		[Test]
+		public void CompareNullableBoolean2()
+		{
+			short? param1 = null;
+			bool?  param2 = null;
+
+			ForEachProvider(db => AreEqual(
+				from t1 in    Types
+				join t2 in    Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1,
+				from t1 in db.Types
+				join t2 in db.Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1));
+
+			//param1 = null;
+			param2 = false;
+
+			ForEachProvider(db => AreEqual(
+				from t1 in    Types
+				join t2 in    Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1,
+				from t1 in db.Types
+				join t2 in db.Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1));
+		}
+
+		[Test]
+		public void CompareNullableBoolean3()
+		{
+			short? param1 = null;
+			bool?  param2 = false;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types where (param1 == null || t.SmallIntValue == param1) && (param2 == null || t.BoolValue == param2) select t,
+				from t in db.Types where (param1 == null || t.SmallIntValue == param1) && (param2 == null || t.BoolValue == param2) select t));
+		}
+	}
+}