packages/sql-faker/tests/Unit/PostgreSql/Generation/Rewrite/Query/SchemaElementsRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Rewrite\Query;
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\PostgreSql\Generation\Rewrite\Query\SchemaElementsRule;
15
16#[CoversClass(SchemaElementsRule::class)]
17#[UsesClass(ProductionOccurrence::class)]
18#[UsesClass(TerminalOccurrence::class)]
19#[UsesClass(TerminalSequence::class)]
20final class SchemaElementsRuleTest extends TestCase
21{
22    #[DataProvider('providerSchemas')]
23    public function testRewriteConditionalSchemasKeepElementsOrAnEmptyConditional(bool $conditional, bool $elements): void
24    {
25        $names = $conditional ? ['CREATE', 'SCHEMA', 'IF_P', 'NOT', 'EXISTS', 'IDENT'] : ['CREATE', 'SCHEMA', 'IDENT'];
26        $terminals = array_map(static fn (int $id, string $name): TerminalOccurrence =>
27            new TerminalOccurrence($name, $id + 10, [0], ['CreateSchemaStmt']), array_keys($names), $names);
28        $terminals = [...$terminals, ...($elements ? [new TerminalOccurrence('CREATE', 20, [0, 1], ['CreateSchemaStmt', 'OptSchemaEltList'])] : [])];
29        $input = new TerminalSequence($terminals, $terminals, [], [
30            new ProductionOccurrence(0, null, 'CreateSchemaStmt', 0), new ProductionOccurrence(1, 0, 'OptSchemaEltList', 0),
31        ]);
32        $rule = new SchemaElementsRule();
33        $result = $rule->rewrite($input);
34        $names = $conditional && $elements ? [...array_slice($names, 0, 2), ...array_slice($names, 5)] : $names;
35        self::assertSame($elements ? [...$names, 'CREATE'] : $names, $result->names());
36        self::assertSame($input->original, $result->original);
37        self::assertSame($result, $rule->rewrite($result));
38    }
39
40    /**
41     * @return iterable<array{bool, bool}>
42     */
43    public static function providerSchemas(): iterable
44    {
45        yield [true, true];
46        yield [false, true];
47        yield [true, false];
48        yield [false, false];
49    }
50}
51