packages/ztd-query-mysql/tests/Unit/Rewrite/LoadData/RecordParserTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\LoadData;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\LoadData\RecordParser;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\LoadData\ColumnMapping::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\LoadData\InputFormat::class)]
14#[CoversClass(RecordParser::class)]
15final class RecordParserTest extends TestCase
16{
17    public function testSplitRecords(): void
18    {
19        $format = new \ZtdQuery\Platform\MySql\Rewrite\LoadData\InputFormat(',', '"', '\\', '', "\n");
20        self::assertSame(["1,\"two\nlines\"", '2,"a""b"', '3,tail'], (new RecordParser())->splitRecords("1,\"two\nlines\"\n2,\"a\"\"b\"\n3,tail", $format));
21        self::assertSame([], (new RecordParser())->splitRecords('', $format));
22    }
23
24    public function testParseFields(): void
25    {
26        $format = new \ZtdQuery\Platform\MySql\Rewrite\LoadData\InputFormat(',', '"', '\\', '', "\n");
27        self::assertSame(['1', 'a,b', 'a"b', "line\nfeed", null, 'NULL', ''], (new RecordParser())->parseFields('1,"a,b","a""b",line\\nfeed,\\N,"NULL",', $format));
28    }
29
30    public function testFieldValue(): void
31    {
32        $parser = new RecordParser();
33        self::assertNull($parser->fieldValue('\\N', 'N', false, '', '\\'));
34        self::assertSame('N', $parser->fieldValue('\\N', 'N', true, '"', '\\'));
35        self::assertNull($parser->fieldValue('NULL', 'NULL', false, '"', '\\'));
36        self::assertNull($parser->fieldValue('NULL', 'NULL', false, '', ''));
37        self::assertSame('NULL', $parser->fieldValue('NULL', 'NULL', false, '', '\\'));
38        self::assertSame('value', $parser->fieldValue('value', 'value', false, '', '\\'));
39    }
40
41    public function testDecodeEscapeCase1(): void
42    {
43        $parser = new RecordParser();
44        $byte = '0';
45        $expected = "\x00";
46        self::assertSame($expected, $parser->decodeEscape($byte));
47    }
48
49    public function testDecodeEscapeCase2(): void
50    {
51        $parser = new RecordParser();
52        $byte = 'b';
53        $expected = "\x08";
54        self::assertSame($expected, $parser->decodeEscape($byte));
55    }
56
57    public function testDecodeEscapeCase3(): void
58    {
59        $parser = new RecordParser();
60        $byte = 'n';
61        $expected = "\n";
62        self::assertSame($expected, $parser->decodeEscape($byte));
63    }
64
65    public function testDecodeEscapeCase4(): void
66    {
67        $parser = new RecordParser();
68        $byte = 'r';
69        $expected = "\r";
70        self::assertSame($expected, $parser->decodeEscape($byte));
71    }
72
73    public function testDecodeEscapeCase5(): void
74    {
75        $parser = new RecordParser();
76        $byte = 't';
77        $expected = "\t";
78        self::assertSame($expected, $parser->decodeEscape($byte));
79    }
80
81    public function testDecodeEscapeCase6(): void
82    {
83        $parser = new RecordParser();
84        $byte = 'Z';
85        $expected = "\x1a";
86        self::assertSame($expected, $parser->decodeEscape($byte));
87    }
88
89    public function testDecodeEscapeCase7(): void
90    {
91        $parser = new RecordParser();
92        $byte = 'q';
93        $expected = 'q';
94        self::assertSame($expected, $parser->decodeEscape($byte));
95    }
96
97    public function testEnclosureWidth(): void
98    {
99        $parser = new RecordParser();
100        self::assertSame(2, $parser->enclosureWidth('"', true, '"'));
101        self::assertSame(1, $parser->enclosureWidth('"', false, '"'));
102        self::assertSame(1, $parser->enclosureWidth(null, true, '"'));
103        self::assertSame(1, $parser->enclosureWidth('x', true, '"'));
104    }
105
106}
107