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