Mercurial > pub > bltoolkit
diff UnitTests/Linq/DeleteTest.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/DeleteTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,272 @@ +using System; +using System.Linq; + +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; + +using NUnit.Framework; + +using Data.Linq; +using Data.Linq.Model; + +#region ReSharper disable +// ReSharper disable ConvertToConstant.Local +// ReSharper disable CheckNamespace +#endregion + +namespace Update +{ + [TestFixture] + public class DeleteTest : TestBase + { + [Test] + public void Delete1() + { + ForEachProvider(db => + { + var parent = new Parent1 { ParentID = 1001, Value1 = 1001 }; + + db.Delete(parent); + + try + { + db.Insert(parent); + + Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID)); + Assert.AreEqual(1, db.Parent.Delete(p => p.ParentID == parent.ParentID)); + Assert.AreEqual(0, db.Parent.Count (p => p.ParentID == parent.ParentID)); + } + finally + { + db.Delete(parent); + } + }); + } + + [Test] + public void Delete2() + { + ForEachProvider(db => + { + var parent = new Parent1 { ParentID = 1001, Value1 = 1001 }; + + db.Delete(parent); + + try + { + db.Insert(parent); + + Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID)); + Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == parent.ParentID).Delete()); + Assert.AreEqual(0, db.Parent.Count(p => p.ParentID == parent.ParentID)); + } + finally + { + db.Delete(parent); + } + }); + } + + [Test] + public void Delete3() + { + ForEachProvider(new[] { ProviderName.Informix }, db => + { + db.Child.Delete(c => new[] { 1001, 1002 }.Contains(c.ChildID)); + + try + { + db.Child.Insert(() => new Child { ParentID = 1, ChildID = 1001 }); + db.Child.Insert(() => new Child { ParentID = 1, ChildID = 1002 }); + + Assert.AreEqual(3, db.Child.Count(c => c.ParentID == 1)); + Assert.AreEqual(2, db.Child.Where(c => c.Parent.ParentID == 1 && new[] { 1001, 1002 }.Contains(c.ChildID)).Delete()); + Assert.AreEqual(1, db.Child.Count(c => c.ParentID == 1)); + } + finally + { + db.Child.Delete(c => new[] { 1001, 1002 }.Contains(c.ChildID)); + } + }); + } + + [Test] + public void Delete4() + { + ForEachProvider(new[] { ProviderName.Informix }, db => + { + db.GrandChild1.Delete(gc => new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value)); + + try + { + db.GrandChild.Insert(() => new GrandChild { ParentID = 1, ChildID = 1, GrandChildID = 1001 }); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1, ChildID = 2, GrandChildID = 1002 }); + + Assert.AreEqual(3, db.GrandChild1.Count(gc => gc.ParentID == 1)); + Assert.AreEqual(2, db.GrandChild1.Where(gc => gc.Parent.ParentID == 1 && new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value)).Delete()); + Assert.AreEqual(1, db.GrandChild1.Count(gc => gc.ParentID == 1)); + } + finally + { + db.GrandChild1.Delete(gc => new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value)); + } + }); + } + + [Test] + public void Delete5() + { + ForEachProvider(db => + { + var values = new[] { 1001, 1002 }; + + db.Parent.Delete(_ => _.ParentID > 1000); + + try + { + db.Parent.Insert(() => new Parent { ParentID = values[0], Value1 = 1 }); + db.Parent.Insert(() => new Parent { ParentID = values[1], Value1 = 1 }); + + Assert.AreEqual(2, db.Parent.Count(_ => _.ParentID > 1000)); + Assert.AreEqual(2, db.Parent.Delete(_ => values.Contains(_.ParentID))); + Assert.AreEqual(0, db.Parent.Count(_ => _.ParentID > 1000)); + } + finally + { + db.Parent.Delete(_ => _.ParentID > 1000); + } + }); + } + + [Test] + public void AlterDelete([DataContexts(ProviderName.Informix, ExcludeLinqService=true)] string context) + { + using (var db = GetDataContext(context)) + { + var q = + from p in db.Parent + join ch in db.Child on p.ParentID equals ch.ParentID into lj1 + from ch in lj1.DefaultIfEmpty() + where ch != null && ch.ParentID == -1 || ch == null && p.ParentID == -1 + select p; + + q.Delete(); + + var sql = ((TestDbManager)db).LastQuery; + + if (sql.Contains("EXISTS")) + Assert.That(sql.IndexOf("(("), Is.GreaterThan(0)); + } + } + + [Test] + public void DeleteMany1([DataContexts( + ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle", + ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird + )] string context) + { + using (var db = GetDataContext(context)) + { + db.Parent.Insert(() => new Parent { ParentID = 1001 }); + db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 1 }); + db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 2 }); + + try + { + var q = + from p in db.Parent + where p.ParentID >= 1000 + select p; + + var n = q.SelectMany(p => p.Children).Delete(); + + Assert.That(n, Is.GreaterThanOrEqualTo(2)); + } + finally + { + db.Child. Delete(c => c.ParentID >= 1000); + db.Parent.Delete(c => c.ParentID >= 1000); + } + } + } + + [Test] + public void DeleteMany2([DataContexts( + ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle", + ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird + )] string context) + { + using (var db = GetDataContext(context)) + { + db.Parent. Insert(() => new Parent { ParentID = 1001 }); + db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 1 }); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 1}); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 2}); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 3}); + db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 2 }); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 1}); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 2}); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 3}); + + try + { + var q = + from p in db.Parent + where p.ParentID >= 1000 + select p; + + var n1 = q.SelectMany(p => p.Children.SelectMany(c => c.GrandChildren)).Delete(); + var n2 = q.SelectMany(p => p.Children). Delete(); + + Assert.That(n1, Is.EqualTo(6)); + Assert.That(n2, Is.EqualTo(2)); + } + finally + { + db.GrandChild.Delete(c => c.ParentID >= 1000); + db.Child. Delete(c => c.ParentID >= 1000); + db.Parent. Delete(c => c.ParentID >= 1000); + } + } + } + + [Test] + public void DeleteMany3([DataContexts( + ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle", + ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird + )] string context) + { + var ids = new[] { 1001 }; + + using (var db = GetDataContext(context)) + { + db.GrandChild.Delete(c => c.ParentID >= 1000); + db.Child. Delete(c => c.ParentID >= 1000); + db.Parent. Delete(c => c.ParentID >= 1000); + + db.Parent. Insert(() => new Parent { ParentID = 1001 }); + db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 1 }); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 1}); + db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 2}); + + try + { + var q = + from p in db.Parent + where ids.Contains(p.ParentID) + select p; + + var n1 = q.SelectMany(p => p.Children).SelectMany(gc => gc.GrandChildren).Delete(); + + Assert.That(n1, Is.EqualTo(2)); + } + finally + { + db.GrandChild.Delete(c => c.ParentID >= 1000); + db.Child. Delete(c => c.ParentID >= 1000); + db.Parent. Delete(c => c.ParentID >= 1000); + } + } + } + } +}