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