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