Login   Register  
PHP Classes
elePHPant
Icontem

File: MySQL_Test.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Aziz S. Hussain  >  mysql_* functions using PDO  >  MySQL_Test.php  >  Download  
File: MySQL_Test.php
Role: Unit test script
Content type: text/plain
Description: Unit test
Class: mysql_* functions using PDO
Access MySQL databases using PDO wrapper functions
Author: By
Last change: Bug fixes
Date: 2 months ago
Size: 36,705 bytes
 

Contents

Class file image Download
<?php
/**
 * This is a simple unit test for all the MySQL_*
 * functions so that they match our functions
 *
 * This test should be run with a MySQL functions enabled
 * 
 * @author    Aziz S. Hussain <azizsaleh@gmail.com>
 * @copyright GPL license 
 * @license   http://www.gnu.org/copyleft/gpl.html 
 * @link      http://www.AzizSaleh.com
 */

/*
 * Test Db Params - user needs db/table create, drop,
 * insert, delete, update permissions)
 */
define('TEST_HOST', 'localhost');
define('TEST_USER', 'root');
define('TEST_PASS', '');

define('TEST_DB', 'unit_sql_v_1');
define('TEST_TABLE', 'unit_sql_table_1');

require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MySQL.php');
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MySQL_Definitions.php');

/**
 * MySQL_Test
 *
 * Test object
 * 
 * @author    Aziz S. Hussain <azizsaleh@gmail.com>
 * @copyright GPL license 
 * @license   http://www.gnu.org/copyleft/gpl.html 
 * @link      http://www.AzizSaleh.com
 */
class MySQL_Test
{
    /**
     * Test Results
     *
     * @var array
     */
    public $results = array(
        'valid'     => 0,
        'invalid'   => 0,
        'naf'       => 0,
        'tests'     => 0,
    );

    /**
     * MySQL Object
     *
     * @var MySQL
     */
    protected $_object;
    
    /**
     * Connection holder
     *
     * @var array
     */
    protected $_cached = array();

    /**
     * Start testing
     *
     * @return void
     */
    public function __construct()
    {
        // Set text on browser
        if (php_sapi_name() != 'cli') {
            header('Content-type: text/plain');
        }

        // Set object
        $this->_object = MySQL::getInstance();

        // Get tests
        $tests = get_class_methods($this);
        
        // Set print mask
        $masker = "| %-30.30s | %7s |" . PHP_EOL;

        // Print header
        printf($masker, '------------------------------', '-------');
        printf($masker, 'Test', 'Result');
        printf($masker, '------------------------------', '-------');

        // Load db first
        $link = mysql_connect(TEST_HOST, TEST_USER, TEST_PASS);
        $statements = explode(';', 
            file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MySQL_Test_Schema.sql')
        );

        foreach ($statements as $statement) {
            mysql_query(trim($statement)) or die(mysql_error());
        }
        mysql_close($link);

        // Go through each test
        foreach ($tests as $test) {
        
            // Skip private/protected methods
            if (substr($test, 0, 1) == '_') {
                continue;
            }
            
            // Get mysql_* method
            $name = strtolower(str_replace('_Test', '', $test));

            // Increment # of tests
            $this->results['tests']++;
            
            // If it doesn't exist, naf it (not a function)
            if (!function_exists($name)) {
                $this->results['naf']++;
                printf($masker, $test, 'NAF');
                continue;
            }

            // Run tests
            if ($this->$test()) {
                $this->results['valid']++;
                printf($masker, $test, 'Success');
            } else {
                $this->results['invalid']++;
                printf($masker, $test, 'Failure');
            }
        }
        
        // Print footer
        printf($masker, '------------------------------', '-------');
    }

