diff --git a/src/Serializer.php b/src/Serializer.php index 8465f8d..45aa7ef 100644 --- a/src/Serializer.php +++ b/src/Serializer.php @@ -77,14 +77,14 @@ private static function serializeBareItem($value): string return self::serializeInteger($value); } elseif (is_float($value)) { return self::serializeDecimal($value); - } elseif (is_string($value)) { - return self::serializeString($value); - } elseif ($value instanceof Token) { - return self::serializeToken($value); } elseif (is_bool($value)) { return self::serializeBoolean($value); + } elseif ($value instanceof Token) { + return self::serializeToken($value); } elseif ($value instanceof Bytes) { return self::serializeByteSequence($value); + } elseif (is_string($value) || (is_object($value) && method_exists($value, '__toString'))) { + return self::serializeString($value); } throw new SerializeException("Unrecognized type"); diff --git a/tests/SerializeStringTest.php b/tests/SerializeStringTest.php index 00f1a02..5a3ae24 100644 --- a/tests/SerializeStringTest.php +++ b/tests/SerializeStringTest.php @@ -15,7 +15,35 @@ class SerializeStringTest extends TestCase public function testInvalidCharacter() { $this->expectException(SerializeException::class); + $this->expectExceptionMessage("Invalid characters in string"); Serializer::serializeItem("🙁"); } + + public function testStringableObject() + { + $stringable = new class { + public function __toString(): string + { + return "Don't Panic"; + } + }; + + $this->assertEquals('"Don\'t Panic"', Serializer::serializeItem($stringable)); + } + + public function testInvalidStringableObject() + { + $this->expectException(SerializeException::class); + $this->expectExceptionMessage("Invalid characters in string"); + + $stringable = new class { + public function __toString(): string + { + return "🙁"; + } + }; + + Serializer::serializeItem($stringable); + } }