assertSame('a#b', HtmlEntity::decode('a#b')); } public function testDecimalMultibyte() { $this->assertSame("a\u{04D2}b", HtmlEntity::decode('aӒb')); } public function testHexLowercase() { $this->assertSame("a\u{0CAB}b", HtmlEntity::decode('aಫb')); } public function testHexUppercase() { $this->assertSame("a\u{0D06}b", HtmlEntity::decode('aആb')); } public function testZeroMapsToReplacement() { $this->assertSame("a\u{FFFD}b", HtmlEntity::decode('a�b')); } public function testSurrogateMapsToReplacement() { $this->assertSame("a\u{FFFD}b", HtmlEntity::decode('a�b')); } public function testOverflowMapsToReplacement() { $this->assertSame("a\u{FFFD}b", HtmlEntity::decode('a�b')); } public function testMaxValidCodepoint() { $this->assertSame( 'a' . Unicode::toUtf8([0x10FFFF]) . 'b', HtmlEntity::decode('a􏿿b') ); } public function testNamedAmp() { $this->assertSame('a&b', HtmlEntity::decode('a&b')); } public function testNamedCopy() { $this->assertSame("a\u{00A9}b", HtmlEntity::decode('a©b')); } public function testNamedAElig() { $this->assertSame("a\u{00C6}b", HtmlEntity::decode('aÆb')); } public function testNamedNbsp() { $this->assertSame("a\u{00A0}b", HtmlEntity::decode('a b')); } public function testNamedMultiCodepoint() { // ≧̸ -> U+2267 + U+0338 (combining solidus) $this->assertSame("a\u{2267}\u{0338}b", HtmlEntity::decode('a≧̸b')); } public function testUnknownNameStaysLiteral() { $this->assertSame('a&MadeUpEntity;b', HtmlEntity::decode('a&MadeUpEntity;b')); } public function testNoSemicolonStaysLiteral() { $this->assertSame('a© b', HtmlEntity::decode('a© b')); } public function testTooManyDecimalDigitsStaysLiteral() { $this->assertSame('a�b', HtmlEntity::decode('a�b')); } public function testHexLetterAfterAmpStaysLiteral() { $this->assertSame('a&#abcdef0;b', HtmlEntity::decode('a&#abcdef0;b')); } public function testEmptyEntityStaysLiteral() { $this->assertSame('a&#;b', HtmlEntity::decode('a&#;b')); } public function testMultipleEntitiesInSequence() { $this->assertSame( "#\u{04D2}\u{00A9}", HtmlEntity::decode('#Ӓ©') ); } public function testNonEntityBytesPassThrough() { $this->assertSame('plain text without entities', HtmlEntity::decode('plain text without entities')); } public function testEmptyInput() { $this->assertSame('', HtmlEntity::decode('')); } }