packages/sql-faker/tests/Unit/Compiler/Bison/Lexer/NumberScannerTest.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\NumberScanner;
13use SqlFaker\Compiler\Bison\Lexer\SourceCursor;
14
15#[CoversClass(NumberScanner::class)]
16#[UsesClass(BisonLexeme::class)]
17#[UsesClass(BisonToken::class)]
18#[UsesClass(SourceCursor::class)]
19final class NumberScannerTest extends TestCase
20{
21    public function testHandlesClaimsOnlyADigit(): void
22    {
23        $scanner = new NumberScanner();
24
25        self::assertTrue($scanner->handles('0'));
26        self::assertTrue($scanner->handles('9'));
27        self::assertFalse($scanner->handles('a'));
28        self::assertFalse($scanner->handles('-'));
29    }
30
31    public function testScanCarriesTheValueAsAnInteger(): void
32    {
33        $cursor = new SourceCursor('123 rest');
34
35        $token = (new NumberScanner())->scan($cursor);
36
37        self::assertSame(BisonLexeme::Number, $token->type);
38        self::assertSame(123, $token->value);
39        self::assertSame(0, $token->offset);
40        self::assertSame(' rest', $cursor->takeRest());
41    }
42
43    public function testScanStopsAtTheFirstNonDigit(): void
44    {
45        $cursor = new SourceCursor('12abc');
46
47        self::assertSame(12, (new NumberScanner())->scan($cursor)->value);
48        self::assertSame('abc', $cursor->takeRest());
49    }
50
51    public function testScanReadsLeadingZeroes(): void
52    {
53        $cursor = new SourceCursor('007');
54
55        self::assertSame(7, (new NumberScanner())->scan($cursor)->value);
56    }
57}
58