<?php

Prado::using('System.Data.*');

if(!defined('TEST_DB_FILE'))
	define('TEST_DB_FILE',dirname(__FILE__).'/db/test.db');

class FooRecord extends TComponent
{
	public $id;
	private $_name;
	public $param;

	public function __construct($param)
	{
		$this->param=$param;
	}

	public function getName()
	{
		return $this->_name;
	}

	public function setName($value)
	{
		$this->_name=$value;
	}
}

/**
 * @package System.Data.PDO
 */
class TDbDataReaderTest extends PHPUnit_Framework_TestCase
{
	private $_connection;

	public function setUp()
	{
		@unlink(TEST_DB_FILE);
		$this->_connection=new TDbConnection('sqlite:'.TEST_DB_FILE);
		$this->_connection->Active=true;
		$this->_connection->createCommand('CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(8))')->execute();
		$this->_connection->createCommand('INSERT INTO foo (name) VALUES (\'my name\')')->execute();
		$this->_connection->createCommand('INSERT INTO foo (name) VALUES (\'my name 2\')')->execute();
	}

	public function tearDown()
	{
		$this->_connection=null;
	}

	public function testRead()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$row=$reader->read();
		$this->assertTrue($row['id']==='1' && $row['name']==='my name');
		$row=$reader->read();
		$this->assertTrue($row['id']==='2' && $row['name']==='my name 2');
		$row=$reader->read();
		$this->assertFalse($row);
	}

	public function testReadColumn()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$this->assertEquals($reader->readColumn(0),'1');
		$this->assertEquals($reader->readColumn(1),'my name 2');
		$this->assertFalse($reader->readColumn(0));
	}

	public function testReadObject()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$object=$reader->readObject('FooRecord',array('object'));
		$this->assertEquals($object->id,'1');
		$this->assertEquals($object->Name,'my name');
		$this->assertEquals($object->param,'object');
	}

	public function testReadAll()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$rows=$reader->readAll();
		$this->assertEquals(count($rows),2);
		$row=$rows[0];
		$this->assertTrue($row['id']==='1' && $row['name']==='my name');
		$row=$rows[1];
		$this->assertTrue($row['id']==='2' && $row['name']==='my name 2');

		$reader=$this->_connection->createCommand('SELECT * FROM foo WHERE id=3')->query();
		$rows=$reader->readAll();
		$this->assertEquals($rows,array());
	}

	public function testClose()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$row=$reader->read();
		$this->assertFalse($reader->IsClosed);
		$reader->close();
		$this->assertTrue($reader->IsClosed);
		try
		{
			$reader->read();
			$this->fail('Expected exception is not raised');
		}
		catch(Exception $e)
		{
		}
	}

	public function testRowCount()
	{
		// unable to test because SQLite doesn't support row count
	}

	public function testColumnCount()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$this->assertEquals($reader->ColumnCount,2);

		$reader=$this->_connection->createCommand('SELECT * FROM foo WHERE id=11')->query();
		$this->assertEquals($reader->ColumnCount,2);
	}

	public function testForeach()
	{
		$ids=array();
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		foreach($reader as $row)
			$ids[]=$row['id'];
		$this->assertEquals(count($ids),2);
		$this->assertTrue($ids[0]==='1' && $ids[1]==='2');

		try
		{
			foreach($reader as $row)
				$ids[]=$row['id'];
			$this->fail('Expected exception is not raised');
		}
		catch(TDbException $e)
		{
		}
	}

	public function testFetchMode()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();

		$reader->FetchMode=PDO::FETCH_NUM;
		$row=$reader->read();
		$this->assertFalse(isset($row['id']));
		$this->assertTrue(isset($row[0]));

		$reader->FetchMode=PDO::FETCH_ASSOC;
		$row=$reader->read();
		$this->assertTrue(isset($row['id']));
		$this->assertFalse(isset($row[0]));
	}

	public function testBindColumn()
	{
		$reader=$this->_connection->createCommand('SELECT * FROM foo')->query();
		$reader->bindColumn(1,$id);
		$reader->bindColumn(2,$name);
		$reader->read();
		$this->assertEquals($id,'1');
		$this->assertEquals($name,'my name');
		$reader->read();
		$this->assertEquals($id,'2');
		$this->assertEquals($name,'my name 2');
		$reader->read();
		$this->assertEquals($id,'2');
		$this->assertEquals($name,'my name 2');
	}
}

?>