From d14c37b228c9e921e608dcb5408fef1bd424350f Mon Sep 17 00:00:00 2001 From: George Steel Date: Wed, 28 Sep 2022 13:19:38 +0100 Subject: [PATCH] Add tests to cover `AbstractUnicode` fixing undefined offset error This test case has been added to document that `AbstractUnicode` lower cases it's encoding option. Also discovered that an undefined index would be caused by accessing the encoding option when no default had been set. Signed-off-by: George Steel --- src/AbstractUnicode.php | 6 ++- test/AbstractUnicodeTest.php | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 test/AbstractUnicodeTest.php diff --git a/src/AbstractUnicode.php b/src/AbstractUnicode.php index 616bcec6..9ebd33b4 100644 --- a/src/AbstractUnicode.php +++ b/src/AbstractUnicode.php @@ -5,8 +5,10 @@ namespace Laminas\Filter; use function array_map; +use function assert; use function function_exists; use function in_array; +use function is_string; use function mb_internal_encoding; use function mb_list_encodings; use function sprintf; @@ -53,7 +55,9 @@ public function setEncoding($encoding = null) */ public function getEncoding() { - if ($this->options['encoding'] === null && function_exists('mb_internal_encoding')) { + $encoding = $this->options['encoding'] ?? null; + assert($encoding === null || is_string($encoding)); + if ($encoding === null && function_exists('mb_internal_encoding')) { $this->options['encoding'] = mb_internal_encoding(); } diff --git a/test/AbstractUnicodeTest.php b/test/AbstractUnicodeTest.php new file mode 100644 index 00000000..c00f25d4 --- /dev/null +++ b/test/AbstractUnicodeTest.php @@ -0,0 +1,72 @@ +filter = new class extends AbstractUnicode { + /** @param mixed $value */ + public function filter($value): string + { + assert(is_string($value)); + return strtolower($value); + } + }; + } + + /** @return list */ + public function encodingProvider(): array + { + return [ + ['ISO-8859-16', 'iso-8859-16'], + ['UTF-8', 'utf-8'], + ['Windows-1251', 'windows-1251'], + ]; + } + + /** @dataProvider encodingProvider */ + public function testThatEncodingOptionIsLowerCased(string $encoding, string $expectedEncoding): void + { + $this->filter->setEncoding($encoding); + self::assertNotSame($encoding, $this->filter->getEncoding()); + self::assertSame($expectedEncoding, $this->filter->getEncoding()); + } + + public function testThatAnUnSupportedEncodingCausesAnException(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Encoding \'goats\' is not supported by mbstring extension'); + + $this->filter->setEncoding('Goats'); + } + + public function testThatMbStringInternalEncodingIsReturnedWhenEncodingHasNotBeenSpecified(): void + { + $expect = mb_internal_encoding(); + self::assertSame($expect, $this->filter->getEncoding()); + } + + public function testThatExplicitlySettingEncodingToNullWillYieldDefaultEncoding(): void + { + $this->filter->setEncoding(null); + self::assertSame(mb_internal_encoding(), $this->filter->getEncoding()); + } +}