packages/ztd-query-sqlite/tests/Unit/Schema/Key/ForeignKeyTokensTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\Key;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Schema\Key\ForeignKeyTokens;
11use ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile;
12use ZtdQuery\Sql\SqlToken;
13use ZtdQuery\Sql\SqlTokenKind;
14use ZtdQuery\Sql\SqlTokenStream;
15
16#[CoversClass(ForeignKeyTokens::class)]
17#[UsesClass(SqliteLexerProfile::class)]
18final class ForeignKeyTokensTest extends TestCase
19{
20 public function testTableBodyIgnoresNestedParentheses(): void
21 {
22 $parser = new ForeignKeyTokens();
23 self::assertSame('id INTEGER, CHECK(id IN (1, 2))', $parser->tableBody('CREATE TABLE t(id INTEGER, CHECK(id IN (1, 2)))'));
24 self::assertNull($parser->tableBody('SELECT (1)'));
25 self::assertNull($parser->tableBody('CREATE TABLE t(id INTEGER'));
26 }
27
28 public function testKeywordIndexRequiresTopLevelKeyword(): void
29 {
30 $tokens = SqlTokenStream::tokenize('(REFERENCES) REFERENCES parent', SqliteLexerProfile::create())->significantTokens();
31 self::assertSame(3, ForeignKeyTokens::keywordIndex($tokens, 'REFERENCES'));
32 self::assertNull(ForeignKeyTokens::keywordIndex($tokens, 'FOREIGN'));
33 }
34
35 public function testSymbolIndexHonorsOffsetAndNesting(): void
36 {
37 $tokens = SqlTokenStream::tokenize('(a, b), c', SqliteLexerProfile::create())->significantTokens();
38 self::assertSame(5, ForeignKeyTokens::symbolIndex($tokens, ',', 0));
39 self::assertNull(ForeignKeyTokens::symbolIndex($tokens, ',', 6));
40 }
41
42 public function testIsSymbolDistinguishesPunctuation(): void
43 {
44 self::assertFalse(ForeignKeyTokens::isSymbol(null, '('));
45 self::assertTrue(ForeignKeyTokens::isSymbol(new SqlToken(SqlTokenKind::Symbol, '(', 0, 0, 0), '('));
46 self::assertFalse(ForeignKeyTokens::isSymbol(new SqlToken(SqlTokenKind::Word, '(', 0, 0, 0), '('));
47 }
48
49}
50