packages/sql-parser/tests/Unit/Sqlite/Source/KeywordHashTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sqlite\Source;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\TestCase;
10use RuntimeException;
11use SqlParser\Sqlite\Source\KeywordHash;
12
13#[CoversClass(KeywordHash::class)]
14#[Small]
15final class KeywordHashTest extends TestCase
16{
17 public function testParse(): void
18 {
19 $source = " { \"ABORT\", \"TK_ABORT\", CONFLICT|TRIGGER, 0 },\n { \"LEFT\", \"TK_JOIN_KW\", ALWAYS, 0 },\n { \"WITHIN\", \"TK_WITHIN\", ORDERSET, 0 },\n { \"WINDOW\", \"TK_WINDOW\", WINDOWFUNC, 0 },\n";
20
21 self::assertSame(['keywords' => ['ABORT' => 'ABORT', 'LEFT' => 'JOIN_KW', 'WINDOW' => 'WINDOW']], (new KeywordHash())->parse($source));
22 self::assertSame(['keywords' => ['ABORT' => 'ABORT', 'LEFT' => 'JOIN_KW', 'WINDOW' => 'WINDOW', 'WITHIN' => 'WITHIN']], (new KeywordHash(['SQLITE_ENABLE_ORDERED_SET_AGGREGATES']))->parse($source));
23 self::assertSame(['keywords' => ['ABORT' => 'ABORT', 'LEFT' => 'JOIN_KW']], (new KeywordHash(['SQLITE_OMIT_WINDOWFUNC']))->parse($source));
24 }
25
26 public function testParseRejectsAFileWithoutKeywords(): void
27 {
28 $this->expectException(RuntimeException::class);
29
30 (new KeywordHash())->parse('int x;');
31 }
32
33 public function testCompiledIn(): void
34 {
35 $default = new KeywordHash();
36 $trimmed = new KeywordHash(['SQLITE_OMIT_ALTERTABLE', 'SQLITE_OMIT_TRIGGER']);
37
38 self::assertTrue($default->compiledIn(['ALWAYS']));
39 self::assertTrue($default->compiledIn(['CONFLICT', 'TRIGGER']));
40 self::assertFalse($default->compiledIn(['ORDERSET']));
41 self::assertFalse($trimmed->compiledIn(['ALTER']));
42 self::assertTrue($trimmed->compiledIn(['CONFLICT', 'TRIGGER']));
43 self::assertFalse($trimmed->compiledIn(['TRIGGER']));
44 self::assertFalse($default->compiledIn([]));
45 }
46}
47