packages/sql-faker/tests/Unit/MySql/Generation/Tokenization/MySqlQuotingTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Tokenization;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\MySql\Generation\Tokenization\MySqlQuoting;
11
12#[CoversClass(MySqlQuoting::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFaker\Generation\Derivation\CompletionCosts::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFaker\Generation\Derivation\DerivationNode::class)]
15final class MySqlQuotingTest extends TestCase
16{
17    #[DataProvider('providerIdentifier')]
18    public function testIdentifierEncodesTheChosenBody(string $body, string $expected): void
19    {
20        self::assertSame($expected, MySqlQuoting::identifier($body));
21    }
22
23    /**
24     * @return iterable<string, array{string, string}>
25     */
26    public static function providerIdentifier(): iterable
27    {
28        yield 'plain' => ['users', '`users`'];
29        yield 'keyword' => ['select', '`select`'];
30        yield 'embedded delimiter' => ['a`b', '`a``b`'];
31        yield 'multiple delimiters' => ['`x`', '```x```'];
32        yield 'unicode' => ['利用者', '`利用者`'];
33    }
34
35    #[DataProvider('providerStringLiteral')]
36    public function testStringLiteralEncodesTheChosenBody(string $body, string $expected): void
37    {
38        self::assertSame($expected, MySqlQuoting::stringLiteral($body));
39    }
40
41    /**
42     * @return iterable<string, array{string, string}>
43     */
44    public static function providerStringLiteral(): iterable
45    {
46        yield 'empty' => ['', '\'\''];
47        yield 'plain' => ['text', '\'text\''];
48        yield 'apostrophe' => ['a\'b', '\'a\'\'b\''];
49        yield 'consecutive quotes' => ['\'\'', '\'\'\'\'\'\''];
50        yield 'backslash' => ['a\\b', '\'a\\b\''];
51        yield 'unicode' => ['日本語', '\'日本語\''];
52    }
53}
54