diff UnitTests/CS/Mapping/MapperMemberAttributeTest.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/MapperMemberAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,230 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+using BLToolkit.Reflection.MetadataProvider;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class MapperMemberAttributeTest
+	{
+		class MemberMapper1 : MemberMapper
+		{
+			public override object GetValue(object o)
+			{
+				return 45;
+			}
+		}
+
+		public class Object1
+		{
+			// MapIgnore set to false
+			//
+			[MemberMapper(typeof(MemberMapper1))]
+			public int Int;
+
+			// MapIgnore set to DebugSwitch value
+			//
+			[MapIgnore(DebugSwitch), MemberMapper(typeof(MemberMapper1))]
+			public int MapIgnore;
+
+			// MapIgnore set to true
+			//
+			[MemberMapper(typeof(MemberMapper1)), MapIgnore]
+			public int MapIgnore2;
+
+			[MapIgnore(false), MemberMapper(typeof(MemberMapper1))]
+			public int MapNotIgnore;
+
+			private const bool DebugSwitch = true;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = new Object1();
+
+			om.SetValue(o, "Int",      456);
+
+			Assert.AreEqual(456, o.Int);
+			Assert.AreEqual(45,  om.GetValue(o, "Int"));
+
+			Assert.IsNull(om["MapIgnore"]);
+			Assert.IsNull(om["MapIgnore2"]);
+			Assert.IsNotNull(om["MapNotIgnore"]);
+		}
+
+		[MemberMapper(typeof(int), typeof(MemberMapper1))]
+		public class Object2
+		{
+			public int Int;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object2));
+
+			Object2 o = new Object2();
+
+			om.SetValue(o, "Int", 456);
+
+			Assert.AreEqual(456, o.Int);
+			Assert.AreEqual(45,  om.GetValue(o, "Int"));
+		}
+
+		[MemberMapper(typeof(CustomNum.Mapper))]
+		public class CustomNum
+		{
+			public int Num;
+
+			public CustomNum(int num)
+			{
+				Num = num;
+			}
+
+			public CustomNum()
+			{
+			}
+
+			public class Mapper : MemberMapper
+			{
+				public override object GetValue(object o)
+				{
+					object value = MemberAccessor.GetValue(o);
+					return value is CustomNum? ((CustomNum)value).Num: 0;
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					value = (value is int)? new CustomNum((int)value) : new CustomNum();
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		public class Object3
+		{
+			public CustomNum Num;
+		}
+
+		[Test]
+		public void TestNumberString()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object3));
+			Object3      o  = new Object3();
+
+			om.SetValue(o, "Num", 123);
+
+			Assert.AreEqual(123, o.Num.Num);
+		}
+
+		#region Custom mapping schema test
+
+		public class CustomString
+		{
+			public string Str;
+
+			public CustomString(string str)
+			{
+				Str = str;
+			}
+
+			public CustomString()
+			{
+				Str = string.Empty;
+			}
+
+			public class Mapper : MemberMapper
+			{
+				public override object GetValue(object o)
+				{
+					object value = MemberAccessor.GetValue(o);
+					return value is CustomString? ((CustomString)value).Str: null;
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					value = (value is string)? new CustomString((string)value) : new CustomString();
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		public class Object4
+		{
+			public CustomString Str;
+		}
+
+		public class TestMappingSchema : MappingSchema
+		{
+			private class TestMapMetadataProvider : MetadataProviderBase
+			{
+				public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+				{
+					if (member.Type == typeof(CustomString))
+					{
+						isSet = true;
+						return false;
+					}
+
+					return base.GetMapIgnore(typeExtension, member, out isSet);
+				}
+			}
+
+			private class TestObjectMapper : ObjectMapper
+			{
+				protected override  MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo)
+				{
+					if (mapMemberInfo.Type == typeof(CustomString))
+					{
+						MemberMapper mm = new CustomString.Mapper();
+						mm.Init(mapMemberInfo);
+						return mm;
+					}
+
+					return base.CreateMemberMapper(mapMemberInfo);
+				}
+
+				protected override MetadataProviderBase CreateMetadataProvider()
+				{
+					MetadataProviderBase provider = base.CreateMetadataProvider();
+					provider.AddProvider(new TestMapMetadataProvider());
+					return provider;
+				}
+
+			}
+
+			protected override ObjectMapper CreateObjectMapperInstance(Type type)
+			{
+				return new TestObjectMapper();
+			}
+		}
+
+		[Test]
+		public void TestCustomString()
+		{
+			MappingSchema save = Map.DefaultSchema;
+
+			Map.DefaultSchema = new TestMappingSchema();
+			
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object4));
+
+			Object4 o = new Object4();
+
+			om.SetValue(o, "Str", "Test");
+
+			Assert.AreEqual("Test", o.Str.Str);
+			
+			Map.DefaultSchema = save;
+		}
+
+		#endregion
+	}
+}