packages/ztd-query-sqlite/tests/Unit/Sql/Returning/ReturningItemParserTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Returning;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Sql\Returning\ReturningItemParser;
11use ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile;
12use ZtdQuery\Sql\SqlToken;
13use ZtdQuery\Sql\SqlTokenKind;
14use ZtdQuery\Sql\SqlTokenStream;
15
16#[CoversClass(ReturningItemParser::class)]
17#[UsesClass(SqliteLexerProfile::class)]
18final class ReturningItemParserTest extends TestCase
19{
20 public function testParseItemKeepsColumnAndAliasSeparate(): void
21 {
22 $parser = new ReturningItemParser();
23 self::assertSame(['source' => 'name', 'output' => 'label'], $parser->parseItem('users.name AS "label"'));
24 self::assertSame(['source' => null, 'output' => null], $parser->parseItem('users.*'));
25 self::assertNull($parser->parseItem('users.* AS label'));
26 self::assertNull($parser->parseItem('upper(name)'));
27 self::assertNull($parser->parseItem('name AS label extra'));
28 }
29
30 public function testAsIndexLocatesExplicitAlias(): void
31 {
32 $parser = new ReturningItemParser();
33 self::assertSame(1, $parser->asIndex(SqlTokenStream::tokenize('name AS label', SqliteLexerProfile::create())->significantTokens()));
34 self::assertNull($parser->asIndex(SqlTokenStream::tokenize('name', SqliteLexerProfile::create())->significantTokens()));
35 }
36
37 public function testIsIdentifierPathRejectsOperators(): void
38 {
39 $parser = new ReturningItemParser();
40 self::assertTrue($parser->isIdentifierPath(SqlTokenStream::tokenize('main.users.name', SqliteLexerProfile::create())->significantTokens()));
41 self::assertTrue($parser->isIdentifierPath(SqlTokenStream::tokenize('users.*', SqliteLexerProfile::create())->significantTokens()));
42 self::assertFalse($parser->isIdentifierPath(SqlTokenStream::tokenize('name + 1', SqliteLexerProfile::create())->significantTokens()));
43 self::assertFalse($parser->isIdentifierPath(SqlTokenStream::tokenize('1', SqliteLexerProfile::create())->significantTokens()));
44 }
45
46 public function testIdentifierNameUnescapesSupportedQuotes(): void
47 {
48 $parser = new ReturningItemParser();
49 self::assertSame('name', $parser->identifierName(new SqlToken(SqlTokenKind::Word, 'name', 0, 0, 0)));
50 self::assertSame('a"b', $parser->identifierName(new SqlToken(SqlTokenKind::QuotedIdentifier, '"a""b"', 0, 0, 0)));
51 self::assertNull($parser->identifierName(new SqlToken(SqlTokenKind::Number, '1', 0, 0, 0)));
52 self::assertNull($parser->identifierName(new SqlToken(SqlTokenKind::QuotedIdentifier, '""', 0, 0, 0)));
53 }
54
55}
56