packages/ztd-query-sqlite/tests/Unit/Schema/Create/TableBodyParserTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\Create;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Schema\Create\TableBodyParser;
11
12#[CoversClass(TableBodyParser::class)]
13#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Lexing\ExpressionSpan::class)]
14#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Lexing\QuotedSpan::class)]
15#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
16final class TableBodyParserTest extends TestCase
17{
18 public function testTableBodyValidatesFramingAndOptions(): void
19 {
20 $parser = new TableBodyParser();
21 self::assertSame('id INTEGER, name TEXT DEFAULT \'a)\'', $parser->tableBody("CREATE TABLE users(id INTEGER, name TEXT DEFAULT 'a)') STRICT;"));
22 self::assertNull($parser->tableBody('CREATE VIEW users AS SELECT 1'));
23 self::assertNull($parser->tableBody('CREATE TABLE users (id INTEGER'));
24 self::assertNull($parser->tableBody('CREATE TABLE users(id INTEGER) trailing'));
25 }
26
27 public function testHasValidTableOptionsRejectsDuplicatesAndTrailingCommas(): void
28 {
29 self::assertTrue(TableBodyParser::hasValidTableOptions(''));
30 self::assertTrue(TableBodyParser::hasValidTableOptions(' STRICT, WITHOUT ROWID;'));
31 self::assertTrue(TableBodyParser::hasValidTableOptions(' WITHOUT ROWID, STRICT'));
32 self::assertFalse(TableBodyParser::hasValidTableOptions(' STRICT, STRICT'));
33 self::assertFalse(TableBodyParser::hasValidTableOptions(' WITHOUT ROWID, WITHOUT ROWID'));
34 self::assertFalse(TableBodyParser::hasValidTableOptions(' STRICT,'));
35 self::assertFalse(TableBodyParser::hasValidTableOptions(' STRICT WITHOUT ROWID'));
36 self::assertFalse(TableBodyParser::hasValidTableOptions(' WITHOUT'));
37 }
38
39 public function testHasWithoutRowidRequiresTopLevelOption(): void
40 {
41 self::assertTrue(TableBodyParser::hasWithoutRowid('CREATE TABLE users(id INTEGER) WITHOUT ROWID'));
42 self::assertFalse(TableBodyParser::hasWithoutRowid("CREATE TABLE users(name TEXT DEFAULT 'WITHOUT ROWID')"));
43 self::assertFalse(TableBodyParser::hasWithoutRowid('CREATE TABLE users(id INTEGER) WITHOUT thing'));
44 }
45
46 public function testSplitColumnDefinitionsPreservesExpressionCommas(): void
47 {
48 self::assertSame(['id INTEGER', 'amount DECIMAL(10,2)', "name TEXT DEFAULT 'a,b'"], (new TableBodyParser())->splitColumnDefinitions("id INTEGER, amount DECIMAL(10,2), name TEXT DEFAULT 'a,b'"));
49 self::assertSame([], (new TableBodyParser())->splitColumnDefinitions(''));
50 self::assertSame(['id INTEGER'], (new TableBodyParser())->splitColumnDefinitions('id INTEGER, '));
51 }
52
53}
54