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()); + } +}