packages/sql-parser/tests/Unit/MySql/Lexer/KeywordTableTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\MySql\Lexer;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use RuntimeException;
12use SqlParser\MySql\Lexer\KeywordTable;
13use SqlParser\MySql\MySqlVersion;
14use SqlParser\MySql\SqlMode;
15use SqlParser\Resource\SqlVersion;
16use SqlParser\Resource\VersionRegistry;
17
18#[CoversClass(KeywordTable::class)]
19#[UsesClass(MySqlVersion::class)]
20#[UsesClass(SqlMode::class)]
21#[UsesClass(SqlVersion::class)]
22#[UsesClass(VersionRegistry::class)]
23#[Small]
24final class KeywordTableTest extends TestCase
25{
26 public function testLoad(): void
27 {
28 $table = KeywordTable::load(MySqlVersion::resolve('mysql-8.4.7')->release->keywordPath);
29
30 self::assertSame('SELECT_SYM', $table->lookup('select', false, new SqlMode()));
31 self::assertSame('EQUAL_SYM', $table->lookup('<=>', false, new SqlMode()));
32 }
33
34 public function testLoadRejectsAMissingFile(): void
35 {
36 $this->expectException(RuntimeException::class);
37
38 KeywordTable::load('/nowhere/keywords.php');
39 }
40
41 public function testLookup(): void
42 {
43 $table = new KeywordTable(['SELECT' => 'SELECT_SYM', 'NOT' => 'NOT_SYM', '||' => 'OR_OR_SYM'], ['COUNT' => 'COUNT_SYM']);
44 $mode = new SqlMode();
45
46 self::assertSame('SELECT_SYM', $table->lookup('Select', false, $mode));
47 self::assertNull($table->lookup('count', false, $mode));
48 self::assertSame('COUNT_SYM', $table->lookup('count', true, $mode));
49 self::assertNull($table->lookup('users', true, $mode));
50 }
51
52 public function testLookupFollowsTheMode(): void
53 {
54 $table = new KeywordTable(['NOT' => 'NOT_SYM', '||' => 'OR_OR_SYM'], []);
55
56 self::assertSame('NOT_SYM', $table->lookup('NOT', false, new SqlMode()));
57 self::assertSame('NOT2_SYM', $table->lookup('NOT', false, new SqlMode(highNotPrecedence: true)));
58 self::assertSame('OR2_SYM', $table->lookup('||', false, new SqlMode()));
59 self::assertSame('OR_OR_SYM', $table->lookup('||', false, new SqlMode(pipesAsConcat: true)));
60 }
61
62 public function testHas(): void
63 {
64 $table = new KeywordTable(['SELECT' => 'SELECT_SYM'], ['COUNT' => 'COUNT_SYM']);
65
66 self::assertTrue($table->has('select'));
67 self::assertFalse($table->has('count'));
68 }
69}
70