packages/ztd-query-mysql/tests/Unit/Sql/MySqlLexerProfileTest.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\MySql\Sql\MySqlLexerProfile;
10use ZtdQuery\Sql\SqlTokenKind;
11use ZtdQuery\Sql\SqlTokenStream;
12
13#[CoversClass(MySqlLexerProfile::class)]
14final class MySqlLexerProfileTest extends TestCase
15{
16    public function testCreateAddsMySqlHashLineComments(): void
17    {
18        $profile = MySqlLexerProfile::create(false);
19
20        self::assertTrue($profile->startsLineComment('# comment', 0));
21        self::assertTrue($profile->startsLineComment('-- comment', 0));
22        self::assertFalse($profile->startsLineComment('--not-comment', 0));
23        self::assertSame(['/*', '*/'], $profile->blockCommentAt('/* comment */', 0));
24        self::assertSame("'", $profile->stringQuoteClosing("'"));
25        self::assertSame('`', $profile->identifierQuoteClosing('`'));
26        self::assertSame(':', $profile->namedParameterPrefixAt(':name', 0));
27        self::assertNull($profile->namedParameterPrefixAt('value::type', 6));
28        self::assertTrue($profile->isBracketOpening('['));
29        self::assertTrue($profile->isBracketClosing(']'));
30        self::assertTrue($profile->isNestingOpening('('));
31        self::assertTrue($profile->isNestingClosing(')'));
32        self::assertFalse($profile->supportsNestedBlockComments());
33        self::assertSame(1, $profile->positionalParameterLengthAt('?1', 0));
34        self::assertSame(4, $profile->numberLengthAt('0xCA tail', 0));
35        self::assertTrue($profile->isIdentifierStart('$'));
36        self::assertTrue($profile->isIdentifierPart('$'));
37        self::assertTrue($profile->stringUsesBackslashEscapes("'value'", 0));
38        self::assertNull($profile->dollarQuoteDelimiterAt('$tag$value$tag$', 0));
39    }
40
41    public function testUsesDefaultAndAnsiQuotesModesExplicitly(): void
42    {
43        $default = SqlTokenStream::tokenize('"value" `column`', MySqlLexerProfile::create(false))->significantTokens();
44        $ansi = SqlTokenStream::tokenize('"column" `other`', MySqlLexerProfile::create(true))->significantTokens();
45
46        self::assertSame(SqlTokenKind::String, $default[0]->kind);
47        self::assertSame(SqlTokenKind::QuotedIdentifier, $default[1]->kind);
48        self::assertSame(SqlTokenKind::QuotedIdentifier, $ansi[0]->kind);
49        self::assertSame(SqlTokenKind::QuotedIdentifier, $ansi[1]->kind);
50        self::assertSame(
51            SqlTokenKind::String,
52            SqlTokenStream::tokenize("'value'", MySqlLexerProfile::create())->significantTokens()[0]->kind,
53        );
54        self::assertSame(
55            SqlTokenKind::String,
56            SqlTokenStream::tokenize("'value'", MySqlLexerProfile::create(true))->significantTokens()[0]->kind,
57        );
58    }
59}
60