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