using System; using System.Collections; using System.Configuration; using NUnit.Framework; using IBatisNet.DataMapper.Test.Domain; namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests { /// /// Summary description for ResultMapTest. /// [TestFixture] public class ResultMapTest : BaseTest { #region SetUp & TearDown /// /// SetUp /// [SetUp] public void Init() { InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" ); InitScript( sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false ); InitScript( sqlMap.DataSource, ScriptDirectory + "order-init.sql" ); InitScript( sqlMap.DataSource, ScriptDirectory + "line-item-init.sql" ); InitScript( sqlMap.DataSource, ScriptDirectory + "enumeration-init.sql" ); } /// /// TearDown /// [TearDown] public void Dispose() { /* ... */ } #endregion #region Result Map test /// /// Test a Result Map property with map by column name /// [Test] public void TestColumnsByName() { Order order = (Order) sqlMap.QueryForObject("GetOrderLiteByColumnName", 1); AssertOrder1(order); } /// /// Test a Result Map property with map by column index /// [Test] public void TestColumnsByIndex() { Order order = (Order) sqlMap.QueryForObject("GetOrderLiteByColumnIndex", 1); AssertOrder1(order); } /// /// Test extends attribute in a Result Map /// [Test] public void TestExtendedResultMap() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItems", 1); AssertOrder1(order); Assert.IsNotNull(order.LineItemsIList); Assert.AreEqual(2, order.LineItemsIList.Count); } /// /// Test lazyLoad attribute in a Result Map property /// [Test] public void TestLazyLoad() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItems", 1); AssertOrder1(order); Assert.IsNotNull( order.LineItemsIList ); Assert.IsTrue( typeof(IList).IsAssignableFrom( order.LineItemsIList.GetType() ) ); Assert.AreEqual(2, order.LineItemsIList.Count); // After a call to a method from a proxy object, // the proxy object is replaced by his real object. Assert.IsTrue( order.LineItemsIList is ArrayList ); } /// /// Test lazyLoad attribute With an Open Connection /// [Test] public void TestLazyLoadWithOpenConnection() { sqlMap.OpenConnection(); Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItems", 1); AssertOrder1(order); Assert.IsNotNull( order.LineItemsIList ); Assert.IsTrue( typeof(IList).IsAssignableFrom( order.LineItemsIList.GetType() ) ); Assert.AreEqual(2, order.LineItemsIList.Count); // After a call to a method from a proxy object, // the proxy object is replaced by his real object. Assert.IsTrue( order.LineItemsIList is ArrayList ); sqlMap.CloseConnection(); } /// /// Test collection mapping /// order.LineItems /// [Test] public void TestLazyWithStronglyTypedCollectionMapping() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItemCollection", 1); AssertOrder1(order); Assert.IsNotNull(order.LineItems); Assert.AreEqual(2, order.LineItems.Count); IEnumerator e = ((IEnumerable)order.LineItems).GetEnumerator(); while(e.MoveNext()) { LineItem item = (LineItem)e.Current; Assert.IsNotNull(item); } } /// /// Test null value replacement(on string) in a Result property. /// [Test] public void TestNullValueReplacementOnString() { Account account = (Account) sqlMap.QueryForObject("GetAccountViaColumnName", 5); Assert.AreEqual("no_email@provided.com", account.EmailAddress); } /// /// Test null value replacement(on enum class) in a Result property. /// [Test] public void TestNullValueReplacementOnEnum() { Enumeration enumClass = new Enumeration(); enumClass.Id = 99; enumClass.Day = Days.Thu; enumClass.Color = Colors.Blue; enumClass.Month = Months.All; sqlMap.Insert("InsertEnumViaParameterMap", enumClass); enumClass = null; enumClass = sqlMap.QueryForObject("GetEnumerationNullValue", 99) as Enumeration; Assert.AreEqual(enumClass.Day, Days.Thu); Assert.AreEqual(enumClass.Color, Colors.Blue); Assert.AreEqual(enumClass.Month, Months.All); } /// /// Test usage of dbType in a result map property. /// /// [Test] public void TestTypeSpecified() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithTypes", 1); AssertOrder1(order); } /// /// Test a Complex Object Mapping. /// Order + Account in Order.Account /// [Test] public void TestComplexObjectMapping() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithAccount", 1); AssertOrder1(order); AssertAccount1(order.Account); } /// /// Test collection mapping with extends attribute /// [Test] public void TestCollectionMappingAndExtends() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItemsCollection", 1); AssertOrder1(order); // Check strongly typed collection Assert.IsNotNull(order.LineItems); Assert.AreEqual(2, order.LineItems.Count); } /// /// Test collection mapping: Ilist collection /// order.LineItemsIList /// [Test] public void TestListMapping() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItems", 1); AssertOrder1(order); // Check IList collection Assert.IsNotNull(order.LineItemsIList); Assert.AreEqual(2, order.LineItemsIList.Count); } /// /// Test Array Mapping /// [Test] public void TestArrayMapping() { Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItemArray", 1); AssertOrder1(order); Assert.IsNotNull( order.LineItemsArray ); Assert.AreEqual(2, order.LineItemsArray.Length); } /// /// Test collection mapping /// order.LineItems /// [Test] public void TestStronglyTypedCollectionMapping() { Order order = (Order) sqlMap.QueryForObject("GetOrderWithLineItemCollection", 1); AssertOrder1(order); Assert.IsNotNull(order.LineItems); Assert.AreEqual(2, order.LineItems.Count); IEnumerator e = ((IEnumerable)order.LineItems).GetEnumerator(); while(e.MoveNext()) { LineItem item = (LineItem)e.Current; Assert.IsNotNull(item); } } /// /// Test a ResultMap mapping as an Hastable. /// [Test] public void TestHashtableMapping() { Hashtable order = (Hashtable) sqlMap.QueryForObject("GetOrderAsHastable", 1); AssertOrder1AsHashtable(order); } /// /// Test nested object. /// Order + FavouriteLineItem in order.FavouriteLineItem /// [Test] public void TestNestedObjects() { Order order = (Order) sqlMap.QueryForObject("GetOrderJoinedFavourite", 1); AssertOrder1(order); Assert.IsNotNull(order.FavouriteLineItem); Assert.AreEqual(2, order.FavouriteLineItem.Id, "order.FavouriteLineItem.Id"); Assert.AreEqual("ESM-23", order.FavouriteLineItem.Code); } /// /// Test nested object. /// Order + FavouriteLineItem in order.FavouriteLineItem /// [Test] public void TestNestedObjects2() { Order order = (Order) sqlMap.QueryForObject("GetOrderJoinedFavourite2", 1); AssertOrder1(order); Assert.IsNotNull(order.FavouriteLineItem); Assert.AreEqual(2, order.FavouriteLineItem.Id, "order.FavouriteLineItem.Id"); Assert.AreEqual("ESM-23", order.FavouriteLineItem.Code); } /// /// Test Implicit Result Maps /// [Test] public void TestImplicitResultMaps() { Order order = (Order) sqlMap.QueryForObject("GetOrderJoinedFavourite3", 1); AssertOrder1(order); Assert.IsNotNull(order.FavouriteLineItem); Assert.AreEqual(2, order.FavouriteLineItem.Id, "order.FavouriteLineItem.Id"); Assert.AreEqual("ESM-23", order.FavouriteLineItem.Code); } /// /// Test a composite Key Mapping. /// It must be: property1=column1,property2=column2,... /// [Test] public void TestCompositeKeyMapping() { Order order1 = (Order) sqlMap.QueryForObject("GetOrderWithFavouriteLineItem", 1); Order order2 = (Order) sqlMap.QueryForObject("GetOrderWithFavouriteLineItem", 2); Assert.IsNotNull(order1); Assert.IsNotNull(order1.FavouriteLineItem); Assert.AreEqual(2, order1.FavouriteLineItem.Id); Assert.IsNotNull(order2); Assert.IsNotNull(order2.FavouriteLineItem); Assert.AreEqual(1, order2.FavouriteLineItem.Id); } /// /// Test Dynamique Composite Key Mapping /// [Test] public void TestDynamiqueCompositeKeyMapping() { Order order1 = (Order) sqlMap.QueryForObject("GetOrderWithDynFavouriteLineItem", 1); Assert.IsNotNull(order1); Assert.IsNotNull(order1.FavouriteLineItem); Assert.AreEqual(2, order1.FavouriteLineItem.Id); } /// /// Test a simple type mapping (string) /// [Test] public void TestSimpleTypeMapping() { IList list = sqlMap.QueryForList("GetAllCreditCardNumbersFromOrders", null); Assert.AreEqual(5, list.Count ); Assert.AreEqual("555555555555", list[0]); } /// /// Test a simple type mapping (decimal) /// [Test] public void TestDecimalTypeMapping() { Hashtable param = new Hashtable(); param.Add("LineItem_ID", 1); param.Add("Order_ID", 10); decimal price = (decimal) sqlMap.QueryForObject("GetLineItemPrice", param); Assert.AreEqual( 45.43m, price); } /// /// Test Byte Array Mapping /// /// Test for request support 1032436 ByteArrayTypeHandler misses the last byte [Test] public void TestByteArrayMapping() { Account account = NewAccount6(); sqlMap.Insert("InsertAccountViaParameterMap", account); Order order = new Order(); order.Id = 99; order.CardExpiry = "09/11"; order.Account = account; order.CardNumber = "154564656"; order.CardType = "Visa"; order.City = "Lyon"; order.Date = System.DateTime.MinValue; order.PostalCode = "69004"; order.Province = "Rhone"; order.Street = "rue Durand"; sqlMap.Insert("InsertOrderViaParameterMap", order); LineItem item = new LineItem(); item.Id = 99; item.Code = "test"; item.Price = -99.99m; item.Quantity = 99; item.Order = order; item.PictureData = new byte[] {1, 2, 3}; // Check insert sqlMap.Insert("InsertLineItemWithPicture", item); // select LineItem loadItem = null; Hashtable param = new Hashtable(); param.Add("LineItem_ID", 99); param.Add("Order_ID", 99); loadItem = sqlMap.QueryForObject("GetSpecificLineItemWithPicture", param) as LineItem; Assert.IsNotNull( loadItem.Id ); Assert.IsNotNull( loadItem.PictureData ); Assert.AreEqual( item.PictureData, loadItem.PictureData ); } /// /// Test null replacement (on decimal) in ResultMap property /// [Test] public void TestNullValueReplacementOnDecimal() { Account account = NewAccount6(); sqlMap.Insert("InsertAccountViaParameterMap", account); Order order = new Order(); order.Id = 99; order.CardExpiry = "09/11"; order.Account = account; order.CardNumber = "154564656"; order.CardType = "Visa"; order.City = "Lyon"; order.Date = System.DateTime.MinValue; //<-- null replacement for parameterMAp order.PostalCode = "69004"; order.Province = "Rhone"; order.Street = "rue Durand"; sqlMap.Insert("InsertOrderViaParameterMap", order); LineItem item = new LineItem(); item.Id = 99; item.Code = "test"; item.Price = -99.99m;//<-- null replacement for parameterMAp item.Quantity = 99; item.Order = order; sqlMap.Insert("InsertLineItem", item); // Retrieve LineItem & test null replacement for resultMap LineItem testItem = (LineItem) sqlMap.QueryForObject("GetSpecificLineItemWithNullReplacement", 99); Assert.IsNotNull(testItem); Assert.AreEqual(-77.77m, testItem.Price); Assert.AreEqual("test", testItem.Code); } /// /// Test null replacement (on DateTime) in ResultMap property. /// [Test] public void TestNullValueReplacementOnDateTime() { Account account = NewAccount6(); sqlMap.Insert("InsertAccountViaParameterMap", account); Order order = new Order(); order.Id = 99; order.CardExpiry = "09/11"; order.Account = account; order.CardNumber = "154564656"; order.CardType = "Visa"; order.City = "Lyon"; order.Date = System.DateTime.MinValue; //<-- null replacement order.PostalCode = "69004"; order.Province = "Rhone"; order.Street = "rue Durand"; sqlMap.Insert("InsertOrderViaParameterMap", order); Order orderTest = (Order) sqlMap.QueryForObject("GetOrderLiteByColumnName", 99); Assert.AreEqual(System.DateTime.MinValue, orderTest.Date); } #endregion } }