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