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