packages/sql-parser/tests/Unit/Sqlite/Lexer/VariableScannerTest.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\Scan;
16use SqlParser\Sqlite\Lexer\VariableScanner;
17
18#[CoversClass(VariableScanner::class)]
19#[UsesClass(Cursor::class)]
20#[UsesClass(Lexeme::class)]
21#[UsesClass(LexicalException::class)]
22#[UsesClass(KeywordTable::class)]
23#[UsesClass(Scan::class)]
24#[UsesClass(\SqlParser\Lexer\SourcePosition::class)]
25#[UsesClass(\SqlParser\Lexer\SourceException::class)]
26#[Small]
27final class VariableScannerTest extends TestCase
28{
29 public function testScan(): void
30 {
31 $scanner = new VariableScanner();
32 $scan = static fn (string $sql): Scan => new Scan(new Cursor($sql), new KeywordTable([]));
33
34 self::assertSame('?', $scanner->scan($scan('? '))?->text);
35 self::assertSame('?12', $scanner->scan($scan('?12 '))?->text);
36 self::assertSame(':name', $scanner->scan($scan(':name x'))?->text);
37 self::assertSame('@a::b', $scanner->scan($scan('@a::b x'))?->text);
38 self::assertSame('$x$y', $scanner->scan($scan('$x$y '))?->text);
39 self::assertSame('#v(1)', $scanner->scan($scan('#v(1) x'))?->text);
40 self::assertSame('VARIABLE', $scanner->scan($scan('$a'))?->name);
41 self::assertNull($scanner->scan($scan('abc')));
42 }
43
44 public function testScanRejectsASigilWithoutAName(): void
45 {
46 $this->expectException(LexicalException::class);
47
48 (new VariableScanner())->scan(new Scan(new Cursor(': x'), new KeywordTable([])));
49 }
50
51 public function testScanRejectsAnUnterminatedSuffix(): void
52 {
53 $this->expectException(LexicalException::class);
54
55 (new VariableScanner())->scan(new Scan(new Cursor('$v(1 2)'), new KeywordTable([])));
56 }
57}
58