packages/sql-parser/tests/Unit/Sqlite/Lexer/QuotedScannerTest.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\QuotedScanner;
16use SqlParser\Sqlite\Lexer\Scan;
17
18#[CoversClass(QuotedScanner::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 QuotedScannerTest extends TestCase
28{
29 public function testScan(): void
30 {
31 $scanner = new QuotedScanner();
32 $scan = static fn (string $sql): Scan => new Scan(new Cursor($sql), new KeywordTable([]));
33
34 self::assertSame('STRING', $scanner->scan($scan("'it''s'"))?->name);
35 self::assertSame('ID', $scanner->scan($scan('"a""b"'))?->name);
36 self::assertSame('ID', $scanner->scan($scan('`a`'))?->name);
37 self::assertSame('[a b]', $scanner->scan($scan('[a b] c'))?->text);
38 self::assertSame('BLOB', $scanner->scan($scan("x'ff'"))?->name);
39 self::assertNull($scanner->scan($scan('abc')));
40 self::assertNull($scanner->scan($scan('xyz')));
41 }
42
43 public function testScanRejectsAnUnterminatedString(): void
44 {
45 $this->expectException(LexicalException::class);
46
47 (new QuotedScanner())->scan(new Scan(new Cursor("'open"), new KeywordTable([])));
48 }
49
50 public function testScanRejectsAnUnterminatedBracket(): void
51 {
52 $this->expectException(LexicalException::class);
53
54 (new QuotedScanner())->scan(new Scan(new Cursor('[open'), new KeywordTable([])));
55 }
56
57 public function testScanRejectsAnOddBlob(): void
58 {
59 $this->expectException(LexicalException::class);
60
61 (new QuotedScanner())->scan(new Scan(new Cursor("x'f'"), new KeywordTable([])));
62 }
63}
64