packages/sql-faker/tests/Unit/Compiler/Bison/Lexer/QuotedLiteralScannerTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Compiler\Bison\Lexer;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Compiler\Bison\Lexer\BisonLexeme;
11use SqlFaker\Compiler\Bison\Lexer\BisonToken;
12use SqlFaker\Compiler\Bison\Lexer\QuotedLiteralScanner;
13use SqlFaker\Compiler\Bison\Lexer\SourceCursor;
14
15#[CoversClass(QuotedLiteralScanner::class)]
16#[UsesClass(BisonLexeme::class)]
17#[UsesClass(BisonToken::class)]
18#[UsesClass(SourceCursor::class)]
19final class QuotedLiteralScannerTest extends TestCase
20{
21    public function testHandlesClaimsBothQuoteCharacters(): void
22    {
23        $scanner = new QuotedLiteralScanner();
24
25        self::assertTrue($scanner->handles("'"));
26        self::assertTrue($scanner->handles('"'));
27        self::assertFalse($scanner->handles('`'));
28    }
29
30    public function testScanReadsSingleQuotesAsACharacterLiteral(): void
31    {
32        $cursor = new SourceCursor("'+' rest");
33
34        $token = (new QuotedLiteralScanner())->scan($cursor);
35
36        self::assertSame(BisonLexeme::CharLiteral, $token->type);
37        self::assertSame('+', $token->value);
38        self::assertSame(0, $token->offset);
39        self::assertSame(' rest', $cursor->takeRest());
40    }
41
42    public function testScanReadsDoubleQuotesAsAStringLiteral(): void
43    {
44        $cursor = new SourceCursor('"alias" rest');
45
46        $token = (new QuotedLiteralScanner())->scan($cursor);
47
48        self::assertSame(BisonLexeme::StringLiteral, $token->type);
49        self::assertSame('alias', $token->value);
50        self::assertSame(' rest', $cursor->takeRest());
51    }
52
53    public function testScanKeepsReadingPastAnEscapedQuote(): void
54    {
55        $cursor = new SourceCursor('"a\\"b" rest');
56
57        self::assertSame('a"b', (new QuotedLiteralScanner())->scan($cursor)->value);
58        self::assertSame(' rest', $cursor->takeRest());
59    }
60
61    public function testScanReadsAnEmptyLiteral(): void
62    {
63        $cursor = new SourceCursor("''");
64
65        self::assertSame('', (new QuotedLiteralScanner())->scan($cursor)->value);
66    }
67}
68