packages/sql-faker/tests/Unit/Compiler/Bison/Lexer/IdentifierScannerTest.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\IdentifierScanner;
13use SqlFaker\Compiler\Bison\Lexer\SourceCursor;
14
15#[CoversClass(IdentifierScanner::class)]
16#[UsesClass(BisonLexeme::class)]
17#[UsesClass(BisonToken::class)]
18#[UsesClass(SourceCursor::class)]
19final class IdentifierScannerTest extends TestCase
20{
21    public function testHandlesClaimsALetterOrUnderscore(): void
22    {
23        $scanner = new IdentifierScanner();
24
25        self::assertTrue($scanner->handles('a'));
26        self::assertTrue($scanner->handles('Z'));
27        self::assertTrue($scanner->handles('_'));
28    }
29
30    public function testHandlesRejectsADigit(): void
31    {
32        self::assertFalse((new IdentifierScanner())->handles('1'));
33    }
34
35    public function testScanCarriesTheNameSpelling(): void
36    {
37        $cursor = new SourceCursor('select_stmt rest');
38
39        $token = (new IdentifierScanner())->scan($cursor);
40
41        self::assertSame(BisonLexeme::Identifier, $token->type);
42        self::assertSame('select_stmt', $token->value);
43        self::assertSame(0, $token->offset);
44        self::assertSame(' rest', $cursor->takeRest());
45    }
46
47    public function testScanAllowsDigitsAndDotsAfterTheFirstCharacter(): void
48    {
49        $cursor = new SourceCursor('api.pure2-tail');
50
51        self::assertSame('api.pure2', (new IdentifierScanner())->scan($cursor)->value);
52        self::assertSame('-tail', $cursor->takeRest());
53    }
54}
55