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