<?php

require_once(dirname(__FILE__).'/BaseCase.php');

/**
 * @package System.DataAccess.SQLMap
 */
class ParameterMapTest extends BaseCase
{
	function __construct()
	{
		parent::__construct();
		$this->initSqlMap();
	}

	function setup()
	{
		$this->initScript('account-init.sql');
//		$this->initScript('account-procedure.sql');
		$this->initScript('order-init.sql');
//		$this->initScript('line-item-init.sql');
		$this->initScript('category-init.sql');
	}

	/// Test null replacement in ParameterMap property
	function testNullValueReplacement()
	{
		$account = $this->newAccount6();

		$this->sqlmap->insert("InsertAccountViaParameterMap", $account);
		$account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6);

		$this->assertNull($account->getEmailAddress(), 'no_email@provided.com');

		$this->assertAccount6($account);
	}

	/// Test Test Null Value Replacement Inline
	function testNullValueReplacementInline()
	{
		$account = $this->newAccount6();

		$this->sqlmap->insert("InsertAccountViaInlineParameters", $account);
		$account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6);
		$this->assertNull($account->getEmailAddress());

		$this->assertAccount6($account);
	}

	/// Test Test Null Value Replacement Inline
	function testSpecifiedType()
	{
		$account = $this->newAccount6();
		$account->setEmailAddress(null);
		$this->sqlmap->insert("InsertAccountNullableEmail", $account);
		$account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6);
		$this->assertAccount6($account);
	}


	/// Test Test Null Value Replacement Inline
	function testUnknownParameterClass()
	{
		$account = $this->newAccount6();
		$account->setEmailAddress(null);
		$this->sqlmap->insert("InsertAccountUknownParameterClass", $account);
		$account = $this->sqlmap->queryForObject("GetAccountNullableEmail", 6);
		$this->assertAccount6($account);
	}


	/// Test null replacement in ParameterMap property
	/// for System.DateTime.MinValue
	function testNullValueReplacementForDateTimeMinValue()
	{
		$account = $this->newAccount6();
		$this->sqlmap->insert("InsertAccountViaParameterMap", $account);
		$order = new Order();
		$order->setId(99);
		$order->setCardExpiry("09/11");
		$order->setAccount($account);
		$order->setCardNumber("154564656");
		$order->setCardType("Visa");
		$order->setCity("Lyon");
		$order->setDate(null);
		$order->setPostalCode("69004");
		$order->setProvince("Rhone");
		$order->setStreet("rue Durand");

		$this->sqlmap->insert("InsertOrderViaParameterMap", $order);

		$orderTest = $this->sqlmap->queryForObject("GetOrderLiteByColumnName", 99);

		$this->assertIdentical($order->getCity(), $orderTest->getCity());
	}

	/// Test null replacement in ParameterMap/Hahstable property
	/// for System.DateTime.MinValue
	function testNullValueReplacementForDateTimeWithHashtable()
	{
		$account = $this->newAccount6();

		$this->sqlmap->insert("InsertAccountViaParameterMap", $account);

		$order = new Order();
		$order->setId(99);
		$order->setCardExpiry("09/11");
		$order->setAccount($account);
		$order->setCardNumber("154564656");
		$order->setCardType("Visa");
		$order->setCity("Lyon");
		$order->setDate('0001-01-01 00:00:00'); //<-- null replacement
		$order->setPostalCode("69004");
		$order->setProvince("Rhone");
		$order->setStreet("rue Durand");

		$this->sqlmap->insert("InsertOrderViaParameterMap", $order);

		$orderTest = $this->sqlmap->queryForObject("GetOrderByHashTable", 99);

		$this->assertIdentical($orderTest["Date"], '0001-01-01 00:00:00');
	}

	/// Test null replacement in ParameterMap property
	/// for Guid
	function testNullValueReplacementForGuidValue()
	{
		if($this->hasSupportFor('last_insert_id'))
		{
			$category = new Category();
			$category->setName("Totoasdasd");
			$category->setGuidString('00000000-0000-0000-0000-000000000000');

			$key = $this->sqlmap->insert("InsertCategoryNull", $category);

			$categoryRead = $this->sqlmap->queryForObject("GetCategory", $key);

			$this->assertIdentical($category->getName(), $categoryRead->getName());
			$this->assertIdentical('', $categoryRead->getGuidString());
		}
	}



/// Test complex mapping Via hasTable
	/// <example>
	///
	/// map.Add("Item", Item);
	/// map.Add("Order", Order);
	///
	/// <statement>
	/// ... #Item.prop1#...#Order.prop2#
	/// </statement>
	///
	/// </example>
	function testComplexMappingViaHasTable()
	{
		$a = new Account();
		$a->setFirstName("Joe");

		$param["Account"] = $a;

		$o = new Order();
		$o->setCity("Dalton");
		$param["Order"] = $o;

		$accountTest = $this->sqlmap->queryForObject("GetAccountComplexMapping", $param);

		$this->assertAccount1($accountTest);
	}

/*
	/// Test ByteArrayTypeHandler via Picture Property
	function testByteArrayTypeHandler()
	{
		$account = $this->newAccount6();

		$this->sqlmap->insert("InsertAccountViaParameterMap", $account);

		$order = new Order();
		$order->setId(99);
		$order->setCardExpiry("09/11");
		$order->setAccount($account);
		$order->setCardNumber("154564656");
		$order->setCardType("Visa");
		$order->setCity("Lyon");
		$order->setDate(0);
		$order->setPostalCode("69004");
		$order->setProvince("Rhone");
		$order->setStreet("rue Durand");

		$this->sqlmap->insert("InsertOrderViaParameterMap", $order);

		$item = new LineItem();
		$item->setId(99);
		$item->setCode("test");
		$item->setPrice(-99.99);
		$item->setQuantity(99);
		$item->setOrder($order);
		$item->setPicture(null);

		// Check insert
		$this->sqlmap->insert("InsertLineItemWithPicture", $item);

		// select
		$item = null;

		$param["LineItem_ID"] = 99;
		$param["Order_ID"] = 99;

		$item = $this->sqlmap->queryForObject("GetSpecificLineItemWithPicture", $param);

		$this->assertNotNull($item->getId());
//		$this->assertNotNull($item->getPicture());
//		$this->assertIdentical( GetSize(item.Picture), this.GetSize( this.GetPicture() ));
	}
*/

	/// Test extend parameter map capacity
	/// (Support Requests 1043181)
	function testInsertOrderViaExtendParameterMap()
	{
		$this->sqlmap->getSqlMapManager()->getTypeHandlers()->registerTypeHandler(new HundredsBool());

		$account = $this->newAccount6();
		$this->sqlmap->insert("InsertAccountViaParameterMap", $account);

		$order = new Order();
		$order->setId(99);
		$order->setCardExpiry("09/11");
		$order->setAccount($account);
		$order->setCardNumber("154564656");
		$order->setCardType("Visa");
		$order->setCity("Lyon");
		$order->setDate(null); //<-- null replacement
		$order->setPostalCode("69004");
		$order->setProvince("Rhone");
		$order->setStreet("rue Durand");

		$this->sqlmap->insert("InsertOrderViaExtendParameterMap", $order);

		$orderTest = $this->sqlmap->queryForObject("GetOrderLiteByColumnName", 99);

		$this->assertIdentical($order->getCity(), $orderTest->getCity());
	}
/**/
}

?>