packages/ztd-query-mysql/tests/Unit/Shadow/Mutation/Upsert/LiteralReaderTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation\Upsert;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Shadow\Mutation\Upsert\LiteralReader;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[CoversClass(LiteralReader::class)]
13final class LiteralReaderTest extends TestCase
14{
15    public function testIdentifierPreservesWordsAndUnquotesNames(): void
16    {
17        $reader = new LiteralReader();
18        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('score `a``b`', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
19        self::assertSame('score', $reader->identifier($tokens[0]));
20        self::assertSame('a`b', $reader->identifier($tokens[1]));
21    }
22
23    public function testNumberReadsIntegerHexAndScientificForms(): void
24    {
25        $reader = new LiteralReader();
26        self::assertSame(42, $reader->number('42'));
27        self::assertSame(255, $reader->number('0xff'));
28        self::assertSame(1.5, $reader->number('1.5'));
29        self::assertSame(200.0, $reader->number('2e2'));
30    }
31
32    public function testNumberRejectsUnsupportedLiteral(): void
33    {
34        $this->expectException(\ZtdQuery\Exception\UnsupportedSqlException::class);
35        (new LiteralReader())->number('1 + 2');
36    }
37
38}
39