packages/ztd-query-sqlite/tests/Unit/Sql/SqliteLexerProfileTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile;
10use ZtdQuery\Sql\SqlToken;
11use ZtdQuery\Sql\SqlTokenKind;
12use ZtdQuery\Sql\SqlTokenStream;
13
14#[CoversClass(SqliteLexerProfile::class)]
15final class SqliteLexerProfileTest extends TestCase
16{
17    public function testCreateSelectsSqliteLexicalCapabilities(): void
18    {
19        $stream = SqlTokenStream::tokenize(
20            'SELECT [bracket]]name], `grave`, "quoted", ?12, :name, @name, $namespace::value(suffix), 0xCA_FE',
21            SqliteLexerProfile::create(),
22        );
23        $tokens = $stream->significantTokens();
24        $lastToken = $tokens[count($tokens) - 1] ?? null;
25
26        self::assertSame(['name' => 'bracket]name', 'next' => 2], $stream->identifierAt(1));
27        self::assertSame(
28            ['?12', ':name', '@name', '$namespace::value(suffix)'],
29            array_values(array_map(
30                static fn (SqlToken $token): string => $token->text,
31                array_filter($tokens, static fn (SqlToken $token): bool => $token->kind === SqlTokenKind::Parameter),
32            )),
33        );
34        self::assertNotNull($lastToken);
35        self::assertSame(SqlTokenKind::Number, $lastToken->kind);
36        self::assertSame('0xCA_FE', $lastToken->text);
37        self::assertTrue(SqliteLexerProfile::create()->startsLineComment('-- comment', 0));
38        self::assertSame(['/*', '*/'], SqliteLexerProfile::create()->blockCommentAt('/* comment */', 0));
39        self::assertSame("'", SqliteLexerProfile::create()->stringQuoteClosing("'"));
40        self::assertSame('"', SqliteLexerProfile::create()->identifierQuoteClosing('"'));
41        self::assertNull(SqliteLexerProfile::create()->namedParameterPrefixAt('value::type', 6));
42        self::assertTrue(SqliteLexerProfile::create()->isBracketOpening('['));
43        self::assertTrue(SqliteLexerProfile::create()->isBracketClosing(']'));
44        self::assertTrue(SqliteLexerProfile::create()->isNestingOpening('('));
45        self::assertTrue(SqliteLexerProfile::create()->isNestingClosing(')'));
46        self::assertFalse(SqliteLexerProfile::create()->supportsNestedBlockComments());
47        self::assertSame(0, SqliteLexerProfile::create()->positionalParameterLengthAt('$1', 0));
48        self::assertFalse(SqliteLexerProfile::create()->stringUsesBackslashEscapes("'value'", 0));
49    }
50}
51