packages/sql-parser/tests/Unit/Sqlite/Lexer/SqliteLexerTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sqlite\Lexer;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlParser\Lexer\Cursor;
12use SqlParser\Lexer\Lexeme;
13use SqlParser\Lexer\LexicalException;
14use SqlParser\Sqlite\Lexer\KeywordTable;
15use SqlParser\Sqlite\Lexer\NumberScanner;
16use SqlParser\Sqlite\Lexer\OperatorScanner;
17use SqlParser\Sqlite\Lexer\QuotedScanner;
18use SqlParser\Sqlite\Lexer\Scan;
19use SqlParser\Sqlite\Lexer\SqliteLexer;
20use SqlParser\Sqlite\Lexer\TriviaScanner;
21use SqlParser\Sqlite\Lexer\VariableScanner;
22use SqlParser\Sqlite\Lexer\WordScanner;
23
24#[CoversClass(SqliteLexer::class)]
25#[UsesClass(Cursor::class)]
26#[UsesClass(Lexeme::class)]
27#[UsesClass(LexicalException::class)]
28#[UsesClass(KeywordTable::class)]
29#[UsesClass(NumberScanner::class)]
30#[UsesClass(OperatorScanner::class)]
31#[UsesClass(QuotedScanner::class)]
32#[UsesClass(Scan::class)]
33#[UsesClass(TriviaScanner::class)]
34#[UsesClass(VariableScanner::class)]
35#[UsesClass(WordScanner::class)]
36#[UsesClass(\SqlParser\Lexer\SourcePosition::class)]
37#[UsesClass(\SqlParser\Lexer\SourceException::class)]
38#[Small]
39final class SqliteLexerTest extends TestCase
40{
41 public function testScanEndsWithAStatementTerminator(): void
42 {
43 $lexer = new SqliteLexer(new KeywordTable(['SELECT' => 'SELECT', 'FROM' => 'FROM', 'OVER' => 'OVER']));
44 $names = array_map(static fn (Lexeme $lexeme): string => $lexeme->name, $lexer->scan("SELECT count(*) OVER w, x'ff', ?1 FROM t -- c"));
45
46 self::assertSame(['SELECT', 'ID', 'LP', 'STAR', 'RP', 'OVER', 'ID', 'COMMA', 'BLOB', 'COMMA', 'VARIABLE', 'FROM', 'ID', 'SEMI'], $names);
47 self::assertSame(['SELECT', 'SEMI'], array_map(static fn (Lexeme $lexeme): string => $lexeme->name, $lexer->scan('SELECT;')));
48 self::assertSame(['SEMI'], array_map(static fn (Lexeme $lexeme): string => $lexeme->name, $lexer->scan('')));
49 }
50
51 public function testScanRejectsAnUnreadableCharacter(): void
52 {
53 $this->expectException(LexicalException::class);
54
55 (new SqliteLexer(new KeywordTable([])))->scan('SELECT ^');
56 }
57}
58