Mercurial > pub > bltoolkit
diff UnitTests/CS/Mapping/ExpressionMapperTest.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/CS/Mapping/ExpressionMapperTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,444 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +using NUnit.Framework; + +using BLToolkit.Common; +using BLToolkit.Mapping; + +namespace Mapping +{ + [TestFixture] + public class ExpressionMapperTest + { + [Test] + public void MapIntToString() + { + var mapper = Map.GetObjectMapper<int,string>(); + var dest = mapper(42); + + Assert.AreEqual("42", dest); + } + + [Test] + public void MapStringToInt() + { + var mapper = Map.GetObjectMapper<string,int>(); + var dest = mapper("42"); + + Assert.AreEqual(42, dest); + } + + [Test] + public void MapGenderToString() + { + var mapper = Map.GetObjectMapper<Gender,string>(); + var dest = mapper(Gender.Male); + + Assert.AreEqual("M", dest); + } + + [Test] + public void MapStringToGender() + { + var mapper = Map.GetObjectMapper<string,Gender>(); + var dest = mapper("M"); + + Assert.AreEqual(Gender.Male, dest); + } + + public enum Gender + { + [MapValue("F")] Female, + [MapValue("M")] Male, + [MapValue("U")] Unknown, + [MapValue("O")] Other + } + + public enum Enum1 + { + Value1 = 10, + Value2, + Value3, + Value4, + } + + public enum Enum2 + { + Value1, + Value2 = 10, + Value3, + Value4, + } + + public class Dest + { + public int Field1; + [MapField("Field2")] public float Field3; + public int Field4; + public int? Field6; + public int Field7; + public int Field8; + public int Field9; + public string Field10; + public int Field11; + [NullValue(12)] public int Field12; + [NullValue(13)] public int Field13; + [NullValue(14)] public int Field14; + public Gender Field15; + public string Field16; + public Enum2 Field17; + } + + public class Source + { + public int Field1 = 1; + public int Field2 = 2; + [MapField("Field4")] public float Field5 = 5; + public int Field6 = 6; + public int? Field7 = 7; + public int? Field8; + public decimal? Field9 = 9m; + public int Field10 = 10; + public string Field11 = "11"; + public string Field12 { get; set; } + public int? Field13; + public decimal? Field14; + public string Field15 = "F"; + public Gender Field16 = Gender.Male; + public Enum1 Field17 = Enum1.Value1; + } + + void Clone(Expression<Func<Source,Dest>> mapper) + { + /* + Expression.Lambda<Func<Source, Dest>>( + Expression.MemberInit( + Expression.New((ConstructorInfo) methodof(Dest..ctor), new Expression[0]), + new MemberBinding[] + { + Expression.Bind( + fieldof(Dest.Field1), + Expression.Field(CS$0$0000 = Expression.Parameter(typeof(Source), "s"), fieldof(Source.Field1))), + Expression.Bind( + fieldof(Dest.Field2), + Expression.Convert(Expression.Field(CS$0$0000, fieldof(Source.Field2)), typeof(float))) + }), new ParameterExpression[] { CS$0$0000 }); + */ + } + + [Test] + public void MapObjects() + { + var c = Convert<float,int>.From; + + //Clone(s => new Dest { Field1 = s.Field1, Field10 = s.Field10.ToString() }); + + //Map.ObjectToObject(new Source(), typeof(Dest)); + + var mapper = Map.GetObjectMapper<Source,Dest>(); + var src = new Source(); + var dest = mapper(src); + + Assert.AreEqual(1, dest.Field1); + Assert.AreEqual(2, dest.Field3); + Assert.AreEqual(src.Field5, dest.Field4); + Assert.AreEqual(src.Field6, dest.Field6.Value); + Assert.AreEqual(src.Field7.Value, dest.Field7); + Assert.AreEqual(src.Field8 ?? 0, dest.Field8); + Assert.AreEqual(src.Field9 ?? 0, dest.Field9); + Assert.AreEqual(src.Field10.ToString(), dest.Field10); + Assert.AreEqual(src.Field11, dest.Field11.ToString()); + Assert.AreEqual(12, dest.Field12); + Assert.AreEqual(13, dest.Field13); + Assert.AreEqual(14, dest.Field14); + Assert.AreEqual(Gender.Female, dest.Field15); + Assert.AreEqual("M", dest.Field16); + Assert.AreEqual(Enum2.Value2, dest.Field17); + } + + [Test] + public void MapObject() + { + var mapper = Map.GetObjectMapper<Source,Source>(); + var src = new Source(); + var dest = mapper(src); + + Assert.AreNotSame(src, dest); + Assert.AreEqual (src.Field1, dest.Field1); + Assert.AreEqual (src.Field2, dest.Field2); + Assert.AreEqual (src.Field5, dest.Field5); + Assert.AreEqual (src.Field6, dest.Field6); + Assert.AreEqual (src.Field7, dest.Field7); + Assert.AreEqual (src.Field8, dest.Field8); + Assert.AreEqual (src.Field9, dest.Field9); + Assert.AreEqual (src.Field10, dest.Field10); + Assert.AreEqual (src.Field11, dest.Field11); + Assert.AreEqual (src.Field12, dest.Field12); + Assert.AreEqual (src.Field13, dest.Field13); + Assert.AreEqual (src.Field14, dest.Field14); + Assert.AreEqual (src.Field15, dest.Field15); + Assert.AreEqual (src.Field16, dest.Field16); + Assert.AreEqual (src.Field17, dest.Field17); + } + + class Class1 { public int Field = 1; } + class Class2 { public int Field = 2; } + class Class3 { public Class1 Class = new Class1(); } + class Class4 { public Class2 Class = new Class2(); } + + [Test] + public void MapInnerObject1() + { + var mapper = Map.GetObjectMapper<Class3,Class4>(); + var src = new Class3(); + var dest = mapper(src); + + Assert.AreEqual(src.Class.Field, dest.Class.Field); + } + + class Class5 { public Class1 Class1 = new Class1(); public Class1 Class2; } + class Class6 { public Class2 Class1 = new Class2(); public Class2 Class2 = null; } + + [Test] + public void MapInnerObject2() + { + var mapper = Map.GetObjectMapper<Class5,Class6>(); + var src = new Class5(); + + src.Class2 = src.Class1; + + var dest = mapper(src); + + Assert.IsNotNull(dest.Class1); + Assert.AreSame(dest.Class1, dest.Class2); + } + + class Class7 { public Class9 Class; } + class Class8 { public Class10 Class = null; } + class Class9 { public Class7 Class = new Class7(); } + class Class10 { public Class8 Class = new Class8(); } + + [Test] + public void SelfReference1() + { + var mapper = Map.GetObjectMapper<Class9,Class10>(); + var src = new Class9(); + + src.Class.Class = src; + + var dest = mapper(src); + + Assert.AreSame(dest, dest.Class.Class); + } + + class Class11 { public Class9 Class = new Class9(); } + class Class12 { public Class10 Class = new Class10(); } + + [Test] + public void SelfReference2() + { + var mapper = Map.GetObjectMapper<Class11,Class12>(); + var src = new Class11(); + + src.Class.Class.Class = src.Class; + + var dest = mapper(src); + + Assert.AreSame(dest.Class, dest.Class.Class.Class); + } + + class Class13 { public Class1 Class = new Class1(); } + class Class14 { public Class1 Class = new Class1(); } + + [Test] + public void DeepCopy1() + { + var mapper = Map.GetObjectMapper<Class13,Class14>(); + var src = new Class13(); + + var dest = mapper(src); + + Assert.AreNotSame(src.Class, dest.Class); + } + + [Test] + public void DeepCopy2() + { + var mapper = Map.GetObjectMapper<Class13,Class14>(false); + var src = new Class13(); + + var dest = mapper(src); + + Assert.AreSame(src.Class, dest.Class); + } + + class Class15 { public List<Class1> List = new List<Class1> { new Class1(), new Class1() }; } + class Class16 { public List<Class2> List = null; } + + [Test] + public void ObjectList() + { + var mapper = Map.GetObjectMapper<Class15,Class16>(); + var src = new Class15(); + + src.List.Add(src.List[0]); + + var dest = mapper(src); + + Assert.AreEqual (3, dest.List.Count); + Assert.IsNotNull (dest.List[0]); + Assert.IsNotNull (dest.List[1]); + Assert.IsNotNull (dest.List[2]); + Assert.AreNotSame(dest.List[0], dest.List[1]); + Assert.AreSame (dest.List[0], dest.List[2]); + } + + [Test] + public void ScalarList() + { + var mapper = Map.GetObjectMapper<List<int>,IList<string>>(); + var dest = mapper(new List<int> { 1, 2, 3}); + + Assert.AreEqual("1", dest[0]); + Assert.AreEqual("2", dest[1]); + Assert.AreEqual("3", dest[2]); + } + + [Test] + public void ScalarArray() + { + var mapper = Map.GetObjectMapper<int[],string[]>(); + var dest = mapper(new[] { 1, 2, 3}); + + Assert.AreEqual("1", dest[0]); + Assert.AreEqual("2", dest[1]); + Assert.AreEqual("3", dest[2]); + } + + class Class17 + { + public IEnumerable<Class9> Arr { get { return GetEnumerable(); }} + + static IEnumerable<Class9> GetEnumerable() + { + var c = new Class9(); + + yield return c; + yield return new Class9(); + yield return c; + } + } + + class Class18 { public Class9[] Arr = null; } + + [Test] + public void ObjectArray1() + { + var mapper = Map.GetObjectMapper<Class17,Class18>(); + var dest = mapper(new Class17()); + + Assert.AreEqual (3, dest.Arr.Length); + Assert.IsNotNull (dest.Arr[0]); + Assert.IsNotNull (dest.Arr[1]); + Assert.IsNotNull (dest.Arr[2]); + Assert.AreNotSame(dest.Arr[0], dest.Arr[1]); + Assert.AreSame (dest.Arr[0], dest.Arr[2]); + } + + class Class19 + { + public Class9[] Arr { get { return new Class17().Arr.ToArray(); }} + } + + [Test] + public void ObjectArray2() + { + var mapper = Map.GetObjectMapper<Class19,Class18>(); + var dest = mapper(new Class19()); + + Assert.AreEqual (3, dest.Arr.Length); + Assert.IsNotNull (dest.Arr[0]); + Assert.IsNotNull (dest.Arr[1]); + Assert.IsNotNull (dest.Arr[2]); + Assert.AreNotSame(dest.Arr[0], dest.Arr[1]); + Assert.AreSame (dest.Arr[0], dest.Arr[2]); + } + + class Class20 { public Source Class1 = new Source(); public Source Class2; } + class Class21 { public Dest Class1 = null; public Dest Class2 = null; } + + [Test] + public void NoCrossRef() + { + var mapper = new ExpressionMapper<Class20,Class21> { HandleBackReferences = false }.GetMapper(); + var source = new Class20(); + + source.Class2 = source.Class1; + + var dest = mapper(source); + + Assert.IsNotNull (dest.Class1); + Assert.IsNotNull (dest.Class2); + Assert.AreNotSame(dest.Class1, dest.Class2); + } + + class Object1 + { + public int Field1; + [ExpressionMapIgnore] + public int Field2; + } + + class Object2 + { + public int Field1; + public int Field2; + } + + [Test] + public void ExpressionMapIgnoreTest() + { + var mapper1 = Map.GetObjectMapper<Object1,Object2>(); + var object2 = mapper1(new Object1 { Field1 = 1, Field2 = 2 }); + + Assert.That(object2.Field2, Is.Not.EqualTo(2)); + + var mapper2 = Map.GetObjectMapper<Object2,Object1>(); + var object1 = mapper2(new Object2 { Field1 = 1, Field2 = 2 }); + + Assert.That(object1.Field2, Is.Not.EqualTo(2)); + } + + [MapField("SomethingColumnInDB", "MyInnerClass.Something")] + class MyClass + { + public int ID; + public string Name; + public MyInnerClass MyInnerClass; + } + + class MyInnerClass + { + public string Something; + } + + [Test] + public void MapFieldTest() + { + var entity = new MyClass + { + ID = 1, + Name = "Test", + MyInnerClass = new MyInnerClass { Something = "Something" } + }; + + var mapper = Map.GetObjectMapper<MyClass,MyClass>(true, true); + var clone = mapper(entity); + + Assert.That(clone.MyInnerClass, Is.Not.Null); + } + } +}