packages/ztd-query-core/tests/Unit/Platform/CastRendererTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform;
6
7use Override;
8use PHPUnit\Framework\Attributes\CoversNothing;
9use Tests\Contract\CastRendererContractTest;
10use Tests\Fake\FakeCastRenderer;
11use ZtdQuery\Platform\CastRenderer;
12use ZtdQuery\Schema\ColumnDeclaration;
13use ZtdQuery\Schema\ColumnTypeFamily;
14
15#[CoversNothing]
16final class CastRendererTest extends CastRendererContractTest
17{
18    public function createRenderer(): CastRenderer
19    {
20        return new FakeCastRenderer();
21    }
22
23    #[Override]
24    public function nativeTypeFor(ColumnTypeFamily $family): string
25    {
26        return match ($family) {
27            ColumnTypeFamily::INTEGER => 'INTEGER',
28            ColumnTypeFamily::FLOAT => 'REAL',
29            ColumnTypeFamily::DOUBLE => 'REAL',
30            ColumnTypeFamily::DECIMAL => 'NUMERIC(10,2)',
31            ColumnTypeFamily::STRING => 'TEXT',
32            ColumnTypeFamily::TEXT => 'TEXT',
33            ColumnTypeFamily::BOOLEAN => 'INTEGER',
34            ColumnTypeFamily::DATE => 'TEXT',
35            ColumnTypeFamily::TIME => 'TEXT',
36            ColumnTypeFamily::DATETIME => 'TEXT',
37            ColumnTypeFamily::TIMESTAMP => 'TEXT',
38            ColumnTypeFamily::BINARY => 'BLOB',
39            ColumnTypeFamily::JSON => 'TEXT',
40            ColumnTypeFamily::UNKNOWN => 'CUSTOM_TYPE',
41        };
42    }
43
44    public function testRenderCastWritesTheExpressionAsTheTypeItIsBeingReadFor(): void
45    {
46        $renderer = $this->createRenderer();
47        $type = new ColumnDeclaration(ColumnTypeFamily::INTEGER, 'INTEGER');
48
49        self::assertStringContainsString('1', $renderer->renderCast('1', $type));
50    }
51
52    public function testRenderNullCastWritesANullTheServerWillReadAsThatType(): void
53    {
54        $renderer = $this->createRenderer();
55        $type = new ColumnDeclaration(ColumnTypeFamily::TEXT, 'TEXT');
56
57        self::assertStringContainsStringIgnoringCase('null', $renderer->renderNullCast($type));
58    }
59}
60