packages/sql-fixture/tests/Unit/Platform/Sqlite/Schema/DefaultExpressionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\Sqlite\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFixture\Platform\Sqlite\Schema\DefaultExpression as Subject;
10
11#[CoversClass(Subject::class)]
12final class DefaultExpressionTest extends TestCase
13{
14 public function testExtractDefaultDistinguishesLiteralsAndExpressions(): void
15 {
16 $defaults = new Subject();
17 self::assertSame(12, $defaults->extractDefault('INT DEFAULT 12 NOT NULL'));
18 self::assertSame(12.5, $defaults->extractDefault('NUMERIC DEFAULT 12.5'));
19 self::assertSame('ready', $defaults->extractDefault("TEXT DEFAULT 'ready'"));
20 self::assertTrue($defaults->extractDefault('BOOLEAN DEFAULT TRUE'));
21 self::assertNull($defaults->extractDefault('TEXT DEFAULT NULL'));
22 self::assertSame('(1 + 2)', $defaults->extractDefault('INT DEFAULT (1 + 2)'));
23 self::assertNull($defaults->extractDefault('TEXT'));
24 }
25 #[\PHPUnit\Framework\Attributes\DataProvider('providerDefaultClauses')]
26 public function testExtractDefaultInterpretsLiteralKinds(string $clause, int|float|bool|string|null $expected): void
27 {
28 self::assertSame($expected, (new Subject())->extractDefault($clause));
29 }
30
31 /**
32 * @return list<array{string, int|float|bool|string|null}>
33 */
34 public static function providerDefaultClauses(): array
35 {
36 return [
37 ['BOOLEAN default false', false],
38 ['BOOLEAN DEFAULT tRuE NOT NULL', true],
39 ['TEXT DEFAULT nUlL', null],
40 ['INT DEFAULT -12 CHECK (id > 0)', -12],
41 ['DECIMAL DEFAULT -12.5 NOT NULL', -12.5],
42 ['NUMERIC DEFAULT 1e3', 1000],
43 ["TEXT DEFAULT 'a::b' UNIQUE", 'a::b'],
44 ["TEXT DEFAULT 'line\nvalue'", "line\nvalue"],
45 ["TEXT DEFAULT ''", ''],
46 ['TIMESTAMP DEFAULT CURRENT_TIMESTAMP', 'CURRENT_TIMESTAMP'],
47 ['TIMESTAMP DEFAULT now()', 'now()'],
48 ['INT DEFAULT (2 + 3)', '(2 + 3)'],
49 ['TEXT', null],
50 ['INT DEFAULT 1', true],
51 ['INT DEFAULT 0', false],
52 ];
53 }
54}
55