IndexTest.php 6.27 KB
Newer Older
1 2 3 4 5
<?php

namespace Doctrine\Tests\DBAL\Schema;

use Doctrine\DBAL\Schema\Index;
Sergei Morozov's avatar
Sergei Morozov committed
6
use PHPUnit\Framework\TestCase;
7

Sergei Morozov's avatar
Sergei Morozov committed
8
class IndexTest extends TestCase
9
{
10 11 12 13
    /**
     * @param mixed[] $options
     */
    private function createIndex(bool $unique = false, bool $primary = false, array $options = []) : Index
14
    {
Sergei Morozov's avatar
Sergei Morozov committed
15
        return new Index('foo', ['bar', 'baz'], $unique, $primary, [], $options);
16 17
    }

18
    public function testCreateIndex() : void
19 20
    {
        $idx = $this->createIndex();
Sergei Morozov's avatar
Sergei Morozov committed
21
        self::assertEquals('foo', $idx->getName());
22
        $columns = $idx->getColumns();
Gabriel Caruso's avatar
Gabriel Caruso committed
23
        self::assertCount(2, $columns);
Sergei Morozov's avatar
Sergei Morozov committed
24
        self::assertEquals(['bar', 'baz'], $columns);
25 26
        self::assertFalse($idx->isUnique());
        self::assertFalse($idx->isPrimary());
27 28
    }

29
    public function testCreatePrimary() : void
30 31
    {
        $idx = $this->createIndex(false, true);
32 33
        self::assertTrue($idx->isUnique());
        self::assertTrue($idx->isPrimary());
34 35
    }

36
    public function testCreateUnique() : void
37 38
    {
        $idx = $this->createIndex(true, false);
39 40
        self::assertTrue($idx->isUnique());
        self::assertFalse($idx->isPrimary());
41
    }
42 43 44 45

    /**
     * @group DBAL-50
     */
46
    public function testFulfilledByUnique() : void
47 48 49 50 51
    {
        $idx1 = $this->createIndex(true, false);
        $idx2 = $this->createIndex(true, false);
        $idx3 = $this->createIndex();

52 53
        self::assertTrue($idx1->isFullfilledBy($idx2));
        self::assertFalse($idx1->isFullfilledBy($idx3));
54 55 56 57 58
    }

    /**
     * @group DBAL-50
     */
59
    public function testFulfilledByPrimary() : void
60 61 62 63 64
    {
        $idx1 = $this->createIndex(true, true);
        $idx2 = $this->createIndex(true, true);
        $idx3 = $this->createIndex(true, false);

65 66
        self::assertTrue($idx1->isFullfilledBy($idx2));
        self::assertFalse($idx1->isFullfilledBy($idx3));
67 68 69 70 71
    }

    /**
     * @group DBAL-50
     */
72
    public function testFulfilledByIndex() : void
73 74 75
    {
        $idx1 = $this->createIndex();
        $idx2 = $this->createIndex();
Sergei Morozov's avatar
Sergei Morozov committed
76
        $pri  = $this->createIndex(true, true);
77 78
        $uniq = $this->createIndex(true);

79 80 81
        self::assertTrue($idx1->isFullfilledBy($idx2));
        self::assertTrue($idx1->isFullfilledBy($pri));
        self::assertTrue($idx1->isFullfilledBy($uniq));
82
    }
83

84
    public function testFulfilledWithPartial() : void
85
    {
Sergei Morozov's avatar
Sergei Morozov committed
86 87 88
        $without = new Index('without', ['col1', 'col2'], true, false, [], []);
        $partial = new Index('partial', ['col1', 'col2'], true, false, [], ['where' => 'col1 IS NULL']);
        $another = new Index('another', ['col1', 'col2'], true, false, [], ['where' => 'col1 IS NULL']);
89

90 91
        self::assertFalse($partial->isFullfilledBy($without));
        self::assertFalse($without->isFullfilledBy($partial));
92

93
        self::assertTrue($partial->isFullfilledBy($partial));
94

95 96
        self::assertTrue($partial->isFullfilledBy($another));
        self::assertTrue($another->isFullfilledBy($partial));
97 98
    }

99
    public function testOverrulesWithPartial() : void
100
    {
Sergei Morozov's avatar
Sergei Morozov committed
101 102 103
        $without = new Index('without', ['col1', 'col2'], true, false, [], []);
        $partial = new Index('partial', ['col1', 'col2'], true, false, [], ['where' => 'col1 IS NULL']);
        $another = new Index('another', ['col1', 'col2'], true, false, [], ['where' => 'col1 IS NULL']);
104

105 106
        self::assertFalse($partial->overrules($without));
        self::assertFalse($without->overrules($partial));
107

108
        self::assertTrue($partial->overrules($partial));
109

110 111
        self::assertTrue($partial->overrules($another));
        self::assertTrue($another->overrules($partial));
112 113
    }

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    /**
     * @param string[]     $columns
     * @param int[]|null[] $lengths1
     * @param int[]|null[] $lengths2
     *
     * @dataProvider indexLengthProvider
     */
    public function testFulfilledWithLength(array $columns, array $lengths1, array $lengths2, bool $expected) : void
    {
        $index1 = new Index('index1', $columns, false, false, [], ['lengths' => $lengths1]);
        $index2 = new Index('index2', $columns, false, false, [], ['lengths' => $lengths2]);

        self::assertSame($expected, $index1->isFullfilledBy($index2));
        self::assertSame($expected, $index2->isFullfilledBy($index1));
    }

    /**
     * @return mixed[][]
     */
    public static function indexLengthProvider() : iterable
    {
        return [
            'empty' => [['column'], [], [], true],
            'same' => [['column'], [64], [64], true],
            'different' => [['column'], [32], [64], false],
            'sparse-different-positions' => [['column1', 'column2'], [0 => 32], [1 => 32], false],
            'sparse-same-positions' => [['column1', 'column2'], [null, 32], [1 => 32], true],
        ];
    }

144 145 146
    /**
     * @group DBAL-220
     */
147
    public function testFlags() : void
148 149
    {
        $idx1 = $this->createIndex();
150 151
        self::assertFalse($idx1->hasFlag('clustered'));
        self::assertEmpty($idx1->getFlags());
152 153

        $idx1->addFlag('clustered');
154 155
        self::assertTrue($idx1->hasFlag('clustered'));
        self::assertTrue($idx1->hasFlag('CLUSTERED'));
Sergei Morozov's avatar
Sergei Morozov committed
156
        self::assertSame(['clustered'], $idx1->getFlags());
157 158

        $idx1->removeFlag('clustered');
159 160
        self::assertFalse($idx1->hasFlag('clustered'));
        self::assertEmpty($idx1->getFlags());
161
    }
162 163 164 165

    /**
     * @group DBAL-285
     */
166
    public function testIndexQuotes() : void
167
    {
Sergei Morozov's avatar
Sergei Morozov committed
168
        $index = new Index('foo', ['`bar`', '`baz`']);
169

Sergei Morozov's avatar
Sergei Morozov committed
170 171 172
        self::assertTrue($index->spansColumns(['bar', 'baz']));
        self::assertTrue($index->hasColumnAtPosition('bar', 0));
        self::assertTrue($index->hasColumnAtPosition('baz', 1));
173

Sergei Morozov's avatar
Sergei Morozov committed
174 175
        self::assertFalse($index->hasColumnAtPosition('bar', 1));
        self::assertFalse($index->hasColumnAtPosition('baz', 0));
176
    }
177

178
    public function testOptions() : void
179 180
    {
        $idx1 = $this->createIndex();
181 182
        self::assertFalse($idx1->hasOption('where'));
        self::assertEmpty($idx1->getOptions());
183

Sergei Morozov's avatar
Sergei Morozov committed
184
        $idx2 = $this->createIndex(false, false, ['where' => 'name IS NULL']);
185 186 187 188
        self::assertTrue($idx2->hasOption('where'));
        self::assertTrue($idx2->hasOption('WHERE'));
        self::assertSame('name IS NULL', $idx2->getOption('where'));
        self::assertSame('name IS NULL', $idx2->getOption('WHERE'));
Sergei Morozov's avatar
Sergei Morozov committed
189
        self::assertSame(['where' => 'name IS NULL'], $idx2->getOptions());
190
    }
191
}