packages/sql-parser/tests/Unit/PostgreSql/Lexer/PostgreSqlLexerTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\PostgreSql\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\PostgreSql\Lexer\KeywordTable;
15use SqlParser\PostgreSql\Lexer\LookaheadFilter;
16use SqlParser\PostgreSql\Lexer\NumberScanner;
17use SqlParser\PostgreSql\Lexer\OperatorScanner;
18use SqlParser\PostgreSql\Lexer\PostgreSqlLexer;
19use SqlParser\PostgreSql\Lexer\QuotedScanner;
20use SqlParser\PostgreSql\Lexer\Scan;
21use SqlParser\PostgreSql\Lexer\TriviaScanner;
22use SqlParser\PostgreSql\Lexer\WordScanner;
23
24#[CoversClass(PostgreSqlLexer::class)]
25#[UsesClass(Cursor::class)]
26#[UsesClass(Lexeme::class)]
27#[UsesClass(LexicalException::class)]
28#[UsesClass(KeywordTable::class)]
29#[UsesClass(LookaheadFilter::class)]
30#[UsesClass(NumberScanner::class)]
31#[UsesClass(OperatorScanner::class)]
32#[UsesClass(QuotedScanner::class)]
33#[UsesClass(Scan::class)]
34#[UsesClass(TriviaScanner::class)]
35#[UsesClass(WordScanner::class)]
36#[UsesClass(\SqlParser\Lexer\SourcePosition::class)]
37#[UsesClass(\SqlParser\Lexer\SourceException::class)]
38#[Small]
39final class PostgreSqlLexerTest extends TestCase
40{
41 public function testScan(): void
42 {
43 $lexer = new PostgreSqlLexer(new KeywordTable(['SELECT' => 'SELECT', 'FROM' => 'FROM', 'NOT' => 'NOT', 'LIKE' => 'LIKE']));
44 $names = array_map(static fn (Lexeme $lexeme): string => $lexeme->name, $lexer->scan("SELECT a::int, $1, 'x' FROM t -- c\n WHERE b NOT LIKE '%' AND c <@ d"));
45
46 self::assertSame(['SELECT', 'IDENT', 'TYPECAST', 'IDENT', ',', 'PARAM', ',', 'SCONST', 'FROM', 'IDENT', 'IDENT', 'IDENT', 'NOT_LA', 'LIKE', 'SCONST', 'IDENT', 'IDENT', 'Op', 'IDENT'], $names);
47 self::assertSame([], $lexer->scan(' /* only */ '));
48 }
49
50 public function testScanRejectsAnUnreadableCharacter(): void
51 {
52 $this->expectException(LexicalException::class);
53
54 (new PostgreSqlLexer(new KeywordTable([])))->scan('SELECT {');
55 }
56}
57