Mercurial > pub > bltoolkit
diff UnitTests/Linq/ElementOperationTest.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/ElementOperationTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,223 @@ +using System.Linq; + +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; +using NUnit.Framework; + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class ElementOperationTest : TestBase + { + [Test] + public void First() + { + ForEachProvider(db => Assert.AreEqual( + Parent.OrderByDescending(p => p.ParentID).First().ParentID, + db.Parent.OrderByDescending(p => p.ParentID).First().ParentID)); + } + + [Test] + public void FirstWhere() + { + ForEachProvider(db => Assert.AreEqual(2, db.Parent.First(p => p.ParentID == 2).ParentID)); + } + + [Test] + public void FirstOrDefault() + { + ForEachProvider(db => Assert.IsNull((from p in db.Parent where p.ParentID == 100 select p).FirstOrDefault())); + } + + [Test] + public void FirstOrDefaultWhere() + { + ForEachProvider(db => Assert.AreEqual(2, db.Parent.FirstOrDefault(p => p.ParentID == 2).ParentID)); + } + + [Test] + public void Single() + { + ForEachProvider(db => Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == 1).Single().ParentID)); + } + + [Test] + public void SingleWhere() + { + ForEachProvider(db => Assert.AreEqual(2, db.Parent.Single(p => p.ParentID == 2).ParentID)); + } + + [Test] + public void SingleOrDefault() + { + ForEachProvider(db => Assert.IsNull((from p in db.Parent where p.ParentID == 100 select p).SingleOrDefault())); + } + + [Test] + public void SingleOrDefaultWhere() + { + ForEachProvider(db => Assert.AreEqual(2, db.Parent.SingleOrDefault(p => p.ParentID == 2).ParentID)); + } + + [Test] + public void FirstOrDefaultScalar() + { + ForEachProvider(db => Assert.AreEqual( + Parent.OrderBy(p => p.ParentID).FirstOrDefault().ParentID, + db.Parent.OrderBy(p => p.ParentID).FirstOrDefault().ParentID)); + } + + [Test] + public void NestedFirstOrDefaultScalar1() + { + ForEachProvider(new[] { ProviderName.Informix, ProviderName.Sybase }, db => AreEqual( + from p in Parent select Child.FirstOrDefault().ChildID, + from p in db.Parent select db.Child.FirstOrDefault().ChildID)); + } + + [Test] + public void NestedFirstOrDefaultScalar2() + { + ForEachProvider( + new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.Sybase }, db => + AreEqual( + from p in Parent + select new + { + p.ParentID, + MaxChild = + Child + .Where(c => c.Parent == p) + .OrderByDescending(c => c.ChildID * c.ParentID) + .FirstOrDefault() == null ? + 0 : + Child + .Where(c => c.Parent == p) + .OrderByDescending(c => c.ChildID * c.ParentID) + .FirstOrDefault() + .ChildID + }, + from p in db.Parent + select new + { + p.ParentID, + MaxChild = db.Child + .Where(c => c.Parent == p) + .OrderByDescending(c => c.ChildID * c.ParentID) + .FirstOrDefault() + .ChildID + })); + } + + [Test] + public void NestedFirstOrDefault1() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + db => AreEqual( + from p in Parent select Child.FirstOrDefault(), + from p in db.Parent select db.Child.FirstOrDefault())); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void NestedFirstOrDefault2() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + db => AreEqual( + from p in Parent select p.Children.FirstOrDefault(), + from p in db.Parent select p.Children.FirstOrDefault())); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void NestedFirstOrDefault3() + { + ForEachProvider( + // Can be fixed. + new[] { ProviderName.Informix, ProviderName.Firebird }, + db => AreEqual( + from p in Parent select p.Children.Select(c => c.ParentID).Distinct().FirstOrDefault(), + from p in db.Parent select p.Children.Select(c => c.ParentID).Distinct().FirstOrDefault())); + } + + [Test] + public void NestedFirstOrDefault4() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + // Can be fixed. + new[] { ProviderName.Informix, ProviderName.Firebird, ProviderName.PostgreSQL }, + db => AreEqual( + from p in Parent select p.Children.Where(c => c.ParentID > 0).Distinct().FirstOrDefault(), + from p in db.Parent select p.Children.Where(c => c.ParentID > 0).Distinct().FirstOrDefault())); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void NestedFirstOrDefault5() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + db => AreEqual( + from p in GrandChild select p.Child.Parent.Children.FirstOrDefault(), + from p in db.GrandChild select p.Child.Parent.Children.FirstOrDefault())); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void NestedSingleOrDefault1() + { + ForEachProvider( + db => AreEqual( + from p in Parent select p.Children.Select(c => c.ParentID).Distinct().SingleOrDefault(), + from p in db.Parent select p.Children.Select(c => c.ParentID).Distinct().SingleOrDefault())); + } + + [Test] + public void FirstOrDefaultEntitySet([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + AreEqual( + Customer.Select(c => c.Orders.FirstOrDefault()), + db.Customer.Select(c => c.Orders.FirstOrDefault())); + } + } + + [Test] + public void NestedSingleOrDefaultTest([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + AreEqual( + Customer.Select(c => c.Orders.Take(1).SingleOrDefault()), + db.Customer.Select(c => c.Orders.Take(1).SingleOrDefault())); + } + } + + [Test] + public void MultipleQuery([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var q = + from p in db.Product + select db.Category.Select(zrp => zrp.CategoryName).FirstOrDefault(); + + q.ToList(); + } + } + } +}