packages/ztd-query-mysql/tests/Unit/Sql/Value/ScalarExpressionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Value;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Sql\Value\ScalarExpression;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Value\StringCoercion::class)]
12#[CoversClass(ScalarExpression::class)]
13final class ScalarExpressionTest extends TestCase
14{
15    public function testRenderExpressionPreservesNumbersAndEscapesTextAndBinary(): void
16    {
17        $renderer = new ScalarExpression();
18        $integer = new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::INTEGER, 'INT');
19        $text = new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::STRING, 'VARCHAR');
20        $binary = new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::BINARY, 'BLOB');
21        self::assertSame('7', $renderer->renderExpression(7, $integer, false));
22        self::assertSame("'7'", $renderer->renderExpression(7, $integer, true));
23        self::assertSame("'a''b'", $renderer->renderExpression("a'b", $text, true));
24        self::assertSame("CONVERT(X'615c62' USING utf8mb4)", $renderer->renderExpression('a\\b', $text, true));
25        self::assertSame("X'0041'", $renderer->renderExpression("\0A", $binary, true));
26    }
27
28    public function testInferTypeDistinguishesIntegersFromOtherValues(): void
29    {
30        $renderer = new ScalarExpression();
31        self::assertSame(\ZtdQuery\Schema\ColumnTypeFamily::INTEGER, $renderer->inferType(7)->family);
32        self::assertSame(\ZtdQuery\Schema\ColumnTypeFamily::STRING, $renderer->inferType('7')->family);
33        self::assertSame(\ZtdQuery\Schema\ColumnTypeFamily::STRING, $renderer->inferType(1.5)->family);
34    }
35
36}
37