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