packages/sql-parser/tests/Unit/Sqlite/Lexer/OperatorScannerTest.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\OperatorScanner;
16use SqlParser\Sqlite\Lexer\Scan;
17
18#[CoversClass(OperatorScanner::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 OperatorScannerTest extends TestCase
28{
29    public function testScan(): void
30    {
31        $scanner = new OperatorScanner();
32        $scan = static fn (string $sql): Scan => new Scan(new Cursor($sql), new KeywordTable([]));
33
34        self::assertSame('PTR', $scanner->scan($scan('->> 1'))->name);
35        self::assertSame('->>', $scanner->scan($scan('->> 1'))->text);
36        self::assertSame('CONCAT', $scanner->scan($scan('|| x'))->name);
37        self::assertSame('NE', $scanner->scan($scan('!= x'))->name);
38        self::assertSame('LSHIFT', $scanner->scan($scan('<< x'))->name);
39        self::assertSame('LP', $scanner->scan($scan('('))->name);
40        self::assertSame('EQ', $scanner->scan($scan('=='))->name);
41        self::assertSame('==', $scanner->scan($scan('=='))->text);
42    }
43
44    public function testScanRejectsAForeignCharacter(): void
45    {
46        $this->expectException(LexicalException::class);
47
48        (new OperatorScanner())->scan(new Scan(new Cursor('!x'), new KeywordTable([])));
49    }
50}
51