packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/RewriteDefinitionsTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\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\Query\LegacyDerivedTableRule::class)]
50#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Column\FieldLengthRule::class)]
51#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Routine\ReturnRule::class)]
52#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Routine\BinlogRule::class)]
53#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Name\SystemVariableRule::class)]
54#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Column\AutoIncrementRule::class)]
55#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\DefinitionRule::class)]
56#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\ListValueRule::class)]
57#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\ValueArityRule::class)]
58#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Partition\ValueShape::class)]
59#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Routine\LanguageRule::class)]
60#[UsesClass(\SqlFaker\Generation\Token\TerminalMappingRule::class)]
61#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Query\WindowFrameRule::class)]
62#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Expression\ConcatenationRule::class)]
63#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Name\HostNameRule::class)]
64final class RewriteDefinitionsTest extends TestCase
65{
66 public function testCreateComposesTheDeclaredSourceRules(): void
67 {
68 $trace = new DerivationTrace('option_value_no_option_type');
69 $trace->expand(0, new Production([new Terminal('NAMES_SYM'), new Terminal('EQ'), new Terminal('NUM')]), 0);
70 $result = (new RewriteDefinitions())->create()->rewrite($trace->terminals());
71 self::assertSame(['NAMES_SYM', 'DEFAULT_SYM'], $result->names());
72 }
73
74 #[DataProvider('providerDefaultTokens')]
75 public function testCreateBindsTheReleaseSpecificDefaultToken(string $version, string $expected): void
76 {
77 $trace = new DerivationTrace('option_value_no_option_type');
78 $trace->expand(0, new Production([new Terminal('NAMES_SYM'), new Terminal('EQ'), new Terminal('NUM')]), 0);
79 self::assertSame(['NAMES_SYM', $expected], (new RewriteDefinitions())->create($version)->rewrite($trace->terminals())->names());
80 }
81
82 /**
83 * @return list<array{string, string}>
84 */
85 public static function providerDefaultTokens(): array
86 {
87 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']];
88 }
89}
90