packages/sql-faker/tests/Unit/Sqlite/Generation/Rewrite/RewriteDefinitionsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Sqlite\Generation\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Derivation\DerivationTrace;
11use SqlFaker\Grammar\Model\Production;
12use SqlFaker\Grammar\Model\Terminal;
13use SqlFaker\Sqlite\Generation\Rewrite\RewriteDefinitions;
14
15#[CoversClass(RewriteDefinitions::class)]
16#[UsesClass(DerivationTrace::class)]
17#[UsesClass(Production::class)]
18#[UsesClass(Terminal::class)]
19#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
20#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
21#[UsesClass(\SqlFaker\Generation\Token\TerminalSequence::class)]
22#[UsesClass(\SqlFaker\Generation\Token\TokenRewriter::class)]
23#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\IdentifierListRule::class)]
24#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\JoinRule::class)]
25#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\StrictTableRule::class)]
26#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\TableOptionRule::class)]
27#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\WindowFrameRule::class)]
28#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\WithoutRowidRule::class)]
29#[UsesClass(\SqlFaker\Grammar\Model\NonTerminal::class)]
30#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\Expression\ExpressionGroupingRule::class)]
31#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\CompoundSelectRule::class)]
32#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\UpsertSourceRule::class)]
33#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\FunctionArgumentRule::class)]
34#[UsesClass(\SqlFaker\Sqlite\Generation\Rewrite\GeneratedColumnRule::class)]
35#[UsesClass(\SqlFaker\Generation\Token\TerminalMappingRule::class)]
36final class RewriteDefinitionsTest extends TestCase
37{
38    public function testCreateMapsOnlyTheGeneratedColumnStorageName(): void
39    {
40        $expression = new \SqlFaker\Generation\Token\TerminalOccurrence('ID', 2, [0, 1], ['generated', 'expr']);
41        $storage = new \SqlFaker\Generation\Token\TerminalOccurrence('ID', 3, [0], ['generated']);
42        $plain = new \SqlFaker\Generation\Token\TerminalOccurrence('ID', 4, [5], ['nm']);
43        $input = new \SqlFaker\Generation\Token\TerminalSequence([$expression, $storage, $plain], [$expression, $storage, $plain]);
44        $result = (new RewriteDefinitions())->create()->rewrite($input);
45        self::assertSame(['ID', 'GENERATED_STORAGE', 'ID'], $result->names());
46        self::assertSame($expression, $result->terminals[0]);
47        self::assertSame($plain, $result->terminals[2]);
48        self::assertSame($storage->id, $result->terminals[1]->id);
49    }
50    public function testCreateComposesTheDeclaredSourceRules(): void
51    {
52        $trace = new DerivationTrace('table_option');
53        $trace->expand(0, new Production([new Terminal('ID')]), 0);
54        $result = (new RewriteDefinitions())->create()->rewrite($trace->terminals());
55        self::assertSame(['STRICT_TABLE_OPTION'], $result->names());
56    }
57}
58