Mercurial > pub > bltoolkit
diff UnitTests/CS/Mapping/MapTest.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/MapTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,563 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlTypes; +using System.Globalization; +using BLToolkit.Common; +using BLToolkit.Reflection; +using NUnit.Framework; + +using BLToolkit.Mapping; + +namespace Mapping +{ + [TestFixture, Category("Mapping")] + public class MapTest : TestFixtureBase + { + #region Enum To Int + + public class EnumClass + { + public enum Enum + { + Value1 = 1, + Value2 = 2 + } + + public Enum Value = Enum.Value1; + public Enum? NullableValue = Enum.Value2; + } + + public class IntClass + { + public int Value; + public int? NullableValue; + } + + [Test] + public void EnumToInt() + { + var list1 = new ArrayList(); + + list1.Add(new EnumClass()); + + var list2 = Map.ListToList(list1, typeof(IntClass)); + + Assert.AreEqual(1, ((IntClass)list2[0]).Value); + Assert.AreEqual(2, ((IntClass)list2[0]).NullableValue); + } + + #endregion + + #region ToEnum, FromEnum + + [DefaultValue(Enum1.Value3)] + [MapValue(Enum1.Value2, "2")] + public enum Enum1 + { + [MapValue("1")] Value1, + [NullValue] Value2, + [MapValue("3")] Value3 + } + + [Test] + public void ToEnum() + { + Assert.AreEqual(Enum1.Value1, Map.ValueToEnum("1", typeof(Enum1))); + Assert.AreEqual(Enum1.Value2, Map.ValueToEnum(null, typeof(Enum1))); + Assert.AreEqual(Enum1.Value3, Map.ValueToEnum("2727", typeof(Enum1))); + } + + [Test] + public void FromEnum() + { + Assert.AreEqual("1", Map.EnumToValue(Enum1.Value1)); + Assert.IsNull ( Map.EnumToValue(Enum1.Value2)); + Assert.AreEqual("3", Map.EnumToValue(Enum1.Value3)); + } + + public enum Enum2 : short + { + Value1 = 1, + [NullValue] Value2, + [DefaultValue]Value3 + } + + [Test] + public void ToShortEnum() + { + Assert.AreEqual(Enum2.Value1, Map.ValueToEnum(1, typeof(Enum2))); + Assert.AreEqual(Enum2.Value2, Map.ValueToEnum(null, typeof(Enum2))); + Assert.AreEqual(Enum2.Value3, Map.ValueToEnum(3, typeof(Enum2))); + Assert.AreEqual(Enum2.Value3, Map.ValueToEnum(2727, typeof(Enum2))); + + // DateTime.Now can't converted to Enum2. + // Expected result in this case is default value. + // + Assert.AreEqual(Enum2.Value3, Map.ValueToEnum(DateTime.Now, typeof(Enum2))); + } + + public enum Enum3 : long + { + Value1 = 1, + } + + [Test, ExpectedException(typeof(InvalidCastException))] + public void ToEnumWithIncompatibleValue() + { + // An object can't be converted to Enum3. + // Expected result is an exception, since Enum3 does not have + // a default value defined. + // + Map.ValueToEnum(new object(), typeof(Enum3)); + } + + [Test] + public void ToEnumWithCompatibleValue() + { + // 123 is not defined for this enum, but can be converted to. + // Enum3 does not have a default value defined, so just cast 123 to Enum3 + // + Assert.AreEqual((Enum3)123, Map.ValueToEnum(123, typeof(Enum3))); + + // DateTime.Now also can be converted to Enum3 (as ticks). + // + Map.ValueToEnum(DateTime.Now, typeof(Enum3)); + } + #endregion + + #region ObjectToObject + + public class SourceObject + { + public int Field1 = 10; + public string Field2 = "20"; + public double Field3 = 30.0; + } + + public class Object1 + { + public int Field1; + public int Field2; + public int Field3; + } + + [Test] + public void ObjectToObjectOO() + { + SourceObject so = new SourceObject(); + Object1 o = new Object1(); + + Map.ObjectToObject(so, o); + + Assert.AreEqual(10, o.Field1); + Assert.AreEqual(20, o.Field2); + Assert.AreEqual(30, o.Field3); + } + + [Test] + public void ObjectToObjectOT() + { + SourceObject so = new SourceObject(); + Object1 o = (Object1)Map.ObjectToObject(so, typeof(Object1)); + + Assert.AreEqual(10, o.Field1); + Assert.AreEqual(20, o.Field2); + Assert.AreEqual(30, o.Field3); + } + + [Test] + public void ObjectToObjectTO() + { + SourceObject so = new SourceObject(); + Object1 o = Map.ObjectToObject<Object1>(so); + + Assert.AreEqual(10, o.Field1); + Assert.AreEqual(20, o.Field2); + Assert.AreEqual(30, o.Field3); + } + + public class DefaultNullType + { + [NullValue(-1)] + public int NullableInt; + } + + #endregion + + #region DataRowToObject + + [Test] + public void DataRowToObjectD() + { + DataTable table = new DataTable(); + + table.Columns.Add("NullableInt", typeof(int)); + + table.Rows.Add(new object[] { DBNull.Value }); + table.Rows.Add(new object[] { 1 }); + table.AcceptChanges(); + + DefaultNullType dn = (DefaultNullType)Map.DataRowToObject(table.Rows[0], typeof(DefaultNullType)); + + Assert.AreEqual(-1, dn.NullableInt); + + Map.DataRowToObject(table.Rows[1], DataRowVersion.Current, dn); + + Assert.AreEqual(1, dn.NullableInt); + } + + #endregion + + #region ObjectToDictionary + + [Test] + public void ObjectToDictionary() + { + SourceObject so = new SourceObject(); + Hashtable ht = new Hashtable(); + + Map.ObjectToDictionary(so, ht); + + Assert.AreEqual(10, ht["Field1"]); + Assert.AreEqual("20", ht["Field2"]); + Assert.AreEqual(30, ht["Field3"]); + } + + #endregion + + #region DictionaryToObject + + [Test] + public void DictionaryToObject() + { + var so = new SourceObject(); + var ht = Map.ObjectToDictionary(so); + var o1 = (Object1)Map.DictionaryToObject(ht, typeof(Object1)); + + Assert.AreEqual(10, o1.Field1); + Assert.AreEqual(20, o1.Field2); + Assert.AreEqual(30, o1.Field3); + } + + #endregion + + #region DataRowToDictionary + + [Test] + public void DataRowToDictionary() + { + DataTable table = GetDataTable(); + Hashtable hash = Map.DataRowToDictionary(table.Rows[0]); + + Assert.AreEqual(table.Rows[0]["ID"], hash["ID"]); + Assert.AreEqual(table.Rows[0]["Name"], hash["Name"]); + Assert.AreEqual(table.Rows[0]["Date"], hash["Date"]); + } + + #endregion + + #region DictionaryToDataRow + + [Test] + public void DictionaryToDataRow() + { + DataTable table1 = GetDataTable(); + Hashtable hash = Map.DataRowToDictionary(table1.Rows[0]); + DataTable table2 = new DataTable(); + + Map.DictionaryToDataRow(hash, table2); + + Assert.AreEqual(table1.Rows[0]["ID"], table2.Rows[0]["ID"]); + Assert.AreEqual(table1.Rows[0]["Name"], table2.Rows[0]["Name"]); + Assert.AreEqual(table1.Rows[0]["Date"], table2.Rows[0]["Date"]); + } + + #endregion + + #region SqlTypes + + public class SqlTypeTypes + { + public class SourceObject + { + public string s1 = "123"; + public SqlString s2 = "1234"; + public int i1 = 123; + public SqlInt32 i2 = 1234; + + public DateTime d1 = DateTime.Now; + public SqlDateTime d2 = DateTime.Now; + } + + public class Object1 + { + public SqlString s1; + public string s2; + public SqlInt32 i1; + public int i2; + + public SqlDateTime d1; + public DateTime d2; + } + } + + [Test] + public void SqlTypes() + { + SqlTypeTypes.SourceObject so = new SqlTypeTypes.SourceObject(); + SqlTypeTypes.Object1 o = (SqlTypeTypes.Object1)Map.ObjectToObject(so, typeof(SqlTypeTypes.Object1)); + + Console.WriteLine(o.s1); Assert.AreEqual("123", o.s1.Value); + Console.WriteLine(o.s2); Assert.AreEqual("1234", o.s2); + + Console.WriteLine(o.i1); Assert.IsTrue(o.i1.Value == 123); + Console.WriteLine(o.i2); Assert.IsTrue(o.i2 == 1234); + + Console.WriteLine("{0} - {1}", so.d2, o.d2); Assert.AreEqual(o.d2, so.d2.Value); + //Console.WriteLine("{0} - {1}", s.d1, d.d1); Assert.IsTrue(d.d1.Value == s.d1); + } + + #endregion + + #region Arrays + + public class ArrayTypes + { + public class SourceObject + { + public int[,] DimArray = new int[2, 2] { {1,2}, {3,4} }; + public string[] StrArray = new string[] {"5","4","3","2","1"}; + public int[] IntArray = new int[] {1,2,3,4,5}; + public Enum1[] EnmArray = new Enum1[] {Enum1.Value1,Enum1.Value2,Enum1.Value3}; + + public byte[][,][][,] ComplexArray = InitComplexArray(); + public static byte[][,][][,] InitComplexArray() + { + byte[][,][][,] ret = new byte[1][,][][,]; + ret[0] = new byte[1,1][][,]; + ret[0][0,0] = new byte[1][,]; + ret[0][0,0][0] = new byte[,] { {1,2}, {3,4} }; + + return ret; + } + } + + public class DestObject + { + public float[,] DimArray; + public string[] StrArray; + public string[] IntArray; + public string[] EnmArray; + public sbyte[][,][][,] ComplexArray; + } + + public class IncompatibleObject + { + public int[][] DimArray; + } + } + + [Test] + public void ArrayTypesTest() + { + ArrayTypes.SourceObject so = new ArrayTypes.SourceObject(); + ArrayTypes.DestObject o = (ArrayTypes.DestObject)Map.ObjectToObject(so, typeof(ArrayTypes.DestObject)); + + Console.WriteLine(o.DimArray); Assert.AreEqual(so.DimArray[0,0], (int)o.DimArray[0,0]); + Console.WriteLine(o.StrArray); Assert.AreEqual(so.StrArray, o.StrArray); + Console.WriteLine(o.IntArray); Assert.AreEqual(so.IntArray[0].ToString(), o.IntArray[0]); + + Console.WriteLine(o.ComplexArray); Assert.IsTrue(o.ComplexArray[0][0,0][0][1,1] == 4); + } + + [Test, ExpectedException(typeof(InvalidCastException))] + public void IncompatibleArrayTypesTest() + { + ArrayTypes.SourceObject so = new ArrayTypes.SourceObject(); + Map.ObjectToObject(so, typeof(ArrayTypes.IncompatibleObject)); + } + + #endregion + + #region SourceListToDestList + + [Test] + public void ListToList() + { + DataTable table = GetDataTable(); + ArrayList list1 = Map.DataTableToList(table, typeof(TestObject)); + ArrayList list2 = new ArrayList(); + + Map.ListToList(list1, list2, typeof(TestObject)); + + CompareLists(table, list2); + } + + [Test] + public void TableToList() + { + DataTable table = GetDataTable(); + ArrayList list = Map.DataTableToList(table, typeof(TestObject)); + + CompareLists(table, list); + } + + [Test] + public void ListToTable1() + { + DataTable table1 = GetDataTable(); + ArrayList list = Map.DataTableToList(table1, typeof(TestObject)); + DataTable table2 = Map.ListToDataTable(list); + + table2.AcceptChanges(); + + CompareLists(table1, table2); + } + + [Test] + public void ListToTable2() + { + DataTable table1 = GetDataTable(); + ArrayList list = Map.DataTableToList(table1, typeof(TestObject)); + DataTable table2 = table1.Clone(); + + Map.ListToDataTable(list, table2); + + table2.AcceptChanges(); + + CompareLists(table1, table2); + } + + [Test] + public void TableToTable1() + { + DataTable table1 = GetDataTable(); + DataTable table2 = Map.DataTableToDataTable(table1); + + table2.AcceptChanges(); + + CompareLists(table1, table2); + } + + [Test] + public void TableToTable2() + { + DataTable table1 = GetDataTable(); + DataTable table2 = new DataTable(); + + Map.DataTableToDataTable(table1, table2); + + table2.AcceptChanges(); + + CompareLists(table1, table2); + } + + [Test] + public void TableToDictionary() + { + DataTable table = GetDataTable(); + IDictionary dic = Map.DataTableToDictionary(table, new SortedList(), "ID", typeof(TestObject)); + + CompareLists(table, Map.ListToList(dic.Values, typeof(TestObject))); + } + + [Test] + public void ListToDictionary() + { + DataTable table = GetDataTable(); + ArrayList list = Map.DataTableToList (table, typeof(TestObject)); + IDictionary dic = Map.ListToDictionary(list, new SortedList(), "ID", typeof(TestObject)); + + CompareLists(table, Map.ListToList(dic.Values, typeof(TestObject))); + } + + [Test] + public void DictionaryToDictionary() + { + DataTable table = GetDataTable(); + ArrayList list = Map.DataTableToList (table, typeof(TestObject)); + IDictionary dic1 = Map.ListToDictionary (list, new SortedList(), "ID", typeof(TestObject)); + IDictionary dic2 = Map.DictionaryToDictionary(dic1, new SortedList(), "@ID", typeof(TestObject)); + + CompareLists(table, Map.ListToList(dic2.Values, typeof(TestObject))); + } + + #endregion + + #region ObjectToDataRow + + public class DataRowTestType + { + public Int32 Int32Column = 12345; + public String StringColumn = "string"; + public Byte[] ByteArrayColumn = new Byte[]{1,2,3,4,5}; + //public Byte[] ByteArrayColumn2 = null; + } + + [Test] + public void ObjectToDataRowTest() + { + DataTable table = new DataTable(); + DataRowTestType obj = new DataRowTestType(); + + Map.ObjectToDataRow(obj, table); + + Assert.IsNotEmpty(table.Rows); + DataRow dr = table.Rows[0]; + + Assert.AreEqual(table.Columns["Int32Column"] .DataType, typeof(Int32)); + Assert.AreEqual(table.Columns["StringColumn"] .DataType, typeof(String)); + Assert.AreEqual(table.Columns["ByteArrayColumn"] .DataType, typeof(Byte[])); + //Assert.AreEqual(table.Columns["ByteArrayColumn2"].DataType, typeof(Byte[])); + + Assert.AreEqual(obj.Int32Column, dr["Int32Column"]); + Assert.AreEqual(obj.StringColumn, dr["StringColumn"]); + Assert.AreEqual(obj.ByteArrayColumn, dr["ByteArrayColumn"]); + //Assert.AreEqual(obj.ByteArrayColumn2, dr["ByteArrayColumn2"]); + } + + #endregion + + class ObjectStr1 + { + public string Field; + } + + class ObjectDateTime1 + { + public DateTime Field = DateTime.Now; + } + + [Test] + public void TestConverter() + { + var prev = Convert<DateTime,string>.From; + + Convert<DateTime,string>.From = str => + DateTime.ParseExact(str, new[] { "yyyymmdd" }, CultureInfo.InvariantCulture, DateTimeStyles.None); + + var map = Map.GetObjectMapper<List<ObjectStr1>,List<ObjectDateTime1>>(); + var obj = map(new List<ObjectStr1> { new ObjectStr1 { Field = "20110102" } }); + + Assert.That(obj.Count, Is.EqualTo(1)); + Assert.That(obj[0].Field.Year, Is.EqualTo(2011)); + + Convert<DateTime,string>.From = prev; + } + + public abstract class Test + { + public abstract int Id { get; set; } + } + + [Test] + public void AccessorTest() + { + var test = TypeAccessor<Test>.CreateInstance(); + var mapper = Map.GetObjectMapper<Test,Test>(); + var testCopy = mapper(test); + } + } +}