<?php

namespace Doctrine\Tests\DBAL\Driver;

use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Platforms\MySqlPlatform;
use Doctrine\DBAL\Schema\MySqlSchemaManager;

class AbstractMySQLDriverTest extends AbstractDriverTest
{
    public function testReturnsDatabaseName()
    {
        parent::testReturnsDatabaseName();

        $database = 'bloo';
        $params   = array(
            'user'     => 'foo',
            'password' => 'bar',
        );

        $statement = $this->createMock('Doctrine\Tests\Mocks\DriverResultStatementMock');

        $statement->expects($this->once())
            ->method('fetchColumn')
            ->will($this->returnValue($database));

        $connection = $this->getConnectionMock();

        $connection->expects($this->once())
            ->method('getParams')
            ->will($this->returnValue($params));

        $connection->expects($this->once())
            ->method('query')
            ->will($this->returnValue($statement));

        $this->assertSame($database, $this->driver->getDatabase($connection));
    }

    protected function createDriver()
    {
        return $this->getMockForAbstractClass('Doctrine\DBAL\Driver\AbstractMySQLDriver');
    }

    protected function createPlatform()
    {
        return new MySqlPlatform();
    }

    protected function createSchemaManager(Connection $connection)
    {
        return new MySqlSchemaManager($connection);
    }

    protected function getDatabasePlatformsForVersions()
    {
        return array(
            array('5.6.9', 'Doctrine\DBAL\Platforms\MySqlPlatform'),
            array('5.7', 'Doctrine\DBAL\Platforms\MySQL57Platform'),
            array('5.7.0', 'Doctrine\DBAL\Platforms\MySqlPlatform'),
            array('5.7.8', 'Doctrine\DBAL\Platforms\MySqlPlatform'),
            array('5.7.9', 'Doctrine\DBAL\Platforms\MySQL57Platform'),
            array('5.7.10', 'Doctrine\DBAL\Platforms\MySQL57Platform'),
            array('6', 'Doctrine\DBAL\Platforms\MySQL57Platform'),
            array('10.0.15-MariaDB-1~wheezy', 'Doctrine\DBAL\Platforms\MySqlPlatform'),
            array('10.1.2a-MariaDB-a1~lenny-log', 'Doctrine\DBAL\Platforms\MySqlPlatform'),
            array('5.5.40-MariaDB-1~wheezy', 'Doctrine\DBAL\Platforms\MySqlPlatform'),
        );
    }

    protected function getExceptionConversionData()
    {
        return array(
            self::EXCEPTION_CONNECTION => array(
                array('1044', null, null),
                array('1045', null, null),
                array('1046', null, null),
                array('1049', null, null),
                array('1095', null, null),
                array('1142', null, null),
                array('1143', null, null),
                array('1227', null, null),
                array('1370', null, null),
                array('2002', null, null),
                array('2005', null, null),
            ),
            self::EXCEPTION_FOREIGN_KEY_CONSTRAINT_VIOLATION => array(
                array('1216', null, null),
                array('1217', null, null),
                array('1451', null, null),
                array('1452', null, null),
            ),
            self::EXCEPTION_INVALID_FIELD_NAME => array(
                array('1054', null, null),
                array('1166', null, null),
                array('1611', null, null),
            ),
            self::EXCEPTION_NON_UNIQUE_FIELD_NAME => array(
                array('1052', null, null),
                array('1060', null, null),
                array('1110', null, null),
            ),
            self::EXCEPTION_NOT_NULL_CONSTRAINT_VIOLATION => array(
                array('1048', null, null),
                array('1121', null, null),
                array('1138', null, null),
                array('1171', null, null),
                array('1252', null, null),
                array('1263', null, null),
                array('1364', null, null),
                array('1566', null, null),
            ),
            self::EXCEPTION_SYNTAX_ERROR => array(
                array('1064', null, null),
                array('1149', null, null),
                array('1287', null, null),
                array('1341', null, null),
                array('1342', null, null),
                array('1343', null, null),
                array('1344', null, null),
                array('1382', null, null),
                array('1479', null, null),
                array('1541', null, null),
                array('1554', null, null),
                array('1626', null, null),
            ),
            self::EXCEPTION_TABLE_EXISTS => array(
                array('1050', null, null),
            ),
            self::EXCEPTION_TABLE_NOT_FOUND => array(
                array('1051', null, null),
                array('1146', null, null),
            ),
            self::EXCEPTION_UNIQUE_CONSTRAINT_VIOLATION => array(
                array('1062', null, null),
                array('1557', null, null),
                array('1569', null, null),
                array('1586', null, null),
            ),
            self::EXCEPTION_DEADLOCK => array(
                array('1213', null, null),
            ),
            self::EXCEPTION_LOCK_WAIT_TIMEOUT => array(
                array('1205', null, null),
            ),
        );
    }
}