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