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