packages/sql-faker/tests/Unit/PostgreSql/Grammar/PgGrammarTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Grammar;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use RuntimeException;
11use SqlFaker\Grammar\Model\Grammar;
12use SqlFaker\Grammar\Model\NonTerminal;
13use SqlFaker\Grammar\Model\Production;
14use SqlFaker\Grammar\Model\ProductionRule;
15use SqlFaker\Grammar\Model\Terminal;
16use SqlFaker\Grammar\Resource\SqlVersion;
17use SqlFaker\Grammar\Resource\SqlVersionRegistry;
18use SqlFaker\PostgreSql\Grammar\PgGrammar;
19
20#[CoversClass(PgGrammar::class)]
21#[CoversClass(Grammar::class)]
22#[CoversClass(ProductionRule::class)]
23#[CoversClass(Production::class)]
24#[CoversClass(Terminal::class)]
25#[CoversClass(NonTerminal::class)]
26#[UsesClass(SqlVersion::class)]
27#[UsesClass(SqlVersionRegistry::class)]
28final class PgGrammarTest extends TestCase
29{
30    public function testLoad(): void
31    {
32        $grammar = PgGrammar::load();
33
34        self::assertNotEmpty($grammar->ruleMap);
35    }
36
37    public function testLoadWithExplicitVersion(): void
38    {
39        $grammar = PgGrammar::load('pg-17.2');
40
41        self::assertNotEmpty($grammar->ruleMap);
42    }
43
44    public function testResolveVersionUsesExactConfiguredDefault(): void
45    {
46        self::assertSame('pg-17.2', PgGrammar::resolveVersion());
47        self::assertSame('pg-17.2', PgGrammar::resolveVersion('pg-17.2'));
48    }
49
50    public function testLoadWithNonExistentVersionThrows(): void
51    {
52        $this->expectException(RuntimeException::class);
53
54        PgGrammar::load('pg-999.999');
55    }
56
57    public function testLoadedGrammarStructure(): void
58    {
59        $grammar = PgGrammar::load();
60
61        self::assertArrayHasKey('stmtmulti', $grammar->ruleMap);
62        self::assertArrayHasKey('SelectStmt', $grammar->ruleMap);
63        self::assertArrayHasKey('InsertStmt', $grammar->ruleMap);
64        self::assertArrayHasKey('UpdateStmt', $grammar->ruleMap);
65        self::assertArrayHasKey('DeleteStmt', $grammar->ruleMap);
66    }
67}
68