packages/ztd-query-mysql/tests/Unit/Sql/Transaction/TokenReaderTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Transaction;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Sql\Transaction\TokenReader;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[CoversClass(TokenReader::class)]
13final class TokenReaderTest extends TestCase
14{
15 public function testMatchesAnyAcceptsOnlyCompleteForms(): void
16 {
17 $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('START TRANSACTION', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
18 $reader = new TokenReader();
19 self::assertTrue($reader->matchesAny($tokens, [['BEGIN'], ['START', 'TRANSACTION']]));
20 self::assertFalse($reader->matchesAny($tokens, [['START']]));
21 }
22
23 public function testMatchesRejectsExtraTokensAndQuotedKeywords(): void
24 {
25 $reader = new TokenReader();
26 self::assertTrue($reader->matches(\ZtdQuery\Sql\SqlTokenStream::tokenize('COMMIT WORK', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens(), ['COMMIT', 'WORK']));
27 self::assertFalse($reader->matches(\ZtdQuery\Sql\SqlTokenStream::tokenize('COMMIT WORK', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens(), ['COMMIT']));
28 self::assertFalse($reader->matches(\ZtdQuery\Sql\SqlTokenStream::tokenize('`COMMIT`', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens(), ['COMMIT']));
29 }
30
31 public function testNameAfterReadsSavepointNames(): void
32 {
33 $reader = new TokenReader();
34 self::assertSame('a`b', $reader->nameAfter(\ZtdQuery\Sql\SqlTokenStream::tokenize('SAVEPOINT `a``b`', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens(), [['SAVEPOINT']]));
35 self::assertNull($reader->nameAfter(\ZtdQuery\Sql\SqlTokenStream::tokenize('SAVEPOINT 42', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens(), [['SAVEPOINT']]));
36 self::assertNull($reader->nameAfter([], [['SAVEPOINT']]));
37 }
38
39 public function testUnquoteRejectsUnclosedIdentifiers(): void
40 {
41 $reader = new TokenReader();
42 self::assertSame('savepoint', $reader->unquote('savepoint', ['`', '"']));
43 self::assertSame('a`b', $reader->unquote('`a``b`', ['`', '"']));
44 self::assertNull($reader->unquote('`broken', ['`', '"']));
45 }
46
47}
48