    /**
     * After finishing, print out the results
     *
     * @return void
     */
    public function __destruct()
    {
        // Echo results
        echo PHP_EOL . "Completed \t{$this->results['tests']} Tests" . PHP_EOL;
        echo "Passed \t\t{$this->results['valid']} Tests" . PHP_EOL;
        echo "Failed \t\t{$this->results['invalid']} Tests" . PHP_EOL;
        echo "NAF \t\t{$this->results['naf']} Tests" . PHP_EOL;
        
        // Close our connections
        $this->_object->mysql_close_all();
        
        // Close mysql connections
        foreach ($this->_cached as $resource) {
            // Not a resource
            if (!is_resource($resource)) {
                continue;
            }

            // Check resource type
            $type = get_resource_type($resource);
            if (substr($type, 0, 10) != 'mysql link') {
                continue;
            }

            // Close it
            mysql_close($resource);
        }
    }

    /**
     * Test mysql_connect
     *
     * @return boolean
     */
    public function MySQL_Connect_Test()
    {
        // Simple connection test
        list($mysql, $ourDb) = $this->_getConnection();

        return ($ourDb !== false && is_resource($mysql));
    }
    
    /**
     * Test pconnect
     *
     * @return boolean
     */
    public function MySQL_Pconnect_Test()
    {
        // We need to make sure that the connection ids are the same
        $lastMySQLId = false;
        $lastOurId = false;

        for ($x = 0; $x <= 5; $x++) {
            // Connect
            $mysql = mysql_pconnect(TEST_HOST, TEST_USER, TEST_PASS);
            $ourDb = $this->_object->mysql_pconnect(TEST_HOST, TEST_USER, TEST_PASS);

            // Keep track of resource
            $this->_cached[] = $mysql;

            // Get thread ids
            $thisMySQLId = mysql_thread_id();
            $thisOurId = $this->_object->mysql_thread_id();

            // Get original ids if not set
            if ($lastMySQLId == false) {
                $lastMySQLId = $thisMySQLId;
                $lastOurId = $thisOurId;
            }

            // Keep checking that the ids are the same
            if ($thisMySQLId !== $lastMySQLId || $thisOurId !== $lastOurId) {
                return false;
            }
        }

        return true;
    }
    
    /**
     * Test mysql_select_db
     *
     * @return boolean
     */
    public function MySQL_Select_Db_Test()
    {
        // Connect
        $this->_getConnection();

        // Select Db
        $this->_selectDb();

        // Get db name
        $dbName = mysql_fetch_assoc(mysql_query("SELECT DATABASE() as Databasename"));
        $dbNameOur = $this->_object->mysql_fetch_assoc($this->_object->mysql_query("SELECT DATABASE() as Databasename"));

        // Must be identical
        return ($dbName['Databasename'] === $dbNameOur['Databasename'] && $dbName['Databasename'] === TEST_DB);
    }
    
    /**
     * Test mysql_selectdb
     *
     * @return boolean
     */
    public function MySQL_SelectDb_Test()
    {
        // Alias of Mysql_Select_Db_Test
        return true;
    }
    
    /**
     * Test mysql_query
     *
     * @return boolean
     */
    public function MySQL_Query_Test()
    {
        // Done in Mysql_Select_Db_Test
        return true;
    }
    
    /**
     * Test mysql_real_escape_string
     *
     * @return boolean
     */
    public function MySQL_Real_Escape_String_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();

        // Compose string
        $string = "mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', \" and \x1a. ";

        // Select Db
        $this->_selectDb();

        // Escape it
        $val1 = mysql_real_escape_string($string);
        $val2 = $this->_object->mysql_real_escape_string($string);
        $query = 'INSERT INTO ' . TEST_TABLE . " (field_name) VALUES ('$val2')";
        $query2 = 'INSERT INTO ' . TEST_TABLE . " (field_name) VALUES ('$val2')";

        // Add it
        mysql_query($query);
        $this->_object->mysql_query($query2);

        // Get added ID (confirm add)
        $id1 = mysql_insert_id();
        $id2 = $this->_object->mysql_insert_id();

