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