packages/ztd-query-sqlite/tests/Unit/Connection/Parameter/SqlitePdoParameterBindingCompilerTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Connection\Parameter;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Connection\Parameter\SqlitePdoParameterBindingCompiler;
11use ZtdQuery\Platform\Sqlite\Sql\Value\SqliteCastRenderer;
12
13#[CoversClass(SqlitePdoParameterBindingCompiler::class)]
14#[UsesClass(\ZtdQuery\Platform\Sqlite\Connection\Parameter\ParameterReplacements::class)]
15#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Value\CastTypeMapper::class)]
16#[UsesClass(SqliteCastRenderer::class)]
17#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
18final class SqlitePdoParameterBindingCompilerTest extends TestCase
19{
20 public function testCompileUsesSqliteRendererForStorageSensitiveParameterTypes(): void
21 {
22 $compiled = (new SqlitePdoParameterBindingCompiler())->compile(
23 'SELECT ?, ?, :ratio, :integer, :enabled, \'?\', "?"',
24 [0 => 12, 1 => 2.5, 'ratio' => 2.5, ':integer' => 9, 'enabled' => true],
25 );
26
27 self::assertSame(
28 'SELECT CAST(? AS INTEGER), CAST(? AS REAL), CAST(:ratio AS REAL), CAST(:integer AS INTEGER), CAST(:enabled AS INTEGER), \'?\', "?"',
29 $compiled['sql'],
30 );
31 }
32
33 public function testLeavesNullAndUnboundParametersUnchanged(): void
34 {
35 $compiler = new SqlitePdoParameterBindingCompiler();
36
37 self::assertSame(
38 ['sql' => 'SELECT ?, :missing', 'params' => null],
39 $compiler->compile('SELECT ?, :missing', null),
40 );
41 self::assertSame(
42 ['sql' => 'SELECT ?, :missing', 'params' => []],
43 $compiler->compile('SELECT ?, :missing', []),
44 );
45 self::assertSame(
46 ['sql' => 'SELECT :missing, CAST(:value AS INTEGER)', 'params' => ['value' => 7]],
47 $compiler->compile('SELECT :missing, :value', ['value' => 7]),
48 );
49 }
50
51 public function testLeavesBoundValuesWithoutStorageSensitiveTypesUnchanged(): void
52 {
53 $params = [null, 'text', []];
54
55 self::assertSame(
56 ['sql' => 'SELECT ?, ?, ?', 'params' => $params],
57 (new SqlitePdoParameterBindingCompiler())->compile('SELECT ?, ?, ?', $params),
58 );
59 }
60}
61