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