packages/sql-faker/tests/Unit/Sqlite/Grammar/SqliteGrammarTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Sqlite\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\Sqlite\Grammar\SqliteGrammar;
19
20#[CoversClass(SqliteGrammar::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 SqliteGrammarTest extends TestCase
29{
30    public function testLoad(): void
31    {
32        $grammar = SqliteGrammar::load();
33
34        self::assertNotEmpty($grammar->ruleMap);
35    }
36
37    public function testLoadWithExplicitVersion(): void
38    {
39        $grammar = SqliteGrammar::load('sqlite-3.47.2');
40
41        self::assertNotEmpty($grammar->ruleMap);
42    }
43
44    public function testResolveVersionUsesExactConfiguredDefault(): void
45    {
46        self::assertSame('sqlite-3.47.2', SqliteGrammar::resolveVersion());
47        self::assertSame('sqlite-3.47.2', SqliteGrammar::resolveVersion('sqlite-3.47.2'));
48    }
49
50    public function testLoadWithNonExistentVersionThrows(): void
51    {
52        $this->expectException(RuntimeException::class);
53
54        SqliteGrammar::load('sqlite-999.999');
55    }
56
57    public function testLoadedGrammarStartSymbol(): void
58    {
59        $grammar = SqliteGrammar::load();
60
61        self::assertArrayHasKey($grammar->startSymbol, $grammar->ruleMap);
62    }
63
64    public function testLoadedGrammarStructure(): void
65    {
66        $grammar = SqliteGrammar::load();
67
68        self::assertArrayHasKey('cmd', $grammar->ruleMap);
69        self::assertArrayHasKey('select', $grammar->ruleMap);
70        self::assertArrayHasKey('expr', $grammar->ruleMap);
71    }
72}
73