From 760354d533b01dad96b430b27ccdf03396fa9ed7 Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Fri, 14 Jun 2019 18:55:27 +0200 Subject: [PATCH] [Serializer] Add CsvEncoder tests for PHP 7.4 --- .../Serializer/Encoder/CsvEncoder.php | 6 ++- .../Tests/Encoder/CsvEncoderTest.php | 44 +++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php b/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php index 79abf30ea5..239144d80f 100644 --- a/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php +++ b/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php @@ -39,8 +39,12 @@ class CsvEncoder implements EncoderInterface, DecoderInterface * @param string $escapeChar * @param string $keySeparator */ - public function __construct($delimiter = ',', $enclosure = '"', $escapeChar = '\\', $keySeparator = '.') + public function __construct($delimiter = ',', $enclosure = '"', $escapeChar = '', $keySeparator = '.') { + if ('' === $escapeChar && \PHP_VERSION_ID < 70400) { + $escapeChar = '\\'; + } + $this->delimiter = $delimiter; $this->enclosure = $enclosure; $this->escapeChar = $escapeChar; diff --git a/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php b/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php index 7b5131cb53..4faf42d2ec 100644 --- a/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php @@ -36,15 +36,51 @@ class CsvEncoderTest extends TestCase 'int' => 2, 'false' => false, 'true' => true, + 'int_one' => 1, + 'string_one' => '1', ]; // Check that true and false are appropriately handled - $this->assertEquals(<<<'CSV' -string,int,false,true -foo,2,0,1 + $this->assertSame($csv = <<<'CSV' +string,int,false,true,int_one,string_one +foo,2,0,1,1,1 CSV - , $this->encoder->encode($data, 'csv')); + , $this->encoder->encode($data, 'csv')); + + $this->assertSame([ + 'string' => 'foo', + 'int' => '2', + 'false' => '0', + 'true' => '1', + 'int_one' => '1', + 'string_one' => '1', + ], $this->encoder->decode($csv, 'csv')); + } + + /** + * @requires PHP 7.4 + */ + public function testDoubleQuotesAndSlashes() + { + $this->assertSame($csv = <<<'CSV' +0,1,2,3,4,5 +,"""","foo""","\""",\,foo\ + +CSV + , $this->encoder->encode($data = ['', '"', 'foo"', '\\"', '\\', 'foo\\'], 'csv')); + + $this->assertSame($data, $this->encoder->decode($csv, 'csv')); + } + + /** + * @requires PHP 7.4 + */ + public function testSingleSlash() + { + $this->assertSame($csv = "0\n\\\n", $this->encoder->encode($data = ['\\'], 'csv')); + $this->assertSame($data, $this->encoder->decode($csv, 'csv')); + $this->assertSame($data, $this->encoder->decode(trim($csv), 'csv')); } public function testSupportEncoding()