Mercurial > pub > bltoolkit
diff UnitTests/Linq/Mapping.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/Mapping.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,446 @@ +using System; +using System.Linq; + +using BLToolkit.Data.Linq; +using BLToolkit.DataAccess; +using BLToolkit.EditableObjects; +using BLToolkit.Mapping; +using BLToolkit.Reflection; +using NUnit.Framework; + +using Convert = System.Convert; + +#pragma warning disable 0649 + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class Mapping : TestBase + { + [Test] + public void Enum1() + { + var expected = from p in Person where new[] { Gender.Male }.Contains(p.Gender) select p; + ForEachProvider(db => AreEqual(expected, from p in db.Person where new[] { Gender.Male }.Contains(p.Gender) select p)); + } + + [Test] + public void Enum2() + { + ForEachProvider(db => AreEqual( + from p in Person where p.Gender == Gender.Male select p, + from p in db.Person where p.Gender == Gender.Male select p)); + } + + [Test] + public void Enum21() + { + var gender = Gender.Male; + + ForEachProvider(db => AreEqual( + from p in Person where p.Gender == gender select p, + from p in db.Person where p.Gender == gender select p)); + } + + [Test] + public void Enum3() + { + var fm = Gender.Female; + + var expected = from p in Person where p.Gender != fm select p; + ForEachProvider(db => AreEqual(expected, from p in db.Person where p.Gender != fm select p)); + } + + [Test] + public void Enum4() + { + ForEachProvider(db => AreEqual( + from p in Parent4 where p.Value1 == TypeValue.Value1 select p, + from p in db.Parent4 where p.Value1 == TypeValue.Value1 select p)); + } + + [Test] + public void Enum5() + { + ForEachProvider(db => AreEqual( + from p in Parent4 where p.Value1 == TypeValue.Value3 select p, + from p in db.Parent4 where p.Value1 == TypeValue.Value3 select p)); + } + + [Test] + public void Enum6() + { + ForEachProvider(db => AreEqual( + from p in Parent4 + join c in Child on p.ParentID equals c.ParentID + where p.Value1 == TypeValue.Value1 select p, + from p in db.Parent4 + join c in db.Child on p.ParentID equals c.ParentID + where p.Value1 == TypeValue.Value1 select p)); + } + + [Test] + public void Enum7() + { + var v1 = TypeValue.Value1; + + ForEachProvider(db => db.Parent4.Update(p => p.Value1 == v1, p => new Parent4 { Value1 = v1 })); + } + + enum TestValue + { + Value1 = 1, + } + + [TableName("Parent")] + class TestParent + { + public int ParentID; + public TestValue Value1; + } + + [Test] + public void Enum81() + { + ForEachProvider(db => db.GetTable<TestParent>().Where(p => p.Value1 == TestValue.Value1).ToList()); + } + + [Test] + public void Enum82() + { + var testValue = TestValue.Value1; + ForEachProvider(db => db.GetTable<TestParent>().Where(p => p.Value1 == testValue).ToList()); + } + + public enum Gender9 + { + [MapValue('M')] Male, + [MapValue('F')] Female, + [MapValue('U')] Unknown, + [MapValue('O')] Other, + } + + [TableName("Person")] + public class Person9 + { + public int PersonID; + public string FirstName; + public string LastName; + public string MiddleName; + public Gender9 Gender; + } + + [Test] + public void Enum9() + { + ForEachProvider(db => + db.GetTable<Person9>().Where(p => p.PersonID == 1 && p.Gender == Gender9.Male).ToList()); + } + + [Test] + public void EditableObject() + { + ForEachProvider(db => + { + var e = (from p in db.GetTable<EditableParent>() where p.ParentID == 1 select p).First(); + Assert.AreEqual(1, e.ParentID); + Assert.AreEqual(1, e.Value1); + }); + } + + [TableName("Parent")] + [MapField("Value1", "Value.Value1")] + public class ParentObject + { + public int ParentID; + public Inner Value = new Inner(); + + public class Inner + { + public int? Value1; + } + } + + [Test] + public void Inner1() + { + ForEachProvider(db => + { + var e = db.GetTable<ParentObject>().First(p => p.ParentID == 1); + Assert.AreEqual(1, e.ParentID); + Assert.AreEqual(1, e.Value.Value1); + }); + } + + [Test] + public void Inner2() + { + ForEachProvider(db => + { + var e = db.GetTable<ParentObject>().First(p => p.ParentID == 1 && p.Value.Value1 == 1); + Assert.AreEqual(1, e.ParentID); + Assert.AreEqual(1, e.Value.Value1); + }); + } + + [TableName("Child")] + public class ChildObject + { + public int ParentID; + public int ChildID; + + [Association(ThisKey="ParentID", OtherKey="ParentID")] + public ParentObject Parent; + } + + [Test] + public void Inner3() + { + ForEachProvider(db => + { + var e = db.GetTable<ChildObject>().First(c => c.Parent.Value.Value1 == 1); + Assert.AreEqual(1, e.ParentID); + }); + } + + [TableName("Parent")] + public class ParentObject2 + { + class IntToDateMemberMapper : MemberMapper + { + public override void SetValue(object o, object value) + { + ((ParentObject2)o).Value1 = new DateTime(2010, 1, Convert.ToInt32(value)); + } + } + + public int ParentID; + [MemberMapper(typeof(IntToDateMemberMapper))] + public DateTime Value1; + } + + [Test] + public void MemberMapperTest1() + { + ForEachProvider(db => + { + var q = + from p in db.GetTable<ParentObject2>() + where p.ParentID == 1 + select p; + + Assert.AreEqual(new DateTime(2010, 1, 1), q.First().Value1); + }); + } + + //[Test] + public void MemberMapperTest2() + { + ForEachProvider(db => + { + var q = + from p in db.GetTable<ParentObject2>() + where p.ParentID == 1 + select p.Value1; + + Assert.AreEqual(new DateTime(2010, 1, 1), q.First()); + }); + } + + struct MyInt + { + public int MyValue; + } + + [TableName("Parent")] + class MyParent + { + public MyInt ParentID; + public int? Value1; + } + + class MyMappingSchema : MappingSchema + { + public override object ConvertChangeType(object value, Type conversionType, bool isNullable) + { + if (conversionType == typeof(MyInt)) + return new MyInt { MyValue = Convert.ToInt32(value) }; + + if (value is MyInt) + value = ((MyInt)value).MyValue; + + return base.ConvertChangeType(value, conversionType, isNullable); + } + + public override object ConvertParameterValue(object value, Type systemType) + { + return value is MyInt ? ((MyInt)value).MyValue : value; + } + } + + static readonly MyMappingSchema _myMappingSchema = new MyMappingSchema(); + + [Test] + public void MyType1() + { + using (var db = new TestDbManager { MappingSchema = _myMappingSchema }) + { + var list = db.GetTable<MyParent>().ToList(); + } + } + + [Test] + public void MyType2() + { + using (var db = new TestDbManager { MappingSchema = _myMappingSchema }) + { + var list = db.GetTable<MyParent>() + .Select(t => new MyParent { ParentID = t.ParentID, Value1 = t.Value1 }) + .ToList(); + } + } + + [Test] + public void MyType3() + { + using (var db = new TestDbManager { MappingSchema = _myMappingSchema }) + { + db.BeginTransaction(); + db.Insert(new MyParent { ParentID = new MyInt { MyValue = 1001 }, Value1 = 1001 }); + db.Parent.Delete(p => p.ParentID >= 1000); + } + } + + [TableName("Parent")] + class MyParent1 + { + public int ParentID; + public int? Value1; + + [MapIgnore] + public string Value2 { get { return "1"; } } + + public int GetValue() { return 2;} + } + + [Test] + public void MapIgnore1() + { + ForEachProvider(db => AreEqual( + Parent .Select(p => new { p.ParentID, Value2 = "1" }), + db.GetTable<MyParent1>().Select(p => new { p.ParentID, p.Value2 }))); + } + + [Test] + public void MapIgnore2() + { + ForEachProvider(db => AreEqual( + Parent .Select(p => new { p.ParentID, Length = 1 }), + db.GetTable<MyParent1>().Select(p => new { p.ParentID, p.Value2.Length }))); + } + + [Test] + public void MapIgnore3() + { + ForEachProvider(db => AreEqual( + Parent .Select(p => new { p.ParentID, Value = 2 }), + db.GetTable<MyParent1>().Select(p => new { p.ParentID, Value = p.GetValue() }))); + } + + [TableName("Parent")] + public abstract class AbsParent : EditableObject + { + public abstract int ParentID { get; set; } + public abstract int? Value1 { get; set; } + } + + [TableName("Child")] + public abstract class AbsChild : EditableObject + { + public abstract int ParentID { get; set; } + public abstract int ChildID { get; set; } + + [Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = false)] + public AbsParent Parent; + } + + [Test] + public void MapAbstract() + { + using (var db = new TestDbManager()) + { + var q = from a in db.GetTable<AbsChild>() + select new { a.ChildID, a.Parent.Value1 }; + + var ql = q.ToList(); + } + } + + public class Entity { public int Id { get; set; } } + public interface IDocument { int Id { get; set; } } + public class Document : Entity, IDocument { } + + [Test] + public void TestMethod() + { + using (var db = new TestDbManager()) + { + IQueryable<IDocument> query = db.GetTable<Document>(); + var idsQuery = query.Select(s => s.Id); + var str = idsQuery.ToString(); // Exception + Assert.IsNotNull(str); + } + } + + [TableName("Parent")] + public abstract class ParentX + { + [MapField("ParentID")] + public abstract int ParentID { get; set; } + [MapField("Value1")] + public abstract int? Value1 { get; set; } + } + + [TableName("Child")] + [MapField("ParentID", "Parent.ParentID")] + public abstract class ChildX + { + [MapField("ChildID")] + public abstract int ChildID { get; set; } + public abstract ParentX Parent { get; set; } + } + + [Test] + public void Test4([DataContexts] string contexts) + { + using (var db = GetDataContext(contexts)) + { + db.Child. Delete(p => p.ParentID == 1001); + db.Parent.Delete(p => p.ParentID == 1001); + + try + { + var child = TypeAccessor.CreateInstance<ChildX>(); + var parent = TypeAccessor.CreateInstance<ParentX>(); + + parent.ParentID = 1001; + parent.Value1 = 1; + + db.Insert(parent); + + child.ChildID = 1001; + child.Parent = parent; + + db.Insert(child); + } + finally + { + db.Child. Delete(p => p.ParentID == 1001); + db.Parent.Delete(p => p.ParentID == 1001); + } + } + } + } +}