packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/AlterDatabaseRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFaker\Generation\Derivation\DerivationTrace;
12use SqlFaker\Grammar\Model\NonTerminal;
13use SqlFaker\Grammar\Model\Production;
14use SqlFaker\Grammar\Model\Terminal;
15use SqlFaker\MySql\Generation\Rewrite\AlterDatabaseRule;
16
17#[CoversClass(AlterDatabaseRule::class)]
18#[UsesClass(DerivationTrace::class)]
19#[UsesClass(NonTerminal::class)]
20#[UsesClass(Production::class)]
21#[UsesClass(Terminal::class)]
22#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
23#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
24#[UsesClass(\SqlFaker\Generation\Token\TerminalSequence::class)]
25final class AlterDatabaseRuleTest extends TestCase
26{
27    #[DataProvider('providerOptions')]
28    public function testRewriteAddsTheOptionIntroducerOnlyForAnOmittedDatabase(string $option): void
29    {
30        $trace = new DerivationTrace('alter_database_stmt');
31        $trace->expand(0, new Production([new Terminal('ALTER'), new Terminal('DATABASE'), new NonTerminal('ident_or_empty'), new Terminal($option)]), 0);
32        $trace->expand(2, new Production([]), 0);
33        $input = $trace->terminals();
34        self::assertSame(['ALTER', 'DATABASE', 'DEFAULT_SYM', $option], (new AlterDatabaseRule())->rewrite($input)->names());
35    }
36
37    public function testRewriteKeepsAnExplicitDatabaseNamedEncryption(): void
38    {
39        $trace = new DerivationTrace('alter_database_stmt');
40        $trace->expand(0, new Production([new Terminal('ALTER'), new Terminal('DATABASE'), new NonTerminal('ident_or_empty'), new Terminal('ENCRYPTION_SYM')]), 0);
41        $trace->expand(2, new Production([new Terminal('ENCRYPTION_SYM')]), 1);
42        $input = $trace->terminals();
43        self::assertSame($input, (new AlterDatabaseRule())->rewrite($input));
44    }
45
46    public function testRewriteUsesTheConfiguredDefaultToken(): void
47    {
48        $trace = new DerivationTrace('alter_database_stmt');
49        $trace->expand(0, new Production([new Terminal('ALTER'), new Terminal('DATABASE'), new NonTerminal('ident_or_empty'), new Terminal('CHARSET')]), 0);
50        $trace->expand(2, new Production([]), 0);
51        self::assertSame(['ALTER', 'DATABASE', 'DEFAULT', 'CHARSET'], (new AlterDatabaseRule('DEFAULT'))->rewrite($trace->terminals())->names());
52    }
53    /**
54     * @return list<array{string}>
55     */
56    public static function providerOptions(): array
57    {
58        return [['ENCRYPTION_SYM'], ['CHARSET'], ['CHAR_SYM'], ['COLLATE_SYM']];
59    }
60}
61