packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/Name/SystemVariableRuleTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Rewrite\Name;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFaker\Generation\Token\ProductionOccurrence;
12use SqlFaker\Generation\Token\TerminalOccurrence;
13use SqlFaker\Generation\Token\TerminalSequence;
14use SqlFaker\MySql\Generation\Rewrite\Name\SystemVariableRule;
15
16#[CoversClass(SystemVariableRule::class)]
17#[UsesClass(ProductionOccurrence::class)]
18#[UsesClass(TerminalOccurrence::class)]
19#[UsesClass(TerminalSequence::class)]
20#[UsesClass(\SqlFaker\MySql\Generation\Rewrite\Name\HostNameRule::class)]
21final class SystemVariableRuleTest extends TestCase
22{
23 /**
24 * @param list<string> $names
25 * @param list<string> $expected
26 */
27 #[DataProvider('providerVariables')]
28 public function testRewritePreservesTheScannerContext(array $names, array $expected): void
29 {
30 $input = TerminalSequence::fromNames($names);
31 $result = (new SystemVariableRule())->rewrite($input);
32 self::assertSame($expected, $result->names());
33 self::assertSame($input->original, $result->original);
34 self::assertSame(array_column($input->terminals, 'id'), array_column($result->terminals, 'id'));
35 self::assertSame($result, (new SystemVariableRule())->rewrite($result));
36 }
37
38 /**
39 * @return list<array{list<string>, list<string>}>
40 */
41 public static function providerVariables(): array
42 {
43 return [[['@', '@', 'TEXT_STRING'], ['@', '@', 'IDENT_QUOTED']], [['@', 'TEXT_STRING'], ['@', 'TEXT_STRING']], [['@', '@', 'IDENT_QUOTED'], ['@', '@', 'IDENT_QUOTED']], [['@', '@', 'GLOBAL_SYM', '.', 'TEXT_STRING'], ['@', '@', 'GLOBAL_SYM', '.', 'TEXT_STRING']], [['TEXT_STRING'], ['TEXT_STRING']]];
44 }
45
46 #[DataProvider('providerPrefixes')]
47 public function testRewriteRejectsReservedComponentPrefixesOnlyInTheVariableName(string $scope, string $prefix, string $separator, string $expected): void
48 {
49 $tokens = array_map(static fn (string $name, int $id): TerminalOccurrence => new TerminalOccurrence($name, $id, [0], [$scope]), [$prefix, $separator, 'IDENT'], [0, 1, 2]);
50 $input = new TerminalSequence($tokens, $tokens, productions: [new ProductionOccurrence(0, null, $scope, 0)]);
51 $result = (new SystemVariableRule())->rewrite($input);
52 self::assertSame([$expected, $separator, 'IDENT'], $result->names());
53 self::assertSame($input->original, $result->original);
54 self::assertSame(array_column($tokens, 'id'), array_column($result->terminals, 'id'));
55 self::assertSame($result, (new SystemVariableRule())->rewrite($result));
56 }
57
58 /**
59 * @return list<array{string, string, string, string}>
60 */
61 public static function providerPrefixes(): array
62 {
63 return [
64 ['rvalue_system_variable', 'GLOBAL_SYM', '.', 'IDENT_QUOTED'],
65 ['rvalue_system_variable', 'LOCAL_SYM', '.', 'IDENT_QUOTED'],
66 ['lvalue_variable', 'SESSION_SYM', '.', 'IDENT_QUOTED'],
67 ['lvalue_variable', 'DEFAULT_SYM', '.', 'DEFAULT_SYM'],
68 ['rvalue_system_variable', 'IDENT', '.', 'IDENT'],
69 ['rvalue_system_variable', 'SESSION_SYM', 'EQ', 'SESSION_SYM'],
70 ['opt_rvalue_system_variable_type', 'GLOBAL_SYM', '.', 'GLOBAL_SYM'],
71 ];
72 }
73}
74