packages/ztd-query-core/tests/Unit/Sql/SqlIdentifierComponentTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use Tests\Fake\FakeSqlLexerProfiles;
11use ZtdQuery\Sql\Profile\SqlCommentProfile;
12use ZtdQuery\Sql\Profile\SqlParameterProfile;
13use ZtdQuery\Sql\Profile\SqlQuoteProfile;
14use ZtdQuery\Sql\Profile\SqlSymbolProfile;
15use ZtdQuery\Sql\Reader\SqlBlockCommentReader;
16use ZtdQuery\Sql\Reader\SqlDelimitedReader;
17use ZtdQuery\Sql\Reader\SqlLexeme;
18use ZtdQuery\Sql\Reader\SqlParameterReader;
19use ZtdQuery\Sql\Reader\SqlTriviaReader;
20use ZtdQuery\Sql\Reader\SqlWordReader;
21use ZtdQuery\Sql\SqlIdentifierComponent;
22use ZtdQuery\Sql\SqlLexerProfile;
23use ZtdQuery\Sql\SqlToken;
24use ZtdQuery\Sql\SqlTokenScanner;
25use ZtdQuery\Sql\SqlTokenStream;
26
27#[CoversClass(SqlIdentifierComponent::class)]
28#[UsesClass(SqlToken::class)]
29#[UsesClass(SqlTokenStream::class)]
30#[UsesClass(SqlTokenScanner::class)]
31#[UsesClass(SqlLexerProfile::class)]
32#[UsesClass(\ZtdQuery\Sql\LexicalDelimiters::class)]
33#[UsesClass(\ZtdQuery\Sql\LexicalPattern::class)]
34#[UsesClass(SqlCommentProfile::class)]
35#[UsesClass(SqlParameterProfile::class)]
36#[UsesClass(SqlQuoteProfile::class)]
37#[UsesClass(SqlSymbolProfile::class)]
38#[UsesClass(SqlBlockCommentReader::class)]
39#[UsesClass(SqlDelimitedReader::class)]
40#[UsesClass(SqlLexeme::class)]
41#[UsesClass(SqlParameterReader::class)]
42#[UsesClass(SqlTriviaReader::class)]
43#[UsesClass(SqlWordReader::class)]
44final class SqlIdentifierComponentTest extends TestCase
45{
46 public function testAtReadsABareNameAndSaysWhereItLeftOff(): void
47 {
48 $tokens = SqlTokenStream::tokenize('users.id', FakeSqlLexerProfiles::standard())->significantTokens();
49
50 self::assertSame(['users', 1], (new SqlIdentifierComponent())->at($tokens, 0, FakeSqlLexerProfiles::standard()));
51 }
52
53 public function testAtReadsAQuotedNameWithoutTheQuotesAroundIt(): void
54 {
55 $tokens = SqlTokenStream::tokenize('"order"', FakeSqlLexerProfiles::standard())->significantTokens();
56
57 self::assertSame(['order', 1], (new SqlIdentifierComponent())->at($tokens, 0, FakeSqlLexerProfiles::standard()));
58 }
59
60 public function testAtIsNothingWhereNoNameIsWritten(): void
61 {
62 $tokens = SqlTokenStream::tokenize('1', FakeSqlLexerProfiles::standard())->significantTokens();
63
64 self::assertNull((new SqlIdentifierComponent())->at($tokens, 0, FakeSqlLexerProfiles::standard()));
65 }
66
67 public function testAtIsNothingPastTheEndOfWhatWasWritten(): void
68 {
69 $tokens = SqlTokenStream::tokenize('users', FakeSqlLexerProfiles::standard())->significantTokens();
70
71 self::assertNull((new SqlIdentifierComponent())->at($tokens, 5, FakeSqlLexerProfiles::standard()));
72 }
73}
74