packages/ztd-query-core/tests/Unit/Sql/Reader/SqlWordReaderTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Reader;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use Tests\Fake\FakeSqlLexerProfiles;
11use ZtdQuery\Sql\LexicalDelimiters;
12use ZtdQuery\Sql\LexicalPattern;
13use ZtdQuery\Sql\Profile\SqlCommentProfile;
14use ZtdQuery\Sql\Profile\SqlParameterProfile;
15use ZtdQuery\Sql\Profile\SqlQuoteProfile;
16use ZtdQuery\Sql\Profile\SqlSymbolProfile;
17use ZtdQuery\Sql\Reader\SqlLexeme;
18use ZtdQuery\Sql\Reader\SqlWordReader;
19use ZtdQuery\Sql\SqlLexerProfile;
20use ZtdQuery\Sql\SqlTokenKind;
21
22#[CoversClass(SqlWordReader::class)]
23#[UsesClass(SqlLexeme::class)]
24#[UsesClass(SqlLexerProfile::class)]
25#[UsesClass(LexicalDelimiters::class)]
26#[UsesClass(LexicalPattern::class)]
27#[UsesClass(SqlCommentProfile::class)]
28#[UsesClass(SqlParameterProfile::class)]
29#[UsesClass(SqlQuoteProfile::class)]
30#[UsesClass(SqlSymbolProfile::class)]
31final class SqlWordReaderTest extends TestCase
32{
33    public function testReadAtAnswersNothingWhereNeitherAWordNorANumberBegins(): void
34    {
35        self::assertNull((new SqlWordReader())->readAt(',a', 0, FakeSqlLexerProfiles::standard()));
36    }
37
38    public function testReadAtReadsAWholeBareWordAsOneLexeme(): void
39    {
40        $lexeme = (new SqlWordReader())->readAt('select_1 ', 0, FakeSqlLexerProfiles::standard());
41
42        self::assertSame([SqlTokenKind::Word, 8], [$lexeme?->kind, $lexeme?->end]);
43    }
44
45    public function testReadAtReadsAWordThatRunsToTheEndOfTheStatement(): void
46    {
47        $lexeme = (new SqlWordReader())->readAt('abc', 0, FakeSqlLexerProfiles::standard());
48
49        self::assertSame([SqlTokenKind::Word, 3], [$lexeme?->kind, $lexeme?->end]);
50    }
51
52    public function testReadAtReadsAsFarIntoANumberAsTheDialectSpellsOne(): void
53    {
54        $lexeme = (new SqlWordReader())->readAt('1.5e3,', 0, FakeSqlLexerProfiles::standard());
55
56        self::assertSame([SqlTokenKind::Number, 5], [$lexeme?->kind, $lexeme?->end]);
57    }
58}
59