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