Mercurial > pub > bltoolkit
diff UnitTests/Linq/InsertTest.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/InsertTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,1012 @@ +using System; +using System.Linq; + +using BLToolkit.Data; +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; +using BLToolkit.Data.Sql.SqlProvider; +using BLToolkit.DataAccess; +using BLToolkit.Mapping; + +using NUnit.Framework; + +using Data.Linq; +using Data.Linq.Model; + +#region ReSharper disable +// ReSharper disable ConvertToConstant.Local +#endregion + +namespace Update +{ + [TestFixture] + public class InsertTest : TestBase + { + [Test] + public void DistinctInsert1() + { + ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db => + { + try + { + db.Types.Delete(c => c.ID > 1000); + + Assert.AreEqual( + Types.Select(_ => _.ID / 3).Distinct().Count(), + db + .Types + .Select(_ => Math.Floor(_.ID / 3.0)) + .Distinct() + .Insert(db.Types, _ => new LinqDataTypes + { + ID = (int)(_ + 1001), + GuidValue = Sql.NewGuid(), + BoolValue = true + })); + } + finally + { + db.Types.Delete(c => c.ID > 1000); + } + }); + } + + [Test] + public void DistinctInsert2() + { + ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db => + { + try + { + db.Types.Delete(c => c.ID > 1000); + + Assert.AreEqual( + Types.Select(_ => _.ID / 3).Distinct().Count(), + db.Types + .Select(_ => Math.Floor(_.ID / 3.0)) + .Distinct() + .Into(db.Types) + .Value(t => t.ID, t => (int)(t + 1001)) + .Value(t => t.GuidValue, t => Sql.NewGuid()) + .Value(t => t.BoolValue, t => true) + .Insert()); + } + finally + { + db.Types.Delete(c => c.ID > 1000); + } + }); + } + + [Test] + public void Insert1() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db.Child + .Insert(() => new Child + { + ParentID = 1, + ChildID = id + })); + + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert2() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db + .Into(db.Child) + .Value(c => c.ParentID, () => 1) + .Value(c => c.ChildID, () => id) + .Insert()); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert3() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db.Child + .Where(c => c.ChildID == 11) + .Insert(db.Child, c => new Child + { + ParentID = c.ParentID, + ChildID = id + })); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert31() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db.Child + .Where(c => c.ChildID == 11) + .Select(c => new Child + { + ParentID = c.ParentID, + ChildID = id + }) + .Insert(db.Child, c => c)); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert4() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db.Child + .Where(c => c.ChildID == 11) + .Into(db.Child) + .Value(c => c.ParentID, c => c.ParentID) + .Value(c => c.ChildID, () => id) + .Insert()); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert5() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db.Child + .Where(c => c.ChildID == 11) + .Into(db.Child) + .Value(c => c.ParentID, c => c.ParentID) + .Value(c => c.ChildID, id) + .Insert()); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert6() + { + ForEachProvider(db => + { + try + { + db.Parent.Delete(p => p.Value1 == 11); + + Assert.AreEqual(1, + db.Child + .Where(c => c.ChildID == 11) + .Into(db.Parent) + .Value(p => p.ParentID, c => c.ParentID) + .Value(p => p.Value1, c => (int?)c.ChildID) + .Insert()); + Assert.AreEqual(1, db.Parent.Count(p => p.Value1 == 11)); + } + finally + { + db.Parent.Delete(p => p.Value1 == 11); + } + }); + } + + [Test] + public void Insert7() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db + .Child + .Value(c => c.ChildID, () => id) + .Value(c => c.ParentID, 1) + .Insert()); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert8() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child.Delete(c => c.ChildID > 1000); + + Assert.AreEqual(1, + db + .Child + .Value(c => c.ParentID, 1) + .Value(c => c.ChildID, () => id) + .Insert()); + Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); + } + finally + { + db.Child.Delete(c => c.ChildID > 1000); + } + }); + } + + [Test] + public void Insert9() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Child. Delete(c => c.ParentID > 1000); + db.Parent.Delete(p => p.ParentID > 1000); + + db.Insert(new Parent { ParentID = id, Value1 = id }); + + Assert.AreEqual(1, + db.Parent + .Where(p => p.ParentID == id) + .Insert(db.Child, p => new Child + { + ParentID = p.ParentID, + ChildID = p.ParentID, + })); + Assert.AreEqual(1, db.Child.Count(c => c.ParentID == id)); + } + finally + { + db.Child. Delete(c => c.ParentID > 1000); + db.Parent.Delete(p => p.ParentID > 1000); + } + }); + } + + [TableName("LinqDataTypes")] + public class LinqDataTypesArrayTest + { + public int ID; + public decimal MoneyValue; + public DateTime DateTimeValue; + public bool BoolValue; + public Guid GuidValue; + public byte[] BinaryValue; + public short SmallIntValue; + } + + [Test] + public void InsertArray1() + { + ForEachProvider(db => + { + try + { + var types = db.GetTable<LinqDataTypesArrayTest>(); + + types.Delete(t => t.ID > 1000); + types.Insert(() => new LinqDataTypesArrayTest { ID = 1001, BoolValue = true, BinaryValue = null }); + + Assert.IsNull(types.Single(t => t.ID == 1001).BinaryValue); + } + finally + { + db.GetTable<LinqDataTypesArrayTest>().Delete(t => t.ID > 1000); + } + }); + } + + [Test] + public void InsertArray2() + { + ForEachProvider(db => + { + try + { + var types = db.GetTable<LinqDataTypesArrayTest>(); + + types.Delete(t => t.ID > 1000); + + byte[] arr = null; + + types.Insert(() => new LinqDataTypesArrayTest { ID = 1001, BoolValue = true, BinaryValue = arr }); + + var res = types.Single(t => t.ID == 1001).BinaryValue; + + Assert.IsNull(res); + } + finally + { + db.GetTable<LinqDataTypesArrayTest>().Delete(t => t.ID > 1000); + } + }); + } + + [Test] + public void InsertUnion1() + { + Child.Count(); + + ForEachProvider( + db => + { + db.Parent.Delete(p => p.ParentID > 1000); + + try + { + var q = + db.Child. Select(c => new Parent { ParentID = c.ParentID, Value1 = (int) Math.Floor(c.ChildID / 10.0) }).Union( + db.GrandChild.Select(c => new Parent { ParentID = c.ParentID ?? 0, Value1 = (int?)Math.Floor((c.GrandChildID ?? 0) / 100.0) })); + + q.Insert(db.Parent, p => new Parent + { + ParentID = p.ParentID + 1000, + Value1 = p.Value1 + }); + + Assert.AreEqual( + Child. Select(c => new { ParentID = c.ParentID }).Union( + GrandChild.Select(c => new { ParentID = c.ParentID ?? 0 })).Count(), + db.Parent.Count(c => c.ParentID > 1000)); + } + finally + { + db.Parent.Delete(p => p.ParentID > 1000); + } + }); + } + + [Test] + public void InsertEnum1() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Parent4.Delete(_ => _.ParentID > 1000); + + var p = new Parent4 + { + ParentID = id, + Value1 = TypeValue.Value2 + }; + + Assert.AreEqual(1, + db.Parent4 + .Insert(() => new Parent4 + { + ParentID = 1001, + Value1 = p.Value1 + })); + + Assert.AreEqual(1, db.Parent4.Count(_ => _.ParentID == id && _.Value1 == p.Value1)); + } + finally + { + db.Parent4.Delete(_ => _.ParentID > 1000); + } + }); + } + + [Test] + public void InsertEnum2() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Parent4.Delete(_ => _.ParentID > 1000); + + Assert.AreEqual(1, + db.Parent4 + .Value(_ => _.ParentID, id) + .Value(_ => _.Value1, TypeValue.Value1) + .Insert()); + + Assert.AreEqual(1, db.Parent4.Count(_ => _.ParentID == id)); + } + finally + { + db.Parent4.Delete(_ => _.ParentID > 1000); + } + }); + } + + [Test] + public void InsertEnum3() + { + ForEachProvider(db => + { + try + { + var id = 1001; + + db.Parent4.Delete(_ => _.ParentID > 1000); + + Assert.AreEqual(1, + db.Parent4 + .Value(_ => _.ParentID, id) + .Value(_ => _.Value1, () => TypeValue.Value1) + .Insert()); + + Assert.AreEqual(1, db.Parent4.Count(_ => _.ParentID == id)); + } + finally + { + db.Parent4.Delete(_ => _.ParentID > 1000); + } + }); + } + + [Test] + public void InsertNull() + { + ForEachProvider(db => + { + try + { + db.Parent.Delete(p => p.ParentID == 1001); + + Assert.AreEqual(1, + db + .Into(db.Parent) + .Value(p => p.ParentID, 1001) + .Value(p => p.Value1, (int?)null) + .Insert()); + Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == 1001)); + } + finally + { + db.Parent.Delete(p => p.Value1 == 1001); + } + }); + } + + [Test] + public void InsertWithIdentity1() + { + ForEachProvider(db => + { + try + { + db.Person.Delete(p => p.ID > 2); + + var id = + db.Person + .InsertWithIdentity(() => new Person + { + FirstName = "John", + LastName = "Shepard", + Gender = Gender.Male + }); + + Assert.NotNull(id); + + var john = db.Person.Single(p => p.FirstName == "John" && p.LastName == "Shepard"); + + Assert.NotNull (john); + Assert.AreEqual(id, john.ID); + } + finally + { + db.Person.Delete(p => p.ID > 2); + } + }); + } + + [Test] + public void InsertWithIdentity2() + { + ForEachProvider(db => + { + try + { + db.Person.Delete(p => p.ID > 2); + + var id = db + .Into(db.Person) + .Value(p => p.FirstName, () => "John") + .Value(p => p.LastName, () => "Shepard") + .Value(p => p.Gender, () => Gender.Male) + .InsertWithIdentity(); + + Assert.NotNull(id); + + var john = db.Person.Single(p => p.FirstName == "John" && p.LastName == "Shepard"); + + Assert.NotNull (john); + Assert.AreEqual(id, john.ID); + } + finally + { + db.Person.Delete(p => p.ID > 2); + } + }); + } + + [Test] + public void InsertWithIdentity3() + { + ForEachProvider(db => + { + try + { + db.Person.Delete(p => p.ID > 2); + + var id = db + .Into(db.Person) + .Value(p => p.FirstName, "John") + .Value(p => p.LastName, "Shepard") + .Value(p => p.Gender, Gender.Male) + .InsertWithIdentity(); + + Assert.NotNull(id); + + var john = db.Person.Single(p => p.FirstName == "John" && p.LastName == "Shepard"); + + Assert.NotNull (john); + Assert.AreEqual(id, john.ID); + } + finally + { + db.Person.Delete(p => p.ID > 2); + } + }); + } + + [Test] + public void InsertWithIdentity4() + { + ForEachProvider(db => + { + try + { + for (var i = 0; i < 2; i++) + { + db.Person.Delete(p => p.ID > 2); + + var id = db.InsertWithIdentity( + new Person + { + FirstName = "John" + i, + LastName = "Shepard", + Gender = Gender.Male + }); + + Assert.NotNull(id); + + var john = db.Person.Single(p => p.FirstName == "John" + i && p.LastName == "Shepard"); + + Assert.NotNull (john); + Assert.AreEqual(id, john.ID); + } + } + finally + { + db.Person.Delete(p => p.ID > 2); + } + }); + } + + [Test] + public void InsertWithIdentity5() + { + ForEachProvider(db => + { + try + { + for (var i = 0; i < 2; i++) + { + db.Person.Delete(p => p.ID > 2); + + var person = new Person + { + FirstName = "John" + i, + LastName = "Shepard", + Gender = Gender.Male + }; + + var id = db.InsertWithIdentity(person); + + Assert.NotNull(id); + + var john = db.Person.Single(p => p.FirstName == "John" + i && p.LastName == "Shepard"); + + Assert.NotNull (john); + Assert.AreEqual(id, john.ID); + } + } + finally + { + db.Person.Delete(p => p.ID > 2); + } + }); + } + + [Test] + public void InsertOrUpdate1() + { + ForEachProvider(db => + { + var id = 0; + + try + { + id = Convert.ToInt32(db.Person.InsertWithIdentity(() => new Person + { + FirstName = "John", + LastName = "Shepard", + Gender = Gender.Male + })); + + for (var i = 0; i < 3; i++) + { + db.Patient.InsertOrUpdate( + () => new Patient + { + PersonID = id, + Diagnosis = "abc", + }, + p => new Patient + { + Diagnosis = (p.Diagnosis.Length + i).ToString(), + }); + } + + Assert.AreEqual("3", db.Patient.Single(p => p.PersonID == id).Diagnosis); + } + finally + { + db.Patient.Delete(p => p.PersonID == id); + db.Person. Delete(p => p.ID == id); + } + }); + } + + [Test] + public void InsertOrReplace1() + { + ForEachProvider(db => + { + var id = 0; + + try + { + id = Convert.ToInt32(db.Person.InsertWithIdentity(() => new Person + { + FirstName = "John", + LastName = "Shepard", + Gender = Gender.Male + })); + + for (var i = 0; i < 3; i++) + { + db.InsertOrReplace(new Patient + { + PersonID = id, + Diagnosis = ("abc" + i).ToString(), + }); + } + + Assert.AreEqual("abc2", db.Patient.Single(p => p.PersonID == id).Diagnosis); + } + finally + { + db.Patient.Delete(p => p.PersonID == id); + db.Person. Delete(p => p.ID == id); + } + }); + } + + [Test] + public void InsertOrUpdate3() + { + ForEachProvider(db => + { + var id = 0; + + try + { + id = Convert.ToInt32(db.Person.InsertWithIdentity(() => new Person + { + FirstName = "John", + LastName = "Shepard", + Gender = Gender.Male + })); + + var diagnosis = "abc"; + + for (var i = 0; i < 3; i++) + { + db.Patient.InsertOrUpdate( + () => new Patient + { + PersonID = id, + Diagnosis = "abc", + }, + p => new Patient + { + Diagnosis = (p.Diagnosis.Length + i).ToString(), + }, + () => new Patient + { + PersonID = id, + //Diagnosis = diagnosis, + }); + + diagnosis = (diagnosis.Length + i).ToString(); + } + + Assert.AreEqual("3", db.Patient.Single(p => p.PersonID == id).Diagnosis); + } + finally + { + db.Patient.Delete(p => p.PersonID == id); + db.Person. Delete(p => p.ID == id); + } + }); + } + + [Test] + public void InsertBatch1() + { + ForEachProvider(new[] { ProviderName.PostgreSQL }, db => + { + if (db is DbManager && ((DbManager)db).ConfigurationString == "Oracle") + { + db.Types2.Delete(_ => _.ID > 1000); + + ((DbManager)db).InsertBatch(1, new[] + { + new LinqDataTypes2 { ID = 1003, MoneyValue = 0m, DateTimeValue = null, BoolValue = true, GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue = null, IntValue = null }, + new LinqDataTypes2 { ID = 1004, MoneyValue = 0m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null, SmallIntValue = 2, IntValue = 1532334 }, + }); + + db.Types2.Delete(_ => _.ID > 1000); + } + }); + } + + [Test] + public void InsertBatch2([IncludeDataContexts("Sql2008", "Sql2012")] string context) + { + using (var db = new TestDbManager(context)) + { + db.Types2.Delete(_ => _.ID > 1000); + + db.InsertBatch(100, new[] + { + new LinqDataTypes2 { ID = 1003, MoneyValue = 0m, DateTimeValue = null, BoolValue = true, GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue = null, IntValue = null }, + new LinqDataTypes2 { ID = 1004, MoneyValue = 0m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null, SmallIntValue = 2, IntValue = 1532334 }, + }); + + db.Types2.Delete(_ => _.ID > 1000); + } + } + + [TableName("Parent")] + public class NullableFieldTestObject + { + public int ParentID; + [BLToolkit.Mapping.Nullable] public int Value1; + } + + [Test] + public void NullableFieldTest() + { + ForEachProvider(db => + { + db.Parent.Delete(p => p.ParentID == 1100); + + db.Insert(new NullableFieldTestObject { ParentID = 1100 }); + + var parent = db.Parent.Single(p => p.ParentID == 1100); + + Assert.IsNull(parent.Value1); + }); + } + + public class FullName + { + public string FirstName { get; set; } + public string LastName; + [Nullable] public string MiddleName; + } + + [TableName("Person")] + [MapField("FirstName", "Name.FirstName")] + [MapField("LastName", "Name.LastName")] + [MapField("MiddleName", "Name.MiddleName")] + public class TestPerson1 + { + [Identity, PrimaryKey] + //[SequenceName("PostgreSQL", "Seq")] + [SequenceName("Firebird", "PersonID")] + [MapField("PersonID")] + public int ID; + + public string Gender; + + public FullName Name; + } + + [Test] + public void Insert11() + { + var p = new TestPerson1 { Name = new FullName { FirstName = "fn", LastName = "ln" }, Gender = "M" }; + + ForEachProvider(db => db.Insert(p)); + } + + [Test] + public void Insert12() + { + ForEachProvider(db => db + .Into(db.GetTable<TestPerson1>()) + .Value(_ => _.Name.FirstName, "FirstName") + .Value(_ => _.Name.LastName, () => "LastName") + .Value(_ => _.Gender, "F") + .Insert()); + + } + + [Test] + public void Insert13() + { + ForEachProvider(db => db.GetTable<TestPerson1>() + .Insert(() => new TestPerson1 + { + Name = new FullName + { + FirstName = "FirstName", + LastName = "LastName" + }, + Gender = "M", + })); + } + + [Test] + public void Insert14() + { + ForEachProvider( + new [] { ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.Sybase }, + db => + { + try + { + db.Person.Delete(p => p.FirstName.StartsWith("Insert14")); + + Assert.AreEqual(1, + db.Person + .Insert(() => new Person + { + FirstName = "Insert14" + db.Person.Where(p => p.ID == 1).Select(p => p.FirstName).FirstOrDefault(), + LastName = "Shepard", + Gender = Gender.Male + })); + + Assert.AreEqual(1, db.Person.Count(p => p.FirstName.StartsWith("Insert14"))); + } + finally + { + db.Person.Delete(p => p.FirstName.StartsWith("Insert14")); + } + }); + } + + [Test] + public void InsertSingleIdentity() + { + ForEachProvider( + new [] { ProviderName.Informix, ProviderName.SqlCe }, + db => + { + try + { + db.TestIdentity.Delete(); + + var id = db.TestIdentity.InsertWithIdentity(() => new TestIdentity {}); + + Assert.NotNull(id); + } + finally + { + db.TestIdentity.Delete(); + } + }); + } + } +}