packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/Query/LegacyDerivedTableRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\MySql\Generation\Rewrite\Query;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Token\ProductionOccurrence;
11use SqlFaker\Generation\Token\TerminalOccurrence;
12use SqlFaker\Generation\Token\TerminalSequence;
13use SqlFaker\MySql\Generation\Rewrite\Query\LegacyDerivedTableRule;
14
15#[CoversClass(LegacyDerivedTableRule::class)]
16#[UsesClass(ProductionOccurrence::class)]
17#[UsesClass(TerminalOccurrence::class)]
18#[UsesClass(TerminalSequence::class)]
19final class LegacyDerivedTableRuleTest extends TestCase
20{
21    public function testRewriteMakesBareSelectOperandsIndependentTableFactors(): void
22    {
23        $select = new TerminalOccurrence('SELECT_SYM', 10, [0, 1], ['table_factor', 'select_derived_init']);
24        $star = new TerminalOccurrence('*', 11, [0, 2], ['table_factor', 'select_derived2']);
25        $input = new TerminalSequence([$select, $star], [$select, $star], [], [
26            new ProductionOccurrence(0, null, 'table_factor', 1),
27            new ProductionOccurrence(1, 0, 'select_derived_init', 0),
28            new ProductionOccurrence(2, 0, 'select_derived2', 0),
29        ]);
30        $rule = new LegacyDerivedTableRule();
31        $result = $rule->rewrite($input);
32        self::assertSame(['(', 'SELECT_SYM', '*', ')', 'AS', 'IDENT_QUOTED'], $result->names());
33        self::assertSame($input->original, $result->original);
34        self::assertSame($input->productions, $result->productions);
35        self::assertSame($result, $rule->rewrite($result));
36        self::assertCount(count($result->terminals), array_unique(array_map(static fn ($terminal): int => $terminal->id, $result->terminals)));
37    }
38
39    public function testRewritePreservesOrdinaryTableReferences(): void
40    {
41        $name = new TerminalOccurrence('IDENT', 10, [0, 1], ['table_factor', 'table_ident']);
42        $input = new TerminalSequence([$name], [$name], [], [
43            new ProductionOccurrence(0, null, 'table_factor', 0),
44            new ProductionOccurrence(1, 0, 'table_ident', 0),
45        ]);
46        self::assertSame($input, (new LegacyDerivedTableRule())->rewrite($input));
47    }
48}
49