packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/RewriteDefinitionsTest.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\Production;
13use SqlFaker\Grammar\Model\Terminal;
14use SqlFaker\MySql\Generation\Rewrite\RewriteDefinitions;
15
16#[CoversClass(RewriteDefinitions::class)]
17#[UsesClass(DerivationTrace::class)]
18#[UsesClass(Production::class)]
19#[UsesClass(Terminal::class)]
20#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
21#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
22#[UsesClass(\SqlFaker\Generation\Token\TerminalSequence::class)]
23#[UsesClass(\SqlFaker\Generation\Token\TokenRewriter::class)]
24#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Option\UniqueOptionRule::class)]
25#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\AlterDatabaseRule::class)]
26#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\ConstraintEnforcementRule::class)]
27#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\FlushExportRule::class)]
28#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\InstanceActionRule::class)]
29#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\IntegerContextRule::class)]
30#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\LoadSourceCountRule::class)]
31#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\RequiredAliasRule::class)]
32#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\RoleGrantRule::class)]
33#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\SetNamesRule::class)]
34#[UsesClass(\SqlFaker\Grammar\Model\NonTerminal::class)]
35#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Expression\ExpressionGroupingRule::class)]
36#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\AlterEventRule::class)]
37#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\SubqueryContextRule::class)]
38#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\IntoClauseRule::class)]
39#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\GeneratedColumnRule::class)]
40#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\TransactionCompletionRule::class)]
41#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Alter\OrderByRule::class)]
42#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Replication\StartRule::class)]
43#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\FieldListRule::class)]
44#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Replication\TablePatternRule::class)]
45#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Expression\QuantifiedComparisonRule::class)]
46#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Expression\TableValueConstructorRule::class)]
47#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Query\QueryContextRule::class)]
48#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Query\JoinGroupingRule::class)]
49#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Column\FieldLengthRule::class)]
50#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Routine\ReturnRule::class)]
51#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Name\SystemVariableRule::class)]
52#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Column\AutoIncrementRule::class)]
53#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\DefinitionRule::class)]
54#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\ListValueRule::class)]
55#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\ValueArityRule::class)]
56#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\ValueShape::class)]
57#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Routine\LanguageRule::class)]
58#[UsesClass(\SqlFaker\Generation\Token\TerminalMappingRule::class)]
59#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Query\WindowFrameRule::class)]
60#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Expression\ConcatenationRule::class)]
61#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Name\HostNameRule::class)]
62final class RewriteDefinitionsTest extends TestCase
63{
64    public function testCreateComposesTheDeclaredSourceRules(): void
65    {
66        $trace = new DerivationTrace('option_value_no_option_type');
67        $trace->expand(0, new Production([new Terminal('NAMES_SYM'), new Terminal('EQ'), new Terminal('NUM')]), 0);
68        $result = (new RewriteDefinitions())->create()->rewrite($trace->terminals());
69        self::assertSame(['NAMES_SYM', 'DEFAULT_SYM'], $result->names());
70    }
71
72    #[DataProvider('providerDefaultTokens')]
73    public function testCreateBindsTheReleaseSpecificDefaultToken(string $version, string $expected): void
74    {
75        $trace = new DerivationTrace('option_value_no_option_type');
76        $trace->expand(0, new Production([new Terminal('NAMES_SYM'), new Terminal('EQ'), new Terminal('NUM')]), 0);
77        self::assertSame(['NAMES_SYM', $expected], (new RewriteDefinitions())->create($version)->rewrite($trace->terminals())->names());
78    }
79
80    /**
81     * @return list<array{string, string}>
82     */
83    public static function providerDefaultTokens(): array
84    {
85        return [['mysql-5.6.51', 'DEFAULT'], ['mysql-5.7.44', 'DEFAULT'], ['mysql-8.0.44', 'DEFAULT_SYM'], ['mysql-8.4.7', 'DEFAULT_SYM'], ['mysql-9.1.0', 'DEFAULT_SYM']];
86    }
87}
88