        return $id1 == 1 && $id2 == 2;
    }
    
    /**
     * Test mysql_escape_string
     *
     * @return boolean
     */
    public function MySQL_Escape_String_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();
        
        // Compose string
        $string = "mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', \" and \x1a. ";
        
        // Select Db
        $this->_selectDb();

        // Escape it
        $val1 = mysql_escape_string($string);
        $val2 = $this->_object->mysql_escape_string($string);
        $query = 'INSERT INTO ' . TEST_TABLE . " (field_name) VALUES ('$val2')";
        $query2 = 'INSERT INTO ' . TEST_TABLE . " (field_name) VALUES ('$val2')";

        // Add it
        mysql_query($query);
        $this->_object->mysql_query($query2);

        // Get added ID (confirm add)
        $id1 = mysql_insert_id();
        $id2 = $this->_object->mysql_insert_id();

        return $id1 == 3 && $id2 == 4;
    }
    
    /**
     * Test mysql_fetch_array
     *
     * @return boolean
     */
    public function MySQL_Fetch_Array_Test()
    {
        // Select Db
        $this->_selectDb();

        // Get rows (we should have 2 by now)
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' ORDER BY field_id ASC LIMIT 2';
        
        // Results
        $res1 = array();
        $res2 = array();

        // For each fetch type
        foreach (array(MYSQL_ASSOC) as $fetchType) {

            // Query
            $query = mysql_query($sql);
            $query2 = $this->_object->mysql_query($sql);

            // Must match
            while ($r = mysql_fetch_array($query, $fetchType)) {
                $res1[] = $r;
            }
            while($r2 = $this->_object->mysql_fetch_array($query2, $fetchType)) {
                $res2[] = $r2;
            }
        }

        $count = count($res1);
        for ($x = 0; $x < $count; $x++) {
            // Standardize order of keys, data must match
            $row1 = $res1[$x];
            $row2 = $res2[$x];
            sort($row1, SORT_STRING);
            sort($row2, SORT_STRING);
            if ($row1 !== $row2) {
                return false;
            }
        }
        
        return true;
    }

    /**
     * Test mysql_fetch_assoc
     *
     * @return boolean
     */
    public function MySQL_Fetch_Assoc_Test()
    {
        // Done in Mysql_Select_Db_Test
        return true;
    }

    /**
     * Test mysql_fetch_row
     *
     * @return boolean
     */
    public function MySQL_Fetch_Row_Test()
    {
        // Done in Mysql_Fetch_Array_Test
        return true;
    }
    
    /**
     * Test mysql_fetch_object
     *
     * @return boolean
     */
    public function MySQL_Fetch_Object_Test()
    {
        // Select Db
        $this->_selectDb();

        // Get rows (we should have 2 by now)
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' ORDER BY field_id ASC LIMIT 1';
        
        // Results
        $res1 = array();
        $res2 = array();

        // Query
        $query = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Must match
        while ($r = mysql_fetch_object($query)) {
            $res1[] = $r;
        }
        while($r2 = $this->_object->mysql_fetch_object($query2)) {
            $res2[] = $r2;
        }

        // Can't be identical because of stdclass object resource # difference
        return $res1 == $res2;
    }
    
    /**
     * Test mysql_ping
     *
     * @return boolean
     */
    public function MySQL_Ping_Test()
    {
        return (mysql_ping() === true && $this->_object->mysql_ping() === true);
    }
    
    /**
     * Test mysql_errno
     *
     * @return boolean
     */
    public function MySQL_Errno_Test()
    {
        $badSql = 'SELECT * FROM TABLE.*';
        
        mysql_query($badSql);
        $this->_object->mysql_query($badSql);

        return mysql_errno() === $this->_object->mysql_errno();
    }
    
    /**
     * Test mysql_error
     *
     * @return boolean
     */
    public function MySQL_Error_Test()
    {
        $badSql = 'SELECT * FROM TABLE.*';
        
        mysql_query($badSql);
        $this->_object->mysql_query($badSql);
        
        return mysql_error() === $this->_object->mysql_error();
    }
    
    /**
     * Test mysql_affected_rows
     *
     * @return boolean
     */
    public function MySQL_Affected_Rows_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();
        
        // Select Db
        $this->_selectDb();
        
        // Set different SQL
        $sql = 'UPDATE ' . TEST_TABLE . " SET field_name = 'test string' WHERE field_id <= 100";
        $sql2 = 'UPDATE ' . TEST_TABLE . " SET field_name = 'test string 2' WHERE field_id <= 100";
        
        // Query
        mysql_query($sql);
        $this->_object->mysql_query($sql2);
        return mysql_affected_rows() === $this->_object->mysql_affected_rows();
    }
    
    /**
     * Test mysql_client_encoding
     *
     * @return boolean
     */
    public function MySQL_Client_Encoding_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();

        // Select Db
        $this->_selectDb();

        // Get encoding
        $code1 = mysql_client_encoding();
        $code2 = $this->_object->mysql_client_encoding();
        
        return $code1 === $code2;
    }    

    /**
     * Test mysql_close
     *
     * @return boolean
     */
    public function MySQL_Close_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();

        // Select Db
        $this->_selectDb();

        return mysql_close($mysql) === $this->_object->mysql_close($ourDb);
    }
    
    /**
     * Test mysql_create_db
     *
     * @return boolean
     */
    public function MySQL_Create_Db_Test()
    {
        // Connect
        $newDb = 'unit_sql_v_2';

        return mysql_create_db($newDb) === $this->_object->mysql_create_db($newDb);
    }
    
    /**
     * Test mysql_createdb
     *
     * @return boolean
     */
    public function MySQL_CreateDb_Test()
    {
        // Alias of Mysql_Create_Db_Test
        return true;
    }
    
    /**
     * Test mysql_data_seek
     *
     * @return boolean
     */
    public function MySQL_Data_Seek_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();
        
        // Select Db
        $this->_selectDb();
        
        // Get rows (we should have 2 by now)
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' ORDER BY field_id ASC LIMIT 2';
        
        // Results
        $res1 = array();
        $res2 = array();

        // Query
        $query = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);
        
        mysql_data_seek($query, 1);
        $this->_object->mysql_data_seek($query2, 1);

        return mysql_fetch_assoc($query) == $this->_object->mysql_fetch_assoc($query2);
    }
    
    /**
     * Test mysql_list_dbs
     *
     * @return boolean
     */
    public function MySQL_List_Dbs_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();
        
        $dbs1 = mysql_list_dbs();
        $dbs2 = $this->_object->mysql_list_dbs();
        
        $list1 = array();
        $list2 = array();

        while ($a = mysql_fetch_row($dbs1)) {
            $list1[] = $a[0];        
        }
        while ($a = $this->_object->mysql_fetch_row($dbs2)) {
            $list2[] = $a[0];        
        }

        return $list1 === $list2;
    }
    
    /**
     * Test mysql_listdbs
     *
     * @return boolean
     */
    public function MySQL_ListDbs_Test()
    {
        // Alias of Mysql_List_Dbs_Test
        return true;
    }
    
    /**
     * Test mysql_db_name
     *
     * @return boolean
     */
    public function MySQL_Db_Name_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();
        
        $dbs1 = mysql_list_dbs();
        $dbs2 = $this->_object->mysql_list_dbs();
        
        $list1 = array();
        $list2 = array();

        $i = 0;
        $cnt = mysql_num_rows($dbs1);
        while ($i < $cnt) {
            $list1[] = mysql_db_name($dbs1, $i);
            $i++;
        }
        
        $i = 0;
        $cnt = $this->_object->mysql_num_rows($dbs2);

        while ($i < $cnt) {
            $list2[] = $this->_object->mysql_db_name($dbs2, $i);
            $i++;
        }

        return $list1 === $list2;
    }
    
    /**
     * Test mysql_dbname
     *
     * @return boolean
     */
    public function MySQL_Dbname_Test()
    {
        // Alias of Mysql_Db_Name_Test
        return true;
    }
    
    /**
     * Test mysql_db_query
     *
     * @return boolean
     */
    public function MySQL_Db_Query_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();

        // Get row
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' ORDER BY field_id ASC LIMIT 1';
        
        // Select db + query
        $query1 = mysql_db_query(TEST_DB, $sql);
        $query2 = $this->_object->mysql_db_query(TEST_DB, $sql);
        
        // Get first rows
        $row1 = mysql_fetch_assoc($query1);
        $row2 = $this->_object->mysql_fetch_assoc($query2);

        // Match them
        return $row1 === $row2;
    }

    /**
     * Test mysql_drop_db
     *
     * @return boolean
     */
    public function MySQL_Drop_Db_Test()
    {
        // Connect
        $newDb = 'unit_sql_v_2';

        return mysql_drop_db($newDb) === $this->_object->mysql_drop_db($newDb);
    }
    
    /**
     * Test mysql_dropdb
     *
     * @return boolean
     */
    public function MySQL_DropDb_Test()
    {
        // Alias of Mysql_Drop_Db_Test
        return true;
    }
    
    /**
     * Test mysql_unbuffered_query
     *
     * @return boolean
     */
    public function MySQL_Unbuffered_Query_Test()
    {
        // Select Db
        $this->_selectDb();

        // Get rows (we should have 2 by now)
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' ORDER BY field_id ASC LIMIT 1';
        
        // Results
        $res1 = array();
        $res2 = array();

        // For each fetch type
        foreach (array(MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH) as $fetchType) {

            // Query
            $query = mysql_unbuffered_query($sql);
            $query2 = $this->_object->mysql_unbuffered_query($sql);

            // Must match
            while ($r = mysql_fetch_array($query, $fetchType)) {
                $res1[] = $r;
            }
            while($r2 = $this->_object->mysql_fetch_array($query2, $fetchType)) {
                $res2[] = $r2;
            }
        }
        
        $count = count($res1);
        for ($x = 0; $x < $count; $x++) {
            // Standardize order of keys, data must match
            $row1 = $res1[$x];
            $row2 = $res2[$x];
            sort($row1, SORT_STRING);
            sort($row2, SORT_STRING);
            if ($row1 !== $row2) {
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * Test mysql_thread_id
     *
     * @return boolean
     */
    public function MySQL_Thread_Id_Test()
    {
        // Done in Mysql_Pconnect_Test
        return true;
    }
    
    /**
     * Test mysql_list_tables
     *
     * @return boolean
     */
    public function MySQL_List_Tables_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();

        // Results
        $res1 = array();
        $res2 = array();

        // Query
        $query = mysql_list_tables(TEST_DB);
        $query2 = $this->_object->mysql_list_tables(TEST_DB);

        // Must match
        while ($r = mysql_fetch_assoc($query)) {
            $res1[] = $r;
        }
        while($r2 = $this->_object->mysql_fetch_assoc($query2)) {
            $res2[] = $r2;
        }

        return $res1 === $res2;
    }
    
    /**
     * Test mysql_listtables
     *
     * @return boolean
     */
    public function MySQL_ListTables_Test()
    {
        // Alias of Mysql_List_Tables_Test
        return true;
    }
    
    /**
     * Test mysql_tablename
     *
     * @return boolean
     */
    public function MySQL_Tablename_Test()
    {
        // Connect
        list($mysql, $ourDb) = $this->_getConnection();
        
        $dbs1 = mysql_list_tables(TEST_DB);
        $dbs2 = $this->_object->mysql_list_tables(TEST_DB);
        
        $list1 = array();
        $list2 = array();

        $i = 0;
        $cnt = mysql_num_rows($dbs1);
        while ($i < $cnt) {
            $list1[] = mysql_tablename($dbs1, $i);
            $i++;
        }
        
        $i = 0;
        $cnt = $this->_object->mysql_num_rows($dbs2);

        while ($i < $cnt) {
            $list2[] = $this->_object->mysql_tablename($dbs2, $i);
            $i++;
        }

        return $list1 === $list2;
    }
    
    /**
     * Test mysql_stat
     *
     * @return boolean
     */
    public function MySQL_Stat_Test()
    {
        // Get stats
        $stat1 = mysql_stat();
        $stat2 = $this->_object->mysql_stat();        

        // Extract all #'s out
        preg_match_all('!\d+!', $stat1, $matches1);
        preg_match_all('!\d+!', $stat2, $matches2);        
        unset($stat1, $stat2);

        // Go through each number
        $count = count($matches1[0]);
        for ($x = 0; $x < $count; $x++) {
            $diff = abs($matches1[0][$x] - $matches2[0][$x]);
            
            // Make sure that the difference is <= 10 (margin of change while queries are running)
            if ($diff > 10) {
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * Test mysql_set_charset
     *
     * @return boolean
     */
    public function MySQL_Set_Charset_Test()
    {
        // Set charset
        $charset = 'latin1';
        mysql_set_charset($charset);
        $this->_object->mysql_set_charset($charset);

        // Get charset
        $enc1 = mysql_client_encoding();
        $enc2 = $this->_object->mysql_client_encoding();

        return $enc1 === $enc2;
    }
    
    /**
     * Test mysql_result
     *
     * @return boolean
     */
    public function MySQL_Result_Test()
    {
        // Select Db
        $this->_selectDb();

        // Get rows
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' ORDER BY field_id ASC LIMIT 2';

        // Query
        $query = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        $string1 = mysql_result($query, 1);
        $string2 = $this->_object->mysql_result($query2, 1);

        return $string1 === $string2;
    }
    
    /**
     * Test mysql_list_processes
     *
     * @return boolean
     */
    public function MySQL_List_Processes_Test()
    {
        $dbs1 = mysql_list_processes();
        $dbs2 = $this->_object->mysql_list_processes();
        
        $list1 = array();
        $list2 = array();

        while ($row = mysql_fetch_assoc($dbs1)) {
            $list1[] = $row;
        }
        
        while ($row = $this->_object->mysql_fetch_assoc($dbs2)) {
            $list2[] = $row;
        }
            
        $count = count($list1);
        for ($x = 0; $x < $count; $x++) {
            if ($list1[$x]['Id'] != $list1[$x]['Id']) {
                return false;
            }
        }

        return true;
    }

    /**
     * Test mysql_insert_id
     *
     * @return boolean
     */
    public function MySQL_Insert_Id_Test()
    {
        // Done in Mysql_Real_Escape_String_Test
        return true;
    }
    
    /**
     * Test mysql_get_server_info
     *
     * @return boolean
     */
    public function MySQL_Get_Server_Info_Test()
    {
        $str1 = mysql_get_server_info();
        $str2 = $this->_object->mysql_get_server_info();
        return $str1 === $str2;
    }
    
    /**
     * Test mysql_get_proto_info
     *
     * @return boolean
     */
    public function MySQL_Get_Proto_Info_Test()
    {
        $str1 = mysql_get_proto_info();
        $str2 = $this->_object->mysql_get_proto_info();
        return $str1 === $str2;
    }
    
    /**
     * Test mysql_get_host_info
     *
     * @return boolean
     */
    public function MySQL_Get_Host_Info_Test()
    {
        $str1 = mysql_get_host_info();
        $str2 = $this->_object->mysql_get_host_info();
        return $str1 === $str2;
    }
    
    /**
     * Test mysql_get_client_info
     *
     * @return boolean
     */
    public function MySQL_Get_Client_Info_Test()
    {
        $str1 = mysql_get_client_info();
        $str2 = $this->_object->mysql_get_client_info();
        return $str1 === $str2;
    }
    
    /**
     * Test mysql_free_result
     *
     * @return boolean
     */
    public function MySQL_Free_Result_Test()
    {
        $sql = 'SELECT * FROM ' . TEST_TABLE;
        
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);
        
        $count1 = 0;
        $count2 = 0;
        
        // Validate query to avoid throwing errors
        while (get_resource_type($query1) == 'mysql result' && $row = @mysql_fetch_assoc($query1)) {
            $count1++;
            mysql_free_result($query1);
        }

        while ($query2 && $row = $this->_object->mysql_fetch_assoc($query2)) {
            $count2++;
            $this->_object->mysql_free_result($query2);
        }

        return $count1 === $count2;
    }
    
    /**
     * Test mysql_freeresult
     *
     * @return boolean
     */
    public function MySQL_FreeResult_Test()
    {
        // Alias of Mysql_Free_Result_Test
        return true;
    }
    
    /**
     * Test mysql_fetch_lengths
     *
     * @return boolean
     */
    public function MySQL_Fetch_Lengths_Test()
    {
        $sql = 'SELECT * FROM ' . TEST_TABLE;
        
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        while ($row = mysql_fetch_row($query1)) {
            $row2 = mysql_fetch_lengths($query1);
            foreach ($row as $sub => $string) {
                if (strlen($string) != $row2[$sub]) {
                    return false;
                }
            }
        }

        while ($row = $this->_object->mysql_fetch_row($query2)) {
            $row2 = $this->_object->mysql_fetch_lengths($query1);
            
            foreach ($row as $sub => $string) {
                if (strlen($string) != $row2[$sub]) {
                    return false;
                }
            }
        }

        return true;
    }
    
    /**
     * Test mysql_list_fields
     *
     * @return boolean
     */
    public function MySQL_List_Fields_Test()
    {
        // Select Db
        $this->_selectDb();

        $query1 = mysql_list_fields(TEST_DB, TEST_TABLE);
        $query2 = $this->_object->mysql_list_fields(TEST_DB, TEST_TABLE);

        $list1 = array();
        $list2 = array();

        // Our object gives us num_rows, something that we can't do in mysql_*
        $cnt = $this->_object->mysql_num_rows($query2);

        $i = 0;
        while ($i < $cnt) {
            $list1[] = mysql_field_name($query1, $i);
            $i++;
        }

        $i = 0;
        while ($i < $cnt) {
            $list2[] = $this->_object->mysql_field_name($query2, $i);
            $i++;
        }

        return $list1 === $list2;
    }
    
    /**
     * Test mysql_listfields
     *
     * @return boolean
     */
    public function MySQL_ListFields_Test()
    {
        // Alias of Mysql_List_Fields_Test
        return true;
    }
    
    /**
     * Test mysql_field_len
     *
     * @return boolean
     */
    public function MySQL_Field_Len_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $length1 = mysql_field_len($query1, 0);
        $length2 = $this->_object->mysql_field_len($query2, 0);
        return $length1 === $length2;
    }
    
    /**
     * Test mysql_fieldlen
     *
     * @return boolean
     */
    public function MySQL_FieldLen_Test()
    {
        // Alias of Mysql_Field_Len_Test
        return true;
    }
    
    /**
     * Test mysql_field_flags
     *
     * @return boolean
     */
    public function MySQL_Field_Flags_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $flags1 = mysql_field_flags($query1, 0);
        $flags2 = $this->_object->mysql_field_flags($query2, 0);
        return $flags1 === $flags2;
    }
    
    /**
     * Test mysql_fieldflags
     *
     * @return boolean
     */
    public function MySQL_FieldFlags_Test()
    {
        // Alias of Mysql_Field_Flags_Test
        return true;
    }
    
    /**
     * Test mysql_field_name
     *
     * @return boolean
     */
    public function MySQL_Field_Name_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $name1 = mysql_field_name($query1, 0);
        $name2 = $this->_object->mysql_field_name($query2, 0);

        return $name1 === $name2;
    }
    
    /**
     * Test mysql_fieldname
     *
     * @return boolean
     */
    public function MySQL_FieldName_Test()
    {
        // Alias of Mysql_Field_Name_Test
        return true;
    }
    
    /**
     * Test mysql_field_type
     *
     * @return boolean
     */
    public function MySQL_Field_Type_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $type1 = mysql_field_type($query1, 0);
        $type2 = $this->_object->mysql_field_type($query2, 0);

        return $type1 === $type2;
    }
    
    /**
     * Test mysql_fieldtype
     *
     * @return boolean
     */
    public function MySQL_FieldType_Test()
    {
        // Alias of Mysql_Field_Type_Test
        return true;
    }
    
    /**
     * Test mysql_field_table
     *
     * @return boolean
     */
    public function MySQL_Field_Table_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $table1 = mysql_field_table($query1, 0);
        $table2 = $this->_object->mysql_field_table($query2, 0);

        return $table1 === $table2;
    }
    
    /**
     * Test mysql_fieldtable
     *
     * @return boolean
     */
    public function MySQL_FieldTable_Test()
    {
        // Alias of Mysql_Field_Table_Test
        return true;
    }
    
    /**
     * Test mysql_field_seek
     *
     * @return boolean
     */
    public function MySQL_Field_Seek_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Seek
        mysql_field_seek($query1, 1);
        $this->_object->mysql_field_seek($query1, 1);

        // Get items
        $info1 = mysql_fetch_field($query1);
        $info2 = $this->_object->mysql_fetch_field($query2);

        return $info1 == $info2;
    }
    
    /**
     * Test mysql_fetch_field
     *
     * @return boolean
     */
    public function MySQL_Fetch_Field_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $info1 = mysql_fetch_field($query1, 1);
        $info2 = $this->_object->mysql_fetch_field($query2, 1);

        return $info1 == $info2;
    }
    
    /**
     * Test mysql_num_fields
     *
     * @return boolean
     */
    public function MySQL_Num_Fields_Test()
    {
        // Select Db
        $this->_selectDb();

        // Query
        $sql = 'SELECT * FROM ' . TEST_TABLE . ' LIMIT 1';
        
        // Query
        $query1 = mysql_query($sql);
        $query2 = $this->_object->mysql_query($sql);

        // Get items
        $num1 = mysql_num_fields($query1);
        $num2 = $this->_object->mysql_num_fields($query2);

        return $num1 == $num2;
    }
    
    /**
     * Test mysql_numfields
     *
     * @return boolean
     */
    public function MySQL_Numfields_Test()
    {
        // Alias of Mysql_Num_Fields_Test
        return true;
    }
    
    /**
     * Test mysql_num_rows
     *
     * @return boolean
     */
    public function MySQL_Num_Rows_Test()
    {
        // Done in Mysql_Db_Name_Test
        return true;
    }
    
    /**
     * Test mysql_numrows
     *
     * @return boolean
     */
    public function MySQL_NumRows_Test()
    {
        // Alias of Mysql_Num_Rows_Test
        return true;
    }
    
    /**
     * Test mysql_info
     *
     * @return boolean
     */
    public function MySQL_Info_Test()
    {
        // Select Db
        $this->_selectDb();
        
        $sql1 = 'UPDATE ' . TEST_TABLE . " SET field_name = 'test 2' WHERE field_id <= 1";
        $sql2 = 'UPDATE ' . TEST_TABLE . " SET field_name = 'test 2' WHERE field_id <= 2 AND field_id > 1";

        mysql_query($sql1);
        $this->_object->mysql_query($sql2);

        $info1 = mysql_info();
        $info2 = $this->_object->mysql_info();

        return $info1 == $info2;
    }

    /**
     * Get connection to DB
     *
     * @return array 0 -> mysql resource, 1 -> our resource (#)
     */
    protected function _getConnection()
    {
        $mysql = mysql_connect(TEST_HOST, TEST_USER, TEST_PASS, true);
        $ourDb = $this->_object->mysql_connect(TEST_HOST, TEST_USER, TEST_PASS, true);

        // Keep track of resource
        $this->_cached[] = $mysql;

        return array($mysql, $ourDb);
    }
    
    /**
     * Select Db
     *
     * @param boolean $mysql
     * @param boolean $ourDb
     * 
     * @return void
     */
    protected function _selectDb($mysql = false, $ourDb = false)
    {
        if ($mysql === false) {
            mysql_select_db(TEST_DB);
        } else {
            mysql_select_db(TEST_DB, $mysql);
        }

        if ($ourDb === false) {
            $this->_object->mysql_select_db(TEST_DB);
        } else {
            $this->_object->mysql_select_db(TEST_DB, $ourDb);
        }
    }
}

// Start tests
new MySQL_Test;