Mercurial > pub > bltoolkit
diff UnitTests/Linq/Inheritance.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/Inheritance.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,544 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; +using BLToolkit.Data.Sql.SqlProvider; +using BLToolkit.DataAccess; +using BLToolkit.Mapping; + +using NUnit.Framework; + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class Inheritance : TestBase + { + [Test] + public void Test1() + { + ForEachProvider(db => AreEqual(ParentInheritance, db.ParentInheritance)); + } + + [Test] + public void Test2() + { + ForEachProvider(db => AreEqual(ParentInheritance, db.ParentInheritance.Select(p => p))); + } + + [Test] + public void Test3() + { + ForEachProvider(db => AreEqual( + from p in ParentInheritance where p is ParentInheritance1 select p, + from p in db.ParentInheritance where p is ParentInheritance1 select p)); + } + + [Test] + public void Test4() + { + ForEachProvider(db => AreEqual( + from p in ParentInheritance where !(p is ParentInheritanceNull) select p, + from p in db.ParentInheritance where !(p is ParentInheritanceNull) select p)); + } + + [Test] + public void Test5() + { + ForEachProvider(db => AreEqual( + from p in ParentInheritance where p is ParentInheritanceValue select p, + from p in db.ParentInheritance where p is ParentInheritanceValue select p)); + } + + [Test] + public void Test6() + { + ForEachProvider(db => + { + var q = from p in db.ParentInheritance2 where p is ParentInheritance12 select p; + q.ToList(); + }); + } + + [Test] + public void Test7() + { +#pragma warning disable 183 + var expected = from p in ParentInheritance where p is ParentInheritanceBase select p; + ForEachProvider(db => AreEqual(expected, from p in db.ParentInheritance where p is ParentInheritanceBase select p)); +#pragma warning restore 183 + } + + [Test] + public void Test8() + { + ForEachProvider(db => AreEqual( + ParentInheritance.OfType<ParentInheritance1>(), + db.ParentInheritance.OfType<ParentInheritance1>())); + } + + [Test] + public void Test9() + { + ForEachProvider(db => + AreEqual( + ParentInheritance + .Where(p => p.ParentID == 1 || p.ParentID == 2 || p.ParentID == 4) + .OfType<ParentInheritanceNull>(), + db.ParentInheritance + .Where(p => p.ParentID == 1 || p.ParentID == 2 || p.ParentID == 4) + .OfType<ParentInheritanceNull>())); + } + + [Test] + public void Test10() + { + var expected = ParentInheritance.OfType<ParentInheritanceValue>(); + ForEachProvider(db => AreEqual(expected, db.ParentInheritance.OfType<ParentInheritanceValue>())); + } + + [Test] + public void Test11() + { + ForEachProvider(db => + { + var q = from p in db.ParentInheritance3 where p is ParentInheritance13 select p; + q.ToList(); + }); + } + + [Test] + public void Test12() + { + ForEachProvider(db => AreEqual( + from p in ParentInheritance1 where p.ParentID == 1 select p, + from p in db.ParentInheritance1 where p.ParentID == 1 select p)); + } + + //[Test] + public void Test13() + { + ForEachProvider(db => AreEqual( + from p in ParentInheritance4 + join c in Child on p.ParentID equals c.ParentID + select p, + from p in db.ParentInheritance4 + join c in db.Child on p.ParentID equals c.ParentID + select p)); + } + + [Test] + public void TypeCastAsTest1([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + AreEqual( + DiscontinuedProduct.ToList() + .Select(p => p as Northwind.Product) + .Select(p => p == null ? "NULL" : p.ProductName), + db.DiscontinuedProduct + .Select(p => p as Northwind.Product) + .Select(p => p == null ? "NULL" : p.ProductName)); + } + + [Test] + public void TypeCastAsTest11([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + AreEqual( + DiscontinuedProduct.ToList() + .Select(p => new { p = p as Northwind.Product }) + .Select(p => p.p == null ? "NULL" : p.p.ProductName), + db.DiscontinuedProduct + .Select(p => new { p = p as Northwind.Product }) + .Select(p => p.p == null ? "NULL" : p.p.ProductName)); + } + + [Test] + public void TypeCastAsTest2([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + AreEqual( + Product.ToList() + .Select(p => p as Northwind.DiscontinuedProduct) + .Select(p => p == null ? "NULL" : p.ProductName), + db.Product + .Select(p => p as Northwind.DiscontinuedProduct) + .Select(p => p == null ? "NULL" : p.ProductName)); + } + + [Test] + public void FirstOrDefault([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + Assert.AreEqual( + DiscontinuedProduct.FirstOrDefault().ProductID, + db.DiscontinuedProduct.FirstOrDefault().ProductID); + } + + [Test] + public void Cast1() + { + ForEachProvider(db => AreEqual( + ParentInheritance.OfType<ParentInheritance1>().Cast<ParentInheritanceBase>(), + db.ParentInheritance.OfType<ParentInheritance1>().Cast<ParentInheritanceBase>())); + } + + class ParentEx : Parent + { + [MapIgnore] + protected bool Field1; + + public static void Test(Inheritance inheritance) + { + inheritance.ForEachProvider(db => inheritance.AreEqual( + inheritance.Parent.Select(p => new ParentEx { Field1 = true, ParentID = p.ParentID, Value1 = p.Value1 }).Cast<Parent>(), + db.Parent.Select(p => new ParentEx { Field1 = true, ParentID = p.ParentID, Value1 = p.Value1 }).Cast<Parent>())); + } + } + + [Test] + public void Cast2() + { + ParentEx.Test(this); + } + + [TableName("Person")] + class PersonEx : Person + { + } + + [Test] + public void SimplTest() + { + using (var db = new TestDbManager()) + Assert.AreEqual(1, db.GetTable<PersonEx>().Where(_ => _.FirstName == "John").Select(_ => _.ID).Single()); + } + + [InheritanceMapping(Code = 1, Type = typeof(Parent222))] + [TableName("Parent")] + public class Parent111 + { + [MapField(IsInheritanceDiscriminator = true)] + public int ParentID; + } + + [MapField("Value1", "Value.ID")] + public class Parent222 : Parent111 + { + [MapIgnore] + public Value111 Value; + } + + public class Value111 + { + public int ID; + } + + [Test] + public void InheritanceMappingIssueTest() + { + using (var db = new TestDbManager()) + { + var q1 = db.GetTable<Parent222>(); + var q = q1.Where(_ => _.Value.ID == 1); + + var sql = ((ExpressionQuery<Parent222>)q).SqlText; + Assert.IsNotEmpty(sql); + } + } + + [Test] + public void ReferenceNavigation([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var result = + from od in db.OrderDetail + where od.Product.Category.CategoryName == "Seafood" + select new { od.Order, od.Product }; + + var list = result.ToList(); + + Assert.AreEqual(330, list.Count); + + foreach (var item in list) + { + Assert.IsNotNull(item); + Assert.IsNotNull(item.Order); + Assert.IsNotNull(item.Product); + Assert.IsTrue( + item.Product.Discontinued && item.Product is Northwind.DiscontinuedProduct || + !item.Product.Discontinued && item.Product is Northwind.ActiveProduct); + } + } + } + + [Test] + public void TypeCastIsChildConditional1([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var result = db.Product. Select(x => x is Northwind.DiscontinuedProduct ? x : null); + var expected = db.Product.ToList().Select(x => x is Northwind.DiscontinuedProduct ? x : null); + + var list = result.ToList(); + + Assert.Greater(list.Count, 0); + Assert.AreEqual(expected.Count(), list.Count); + Assert.IsTrue(list.Except(expected).Count() == 0); + Assert.IsTrue(list.Contains(null)); + } + } + + [Test] + public void TypeCastIsChildConditional2([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var result = db.Product. Select(x => x is Northwind.DiscontinuedProduct); + var expected = db.Product.ToList().Select(x => x is Northwind.DiscontinuedProduct); + + var list = result.ToList(); + + Assert.Greater(list.Count, 0); + Assert.AreEqual(expected.Count(), list.Count); + Assert.IsTrue(list.Except(expected).Count() == 0); + } + } + + [Test] + public void TypeCastIsChild([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var result = db.Product.Where(x => x is Northwind.DiscontinuedProduct).ToList(); + var expected = Product.Where(x => x is Northwind.DiscontinuedProduct).ToList(); + + Assert.Greater(result.Count, 0); + Assert.AreEqual(result.Count, expected.Count); + } + } + + #region Models for Test14 + + interface IChildTest14 + { + int ChildID { get; set; } + } + + [TableName("Child")] + class ChildTest14 : IChildTest14 + { + [PrimaryKey] + public int ChildID { get; set; } + + } + + T FindById<T>(IQueryable<T> queryable, int id) + where T : IChildTest14 + { + return queryable.Where(x => x.ChildID == id).FirstOrDefault(); + } + + #endregion + + [Test] + public void Test14() + { + ForEachProvider(db => + { + var q = db.GetTable<ChildTest14>().Select(c => new ChildTest14() { ChildID = c.ChildID }); + FindById(q, 10); + }); + } + + [Test] + public void Test15([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var result = db.DiscontinuedProduct.Select(p => p).ToList(); + var expected = DiscontinuedProduct.Select(p => p).ToList(); + + Assert.That(result.Count, Is.Not.EqualTo(0).And.EqualTo(expected.Count)); + } + } + + [Test] + public void Test16([IncludeDataContexts("Northwind")] string context) + { + using (var db = new NorthwindDB()) + { + var result = db.DiscontinuedProduct.ToList(); + var expected = DiscontinuedProduct.ToList(); + + Assert.That(result.Count, Is.Not.EqualTo(0).And.EqualTo(expected.Count)); + } + } + + public enum TypeCodeEnum + { + Base, + A, + A1, + A2, + } + + [TableName("LinqDataTypes")] + public abstract class InheritanceBase + { + public Guid GuidValue { get; set; } + + [MapField("ID")] + public virtual TypeCodeEnum TypeCode + { + get { return TypeCodeEnum.Base; } + } + } + + [InheritanceMapping(Code = TypeCodeEnum.A1, Type = typeof(InheritanceA1), IsDefault = false)] + [InheritanceMapping(Code = TypeCodeEnum.A2, Type = typeof(InheritanceA2), IsDefault = true)] + public abstract class InheritanceA : InheritanceBase + { + [Association(CanBeNull = true, ThisKey = "GuidValue", OtherKey = "GuidValue")] + public List<InheritanceB> Bs { get; set; } + + [MapField("ID", IsInheritanceDiscriminator = true)] + public override TypeCodeEnum TypeCode + { + get { return TypeCodeEnum.A; } + } + } + + class InheritanceA1 : InheritanceA + { + [MapField("ID", IsInheritanceDiscriminator = true)] + public override TypeCodeEnum TypeCode + { + get { return TypeCodeEnum.A1; } + } + } + + class InheritanceA2 : InheritanceA + { + [MapField("ID", IsInheritanceDiscriminator = true)] + public override TypeCodeEnum TypeCode + { + get { return TypeCodeEnum.A2; } + } + } + + public class InheritanceB : InheritanceBase + { + } + + [Test] + public void GuidTest() + { + using (var db = new TestDbManager()) + { + var list = db.GetTable<InheritanceA>().Where(a => a.Bs.Any()).ToList(); + } + } + + [Test] + public void QuerySyntaxSimpleTest() + { + ForEachProvider(db => + { + // db.GetTable<Parent111>().OfType<Parent222>().ToList(); - it's work!!! + (from p in db.GetTable<Parent111>().OfType<Parent222>() select p).ToList(); + }); + } + + [TableName("Person")] + [InheritanceMapping(Code = 1, Type = typeof(Test17John))] + [InheritanceMapping(Code = 2, Type = typeof(Test17Tester))] + public class Test17Person + { + [MapField(IsInheritanceDiscriminator = true)] + public int PersonID { get; set; } + } + + public class Test17John : Test17Person + { + public string FirstName { get; set; } + } + + public class Test17Tester : Test17Person + { + public string LastName { get; set; } + } + + [Test] + public void Test17() + { + ForEachProvider(context => + { + if (context is TestDbManager) + { + var db = (TestDbManager)context; + db.GetTable<Test17Person>().OfType<Test17John>().ToList(); + Assert.False(db.LastQuery.ToLowerInvariant().Contains("lastname"), "Why select LastName field??"); + } + }); + } + + [TableName("Person")] + [InheritanceMapping(Code = Gender.Male, Type = typeof(Test18Male))] + [InheritanceMapping(Code = Gender.Female, Type = typeof(Test18Female))] + public class Test18Person + { + [PrimaryKey, NonUpdatable(IsIdentity = true, OnInsert = true, OnUpdate = true), SequenceName("PERSONID")] + public int PersonID { get; set; } + [MapField(IsInheritanceDiscriminator = true)] + public Gender Gender { get; set; } + } + + public class Test18Male : Test18Person + { + public string FirstName { get; set; } + } + + public class Test18Female : Test18Person + { + public string FirstName { get; set; } + public string LastName { get; set; } + } + + [Test] + public void Test18() + { + ForEachProvider(db => + { + var ids = Enumerable.Range(0, 10).ToList(); + var q = + from p1 in db.GetTable<Test18Person>() + where ids.Contains(p1.PersonID) + join p2 in db.GetTable<Test18Person>() on p1.PersonID equals p2.PersonID + select p1; + + var list = q.Distinct().OfType<Test18Female>().ToList(); + }); + } + + [Test] + public void Test19() + { + ForEachProvider(db => + { + var ids = Enumerable.Range(0, 10).ToList(); + var q = + from p1 in db.GetTable<Test18Person>() + where ids.Contains(p1.PersonID) + join p2 in db.GetTable<Test18Person>() on p1.PersonID equals p2.PersonID + select p1; + + IQueryable iq = q.Distinct(); + var list = iq.OfType<Test18Female>().ToList(); + }); + } + } +}