<?php
class AdapterMock implements Doctrine_Adapter_Interface {
    private $name;
    
    private $queries = array();
    

    public function __construct($name) {
        $this->name = $name;
    }
    public function getName() {
        return $this->name;
    }
    public function pop() {
        return array_pop($this->queries);
    }

    public function prepare($prepareString){ 
        return new AdapterStatementMock;
    }
    public function query($queryString) {
        $this->queries[] = $queryString;
        
        return new AdapterStatementMock;
    }
    public function getAll() {
        return $this->queries;
    }
    public function quote($input) {
        return "'" . addslashes($input) . "'";
    }
    public function exec($statement) { 
        $this->queries[] = $statement;
        
        return 0;
    }
    public function lastInsertId(){ }
    public function beginTransaction(){ 
        $this->queries[] = 'BEGIN TRANSACTION';
    }
    public function commit(){ 
        $this->queries[] = 'COMMIT';
    }
    public function rollBack(){ }
    public function errorCode(){ }
    public function errorInfo(){ }
    public function getAttribute($attribute) { 
        if($attribute == PDO::ATTR_DRIVER_NAME)
            return $this->name;
    }
    public function setAttribute($attribute, $value) {
                                   	
    }
}
class AdapterStatementMock {
    public function fetch($fetchMode) { 
        return array();
    }
    public function fetchAll($fetchMode) {
        return array();
    }
}
class Doctrine_Driver_UnitTestCase extends UnitTestCase {
    protected $driverName = false;
    protected $generic = false;
    protected $manager;
    protected $conn;
    protected $adapter;
    protected $export;
    protected $dataDict;
    protected $transaction;

    public function __construct($driverName, $generic = false) {

        $this->driverName = $driverName;
        $this->generic    = $generic;
    }
    public function assertDeclarationType($type, $type2) {
        $dec = $this->getDeclaration($type);
        if( ! is_array($type2))
            $type2 = array($type2);
        $this->assertEqual($dec[0], $type2);
    }
    public function getDeclaration($type) {
        return $this->dataDict->getPortableDeclaration(array('type' => $type, 'name' => 'colname', 'length' => 1, 'fixed' => true));
    }
    public function init() {
        $this->adapter = new AdapterMock($this->driverName);
        $this->manager = Doctrine_Manager::getInstance();
        $this->manager->setDefaultAttributes();
        $this->conn = $this->manager->openConnection($this->adapter);

        if( ! $this->generic) {
            $this->export   = $this->conn->export;

            $name = $this->adapter->getName();

            if($this->adapter->getName() == 'oci')
                $name = 'Oracle';
            
            $tx = 'Doctrine_Transaction_' . ucwords($name);
            $dataDict = 'Doctrine_DataDict_' . ucwords($name);

            if(class_exists($tx))
                $this->transaction = new $tx($this->conn);
            if(class_exists($dataDict)) {
                $this->dataDict = new $dataDict($this->conn);
            } 
            //$this->dataDict = $this->conn->dataDict;
        } else {
            $this->export   = new Doctrine_Export($this->conn);
            $this->transaction = new Doctrine_Transaction($this->conn);
        }
    }

    public function setUp() {
        static $init = false;
        if( ! $init) {
            $this->init();
            $init = true;
        }
    }
}
?>