<?php

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

/**
 * @package System.DataAccess.SQLMap
 */
class InheritanceTest extends BaseTest
{
	function __construct()
	{
		parent::__construct();

		$this->initSqlMap();
		$this->initScript('documents-init.sql');
	}

	/// Test All document with no formula
	function testGetAllDocument() 
	{
		$list = $this->sqlmap->queryForList("GetAllDocument");

		$this->assertEquals(6, count($list));
		$book = $list[0];
		$this->assertBook($book, 1, "The World of Null-A", 55);

		$book = $list[1];
		$this->assertBook($book, 3, "Lord of the Rings", 3587);

		$document = $list[2];
		$this->assertDocument($document, 5, "Le Monde");

		$document = $list[3];
		$this->assertDocument($document, 6, "Foundation");

		$news = $list[4];
		$this->assertNewspaper($news, 2, "Le Progres de Lyon", "Lyon");

		$document = $list[5];
		$this->assertDocument($document, 4, "Le Canard enchaine");
	}

	/// Test All document in a typed collection
	function testGetTypedCollection() 
	{
		$list = $this->sqlmap->queryForList("GetTypedCollection");

		$this->assertEquals(6, $list->getCount());

		$book = $list[0];
		$this->assertBook($book, 1, "The World of Null-A", 55);

		$book = $list[1];
		$this->assertBook($book, 3, "Lord of the Rings", 3587);

		$document = $list[2];
		$this->assertDocument($document, 5, "Le Monde");

		$document = $list[3];
		$this->assertDocument($document, 6, "Foundation");

		$news = $list[4];
		$this->assertNewspaper($news, 2, "Le Progres de Lyon", "Lyon");

		$document = $list[5];
		$this->assertDocument($document, 4, "Le Canard enchaine");
	}

	/// Test All document with Custom Type Handler
	function testGetAllDocumentWithCustomTypeHandler() 
	{

		//register the custom inheritance type handler
		$this->sqlmap->getTypeHandlerFactory()->register(
			'CustomInheritance', new CustomInheritance);

		$list = $this->sqlmap->queryForList("GetAllDocumentWithCustomTypeHandler");

		$this->assertEquals(6, count($list));
		$book = $list[0];
		$this->assertBook($book, 1, "The World of Null-A", 55);

		$book = $list[1];
		$this->assertBook($book, 3, "Lord of the Rings", 3587);

		$news = $list[2];
		$this->assertNewspaper($news, 5, "Le Monde", "Paris");

		$book = $list[3];
		$this->assertBook($book, 6, "Foundation", 557);

		$news = $list[4];
		$this->assertNewspaper($news, 2, "Le Progres de Lyon", "Lyon");

		$news = $list[5];
		$this->assertNewspaper($news, 4, "Le Canard enchaine", "Paris");
	}

	function AssertDocument(Document $document, $id, $title)
	{
		$this->assertEquals($id, $document->getID());
		$this->assertEquals($title, $document->getTitle());
	}

	function AssertBook(Book $book, $id, $title, $pageNumber)
	{
		$this->assertEquals($id, $book->getId());
		$this->assertEquals($title, $book->getTitle());
		$this->assertEquals($pageNumber, (int)$book->getPageNumber());
	}

	function AssertNewspaper(Newspaper $news, $id, $title, $city)
	{
		$this->assertEquals($id, $news->getId());
		$this->assertEquals($title, $news->getTitle());
		$this->assertEquals($city, $news->getCity());
	}
}


class CustomInheritance implements ITypeHandlerCallback
{
	public function getResult($type)
	{
		switch ($type)
		{
			case 'Monograph': case 'Book': 
				return 'Book';
			case 'Tabloid': case 'Broadsheet': case 'Newspaper':
				return 'Newspaper';
			default: 
				return 'Document';
		}
	}

	public function getParameter($parameter)
	{
		throw new TDataMapperException('not implemented');
	}

	public function createNewInstance($data=null)
	{
		throw new TDataMapperException('can not create');
	}
}
?>