diff -Nru php-zumba-json-serializer-3.0.2/.gitattributes php-zumba-json-serializer-3.2.1/.gitattributes --- php-zumba-json-serializer-3.0.2/.gitattributes 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/.gitattributes 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,5 @@ +/.gitattributes export-ignore +/.gitignore export-ignore +/.github export-ignore +/tests export-ignore +/phpunit.xml export-ignore diff -Nru php-zumba-json-serializer-3.0.2/.github/workflows/php.yml php-zumba-json-serializer-3.2.1/.github/workflows/php.yml --- php-zumba-json-serializer-3.0.2/.github/workflows/php.yml 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/.github/workflows/php.yml 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,35 @@ +name: JSON Serializer CI + +permissions: + contents: read + +on: + push: + pull_request: + +jobs: + testsuite: + runs-on: ubuntu-latest + strategy: + matrix: + php-version: ['7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3'] + name: PHP ${{ matrix.php-version }} + steps: + - uses: actions/checkout@v4 + - name: Validate composer.json and composer.lock + run: composer validate + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v3 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + - name: Install suggested dependencies + run: composer require jeremeamia/superclosure opis/closure + - name: Install dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: composer install --prefer-dist --no-progress --no-suggest + - name: Run test suite + run: vendor/bin/phpunit diff -Nru php-zumba-json-serializer-3.0.2/.gitignore php-zumba-json-serializer-3.2.1/.gitignore --- php-zumba-json-serializer-3.0.2/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/.gitignore 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,4 @@ +.idea +.phpunit.result.cache +vendor +composer.lock diff -Nru php-zumba-json-serializer-3.0.2/CHANGELOG.md php-zumba-json-serializer-3.2.1/CHANGELOG.md --- php-zumba-json-serializer-3.0.2/CHANGELOG.md 2022-12-07 14:14:45.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/CHANGELOG.md 2023-10-18 14:56:17.000000000 +0000 @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [3.1.0] - 2023-07-18 +### Added +- Support of UnitEnum and BackedEnum deserialization (PHP > 8.1). Thanks @marcimat +- Support to multiple closure serializers +- Built in closure serializer using opis/closure +### Fixed +- Fixed deprecated with DateTimeImmutable deserialization with PHP 8.2 + ## [3.0.0] - 2020-07-20 ### Fixed - Fixed DateTime & DateTimeImmutable serialization in PHP 7.4+. Thanks @przemyslaw-bogusz diff -Nru php-zumba-json-serializer-3.0.2/README.md php-zumba-json-serializer-3.2.1/README.md --- php-zumba-json-serializer-3.0.2/README.md 2022-12-07 14:14:45.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/README.md 2023-10-18 14:56:17.000000000 +0000 @@ -41,7 +41,7 @@ This project should not be confused with `JsonSerializable` interface added on PHP 5.4. This interface is used on `json_encode` to encode the objects. There is no unserialization with this interface, differently from this project. -*Json Serializer requires PHP >= 7.0 and tested until PHP 7.4* +*Json Serializer requires PHP >= 7.0 and tested until PHP 8.2* ## Example @@ -98,17 +98,16 @@ ``` -## Serializing Closures +## Serializing Closure -For serializing PHP closures you have to pass an object implementing `SuperClosure\SerializerInterface`. -This interface is provided by the project [SuperClosure](https://github.com/jeremeamia/super_closure). This -project also provides a closure serializer that implements this interface. +For serializing PHP closures you can either use [OpisClosure](https://github.com/opis/closure) (preferred) or +[SuperClosure](https://github.com/jeremeamia/super_closure) (the project is abandoned, so kept here for backward +compatibility). -Closure serialization has some limitations. Please check the SuperClosure project to check if it fits your -needs. +Closure serialization has some limitations. Please check the OpisClosure or SuperClosure project to check if it fits +your needs. -To use the SuperClosure with JsonSerializer, just pass the SuperClosure object as the first parameter -on JsonSerializer constructor. Example: +To use the OpisClosure with JsonSerializer, just add it to the closure serializer list. Example: ```php $toBeSerialized = [ @@ -122,13 +121,15 @@ } ]; -$superClosure = new SuperClosure\Serializer(); -$jsonSerializer = new Zumba\JsonSerializer\JsonSerializer($superClosure); +$jsonSerializer = new \Zumba\JsonSerializer\JsonSerializer(); +$jsonSerializer->addClosureSerializer(new \Zumba\JsonSerializer\ClosureSerializer\OpisClosureSerializer()); $serialized = $jsonSerializer->serialize($toBeSerialized); ``` -PS: JsonSerializer does not have a hard dependency of SuperClosure. If you want to use both projects -make sure you add both on your composer requirements. +You can load multiple closure serializers in case you are migrating from SuperClosure to OpisClosure for example. + +PS: JsonSerializer does not have a hard dependency of OpisClosure or SuperClosure. If you want to use both projects +make sure you add both on your composer requirements and load them with `addClosureSerializer()` method. ## Custom Serializers diff -Nru php-zumba-json-serializer-3.0.2/composer.json php-zumba-json-serializer-3.2.1/composer.json --- php-zumba-json-serializer-3.0.2/composer.json 2022-12-07 14:14:45.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/composer.json 2023-10-18 14:56:17.000000000 +0000 @@ -3,7 +3,7 @@ "type": "library", "description": "Serialize PHP variables, including objects, in JSON format. Support to unserialize it too.", "keywords": ["json", "serialize", "serializer"], - "homepage": "http://tech.zumba.com", + "homepage": "https://tech.zumba.com", "license": "MIT", "scripts": { "test": "phpunit --colors=always" @@ -23,21 +23,15 @@ "ext-mbstring": "*" }, "suggest": { - "jeremeamia/superclosure": "Allow to serialize PHP closures" + "opis/closure": "Allow to serialize PHP closures" }, "require-dev": { - "phpunit/phpunit": ">=6.0 <10.0" + "phpunit/phpunit": ">=6.0 <11.0" }, "autoload": { "psr-4": { "Zumba\\": "src/", "Zumba\\JsonSerializer\\Test\\": "tests/" } - }, - "archive": { - "exclude": [ - "/tests", - "/phpunit.xml" - ] } } diff -Nru php-zumba-json-serializer-3.0.2/debian/changelog php-zumba-json-serializer-3.2.1/debian/changelog --- php-zumba-json-serializer-3.0.2/debian/changelog 2022-12-16 20:20:56.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/debian/changelog 2024-04-19 22:58:31.000000000 +0000 @@ -1,8 +1,31 @@ -php-zumba-json-serializer (3.0.2-1+jammy1) jammy; urgency=medium +php-zumba-json-serializer (3.2.1-1+jammy1) jammy; urgency=medium - * All changes for 3.0.2-1 + * No changes from 3.2.1-1 - -- William Desportes Fri, 16 Dec 2022 21:20:56 +0100 + -- William Desportes Sat, 20 Apr 2024 00:58:31 +0200 + +php-zumba-json-serializer (3.2.1-1) unstable; urgency=medium + + * New upstream version 3.2.1 + + -- William Desportes Wed, 18 Oct 2023 20:08:41 +0200 + +php-zumba-json-serializer (3.2.0-1) unstable; urgency=medium + + * Use git mode in d/watch + * New upstream version 3.2.0 + * Drop phpunit 10 patch + * Add php-opis-closure to B-Depends and DEP-8 tests + + -- William Desportes Tue, 26 Sep 2023 10:58:18 +0200 + +php-zumba-json-serializer (3.0.2-2) unstable; urgency=medium + + * Add a patch for phpunit 10 + * Update Standards-Version to 4.6.2 + * Update the description and short description (Closes: #1052400) + + -- William Desportes Sat, 23 Sep 2023 11:05:39 +0200 php-zumba-json-serializer (3.0.2-1) unstable; urgency=medium diff -Nru php-zumba-json-serializer-3.0.2/debian/control php-zumba-json-serializer-3.2.1/debian/control --- php-zumba-json-serializer-3.0.2/debian/control 2022-12-16 20:20:56.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/debian/control 2024-04-19 22:58:12.000000000 +0000 @@ -4,10 +4,11 @@ Maintainer: William Desportes Build-Depends: debhelper-compat (= 13), dh-sequence-phpcomposer, + php-opis-closure, phpab, phpunit, pkg-php-tools (>= 1.41~) -Standards-Version: 4.6.1 +Standards-Version: 4.6.2 Homepage: https://github.com/zumba/json-serializer Vcs-Browser: https://salsa.debian.org/php-team/pear/php-zumba-json-serializer Vcs-Git: https://salsa.debian.org/php-team/pear/php-zumba-json-serializer.git -b debian/latest @@ -17,7 +18,7 @@ Architecture: all Multi-Arch: foreign Depends: ${misc:Depends}, ${phpcomposer:Debian-require} -Description: Json Serializer is a PHP library to serialize PHP variables in JSON format +Description: Library to serialize PHP variables in JSON format Json Serializer is similar to the serialize() function in PHP, you can also un-serialize the JSON generated by this tool - and have you PHP content back. + and have the PHP content back. diff -Nru php-zumba-json-serializer-3.0.2/debian/gbp.conf php-zumba-json-serializer-3.2.1/debian/gbp.conf --- php-zumba-json-serializer-3.0.2/debian/gbp.conf 2022-07-26 22:17:29.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/debian/gbp.conf 2024-04-19 22:58:12.000000000 +0000 @@ -1,2 +1,5 @@ [DEFAULT] +filter = [ '.gitattributes', '.gitignore', '.github' ] +sign-tags = True +pristine-tar = True debian-branch = debian/latest diff -Nru php-zumba-json-serializer-3.0.2/debian/tests/control php-zumba-json-serializer-3.2.1/debian/tests/control --- php-zumba-json-serializer-3.0.2/debian/tests/control 2022-12-16 20:20:56.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/debian/tests/control 2024-04-19 22:58:12.000000000 +0000 @@ -1,2 +1,2 @@ Tests: run-upstream-tests -Depends: phpab, phpunit, pkg-php-tools (>= 1.41~), @ +Depends: php-opis-closure, phpab, phpunit, pkg-php-tools (>= 1.41~), @ diff -Nru php-zumba-json-serializer-3.0.2/debian/watch php-zumba-json-serializer-3.2.1/debian/watch --- php-zumba-json-serializer-3.0.2/debian/watch 2022-07-26 22:17:29.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/debian/watch 2024-04-19 22:58:12.000000000 +0000 @@ -1,3 +1,4 @@ version=4 -opts=filenamemangle=s/.+\/(\d\S+)\.tar\.gz/zumba-json-serializer-$1\.tar\.gz/ \ - https://github.com/zumba/json-serializer/tags .*/(\d\S+)\.tar\.gz +options="mode=git, gitmode=full, gitexport=all, pgpmode=none" \ + https://github.com/zumba/json-serializer/ \ + refs/tags/([\d\.]+) diff -Nru php-zumba-json-serializer-3.0.2/src/JsonSerializer/ClosureSerializer/ClosureSerializer.php php-zumba-json-serializer-3.2.1/src/JsonSerializer/ClosureSerializer/ClosureSerializer.php --- php-zumba-json-serializer-3.0.2/src/JsonSerializer/ClosureSerializer/ClosureSerializer.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/src/JsonSerializer/ClosureSerializer/ClosureSerializer.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,25 @@ +closureSerializer[$classname] = $closureSerializer; + return $this; + } + + /** + * Get preferred closure serializer + * + * @return ClosureSerializer|null + */ + public function getPreferredSerializer() + { + if (empty($this->closureSerializer)) { + return null; + } + + foreach ($this->preferred as $preferred) { + if (isset($this->closureSerializer[$preferred])) { + return $this->closureSerializer[$preferred]; + } + } + return current($this->closureSerializer); + } + + /** + * Get closure serializer + * + * @param string $classname + * @return ClosureSerializer|null + */ + public function getSerializer(string $classname) + { + if (isset($this->closureSerializer[$classname])) { + return $this->closureSerializer[$classname]; + } + return null; + } +} diff -Nru php-zumba-json-serializer-3.0.2/src/JsonSerializer/ClosureSerializer/OpisClosureSerializer.php php-zumba-json-serializer-3.2.1/src/JsonSerializer/ClosureSerializer/OpisClosureSerializer.php --- php-zumba-json-serializer-3.0.2/src/JsonSerializer/ClosureSerializer/OpisClosureSerializer.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/src/JsonSerializer/ClosureSerializer/OpisClosureSerializer.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,32 @@ +getClosure(); + } + +} diff -Nru php-zumba-json-serializer-3.0.2/src/JsonSerializer/ClosureSerializer/SuperClosureSerializer.php php-zumba-json-serializer-3.2.1/src/JsonSerializer/ClosureSerializer/SuperClosureSerializer.php --- php-zumba-json-serializer-3.0.2/src/JsonSerializer/ClosureSerializer/SuperClosureSerializer.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/src/JsonSerializer/ClosureSerializer/SuperClosureSerializer.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,49 @@ +serializer = $serializer; + } + + /** + * Serialize a closure + * + * @param Closure $closure + * @return string + */ + public function serialize(Closure $closure) + { + return $this->serializer->serialize($closure); + } + + /** + * Unserialize a closure + * + * @param string $serialized + * @return Closure + */ + public function unserialize($serialized) + { + return $this->serializer->unserialize($serialized); + } + +} diff -Nru php-zumba-json-serializer-3.0.2/src/JsonSerializer/JsonSerializer.php php-zumba-json-serializer-3.2.1/src/JsonSerializer/JsonSerializer.php --- php-zumba-json-serializer-3.0.2/src/JsonSerializer/JsonSerializer.php 2022-12-07 14:14:45.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/src/JsonSerializer/JsonSerializer.php 2023-10-18 14:56:17.000000000 +0000 @@ -49,11 +49,11 @@ protected $objectMappingIndex = 0; /** - * Closure serializer instance + * Closure manager * - * @var ClosureSerializerInterface + * @var ClosureSerializer\ClosureSerializerManager */ - protected $closureSerializer; + protected $closureManager; /** * Map of custom object serializers @@ -72,18 +72,34 @@ /** * Constructor. * - * @param ClosureSerializerInterface $closureSerializer + * @param ClosureSerializerInterface $closureSerializer This parameter is deprecated and will be removed in 5.0.0. Use addClosureSerializer() instead. * @param array $customObjectSerializerMap */ public function __construct( ClosureSerializerInterface $closureSerializer = null, $customObjectSerializerMap = [] ) { - $this->closureSerializer = $closureSerializer; + $this->closureManager = new ClosureSerializer\ClosureSerializerManager(); + if ($closureSerializer) { + trigger_error( + 'Passing a ClosureSerializerInterface to the constructor is deprecated and will be removed in 4.0.0. Use addClosureSerializer() instead.', + E_USER_DEPRECATED + ); + $this->addClosureSerializer(new ClosureSerializer\SuperClosureSerializer($closureSerializer)); + } + $this->customObjectSerializerMap = (array)$customObjectSerializerMap; } /** + * Add a closure serializer + */ + public function addClosureSerializer(ClosureSerializer\ClosureSerializer $closureSerializer) + { + $this->closureManager->addSerializer($closureSerializer); + } + + /** * Serialize the value in JSON * * @param mixed $value @@ -242,12 +258,15 @@ return array_map([$this, __FUNCTION__], $value); } if ($value instanceof \Closure) { - if (!$this->closureSerializer) { + $closureSerializer = $this->closureManager->getPreferredSerializer(); + if (!$closureSerializer) { throw new JsonSerializerException('Closure serializer not given. Unable to serialize closure.'); } return [ static::CLOSURE_IDENTIFIER_KEY => true, - 'value' => $this->closureSerializer->serialize($value) + // Keep BC compat to PHP 7: Don't use "::class" on dynamic class names + 'serializer' => get_class($closureSerializer), + 'value' => $closureSerializer->serialize($value) ]; } return $this->serializeObject($value); @@ -349,10 +368,12 @@ } if (!empty($value[static::CLOSURE_IDENTIFIER_KEY])) { - if (!$this->closureSerializer) { + $serializerClass = isset($value['serializer']) ? $value['serializer'] : ClosureSerializer\SuperClosureSerializer::class; + $serializer = $this->closureManager->getSerializer($serializerClass); + if (!$serializer) { throw new JsonSerializerException('Closure serializer not provided to unserialize closure'); } - return $this->closureSerializer->unserialize($value['value']); + return $serializer->unserialize($value['value']); } return array_map([$this, __FUNCTION__], $value); @@ -428,11 +449,17 @@ throw new JsonSerializerException('Unable to find class ' . $className); } - if ($className === 'DateTime') { + if ($className === 'DateTime' || $className === 'DateTimeImmutable') { $obj = $this->restoreUsingUnserialize($className, $value); $this->objectMapping[$this->objectMappingIndex++] = $obj; return $obj; } + + if (is_subclass_of($className, \UnitEnum::class)) { + $obj = constant("$className::{$value['name']}"); + $this->objectMapping[$this->objectMappingIndex++] = $obj; + return $obj; + } if (!$this->isSplList($className)) { $ref = new ReflectionClass($className); diff -Nru php-zumba-json-serializer-3.0.2/tests/ClosureSerializer/ClosureSerializerManagerTest.php php-zumba-json-serializer-3.2.1/tests/ClosureSerializer/ClosureSerializerManagerTest.php --- php-zumba-json-serializer-3.0.2/tests/ClosureSerializer/ClosureSerializerManagerTest.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/tests/ClosureSerializer/ClosureSerializerManagerTest.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,33 @@ +markTestSkipped('Missing jeremeamia/superclosure to run this test'); + } + } + + public function testAddSerializer() { + $manager = new ClosureSerializerManager(); + $this->assertEmpty($manager->getSerializer('foo')); + $manager->addSerializer(new SuperClosureSerializer(new \SuperClosure\Serializer())); + $this->assertNotEmpty($manager->getSerializer(SuperClosureSerializer::class)); + } + + public function testGetPreferredSerializer() { + $manager = new ClosureSerializerManager(); + $this->assertNull($manager->getPreferredSerializer()); + + $serializer = new SuperClosureSerializer(new \SuperClosure\Serializer()); + $manager->addSerializer($serializer); + $this->assertSame($serializer, $manager->getPreferredSerializer()); + } +} diff -Nru php-zumba-json-serializer-3.0.2/tests/ClosureSerializer/OpisClosureSerializerTest.php php-zumba-json-serializer-3.2.1/tests/ClosureSerializer/OpisClosureSerializerTest.php --- php-zumba-json-serializer-3.0.2/tests/ClosureSerializer/OpisClosureSerializerTest.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/tests/ClosureSerializer/OpisClosureSerializerTest.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,39 @@ +markTestSkipped('Missing opis/closure to run this test'); + } + } + + public function testSerialize() { + $closure = function() { + return 'foo'; + }; + $serializer = new OpisClosureSerializer(); + $serialized = $serializer->serialize($closure); + $this->assertNotEmpty($serialized); + $this->assertTrue(is_string($serialized)); + $this->assertNotEquals($closure, $serialized); + } + + public function testUnserialize() { + $closure = function() { + return 'foo'; + }; + $serializer = new OpisClosureSerializer(); + $serialized = $serializer->serialize($closure); + $unserialized = $serializer->unserialize($serialized); + $this->assertNotEmpty($unserialized); + $this->assertTrue($unserialized instanceof \Closure); + $this->assertEquals($closure(), $unserialized()); + } +} diff -Nru php-zumba-json-serializer-3.0.2/tests/ClosureSerializer/SuperClosureSerializerTest.php php-zumba-json-serializer-3.2.1/tests/ClosureSerializer/SuperClosureSerializerTest.php --- php-zumba-json-serializer-3.0.2/tests/ClosureSerializer/SuperClosureSerializerTest.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/tests/ClosureSerializer/SuperClosureSerializerTest.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,39 @@ +markTestSkipped('Missing jeremeamia/superclosure to run this test'); + } + } + + public function testSerialize() { + $closure = function() { + return 'foo'; + }; + $serializer = new SuperClosureSerializer(new \SuperClosure\Serializer()); + $serialized = $serializer->serialize($closure); + $this->assertNotEmpty($serialized); + $this->assertTrue(is_string($serialized)); + $this->assertNotEquals($closure, $serialized); + } + + public function testUnserialize() { + $closure = function() { + return 'foo'; + }; + $serializer = new SuperClosureSerializer(new \SuperClosure\Serializer()); + $serialized = $serializer->serialize($closure); + $unserialized = $serializer->unserialize($serialized); + $this->assertNotEmpty($unserialized); + $this->assertTrue($unserialized instanceof \Closure); + $this->assertEquals($closure(), $unserialized()); + } +} diff -Nru php-zumba-json-serializer-3.0.2/tests/JsonSerializerTest.php php-zumba-json-serializer-3.2.1/tests/JsonSerializerTest.php --- php-zumba-json-serializer-3.0.2/tests/JsonSerializerTest.php 2022-12-07 14:14:45.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/tests/JsonSerializerTest.php 2023-10-18 14:56:17.000000000 +0000 @@ -2,10 +2,11 @@ namespace Zumba\JsonSerializer\Test; +use Zumba\JsonSerializer\ClosureSerializer; use Zumba\JsonSerializer\JsonSerializer; use Zumba\JsonSerializer\Exception\JsonSerializerException; use stdClass; -use SuperClosure\Serializer as ClosureSerializer; +use SuperClosure\Serializer as SuperClosureSerializer; use PHPUnit\Framework\TestCase; use ReflectionProperty; @@ -80,10 +81,8 @@ /** * List of scalar data - * - * @return array */ - public function scalarData() + public static function scalarData(): array { return array( array('testing', '"testing"'), @@ -155,10 +154,8 @@ /** * List of array data - * - * @return array */ - public function arrayNoObjectData() + public static function arrayNoObjectData(): array { return array( array(array(1, 2, 3), '[1,2,3]'), @@ -240,6 +237,146 @@ $this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportClasses\EmptyClass', $array['instance']); } + + /** + * Test serialization of Enums + * + * @return void + */ + public function testSerializeEnums() + { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped("Enums are only available since PHP 8.1"); + } + + $unitEnum = SupportEnums\MyUnitEnum::Hearts; + $expected = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"}'; + $this->assertSame($expected, $this->serializer->serialize($unitEnum)); + + $backedEnum = SupportEnums\MyBackedEnum::Hearts; + $expected = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"}'; + $this->assertSame($expected, $this->serializer->serialize($backedEnum)); + + $intBackedEnum = SupportEnums\MyIntBackedEnum::One; + $expected = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"One","value":1}'; + $this->assertSame($expected, $this->serializer->serialize($intBackedEnum)); + } + + /** + * Test serialization of multiple Enums + * + * @return void + */ + public function testSerializeMultipleEnums() + { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped("Enums are only available since PHP 8.1"); + } + + $obj = new stdClass(); + $obj->enum1 = SupportEnums\MyUnitEnum::Hearts; + $obj->enum2 = SupportEnums\MyBackedEnum::Hearts; + $obj->enum3 = SupportEnums\MyIntBackedEnum::One; + $obj->enum4 = SupportEnums\MyUnitEnum::Hearts; + $obj->enum5 = SupportEnums\MyBackedEnum::Hearts; + $obj->enum6 = SupportEnums\MyIntBackedEnum::One; + + $expected = '{"@type":"stdClass","enum1":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"},"enum2":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"},"enum3":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"One","value":1},"enum4":{"@type":"@1"},"enum5":{"@type":"@2"},"enum6":{"@type":"@3"}}'; + $this->assertSame($expected, $this->serializer->serialize($obj)); + } + + /** + * Test unserialization of Enums + * + * @return void + */ + public function testUnserializeEnums() + { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped("Enums are only available since PHP 8.1"); + } + + $serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"}'; + $obj = $this->serializer->unserialize($serialized); + $this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyUnitEnum', $obj); + $this->assertSame(SupportEnums\MyUnitEnum::Hearts, $obj); + + $serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"}'; + $obj = $this->serializer->unserialize($serialized); + $this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyBackedEnum', $obj); + $this->assertSame(SupportEnums\MyBackedEnum::Hearts, $obj); + + $serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"Two","value":2}'; + $obj = $this->serializer->unserialize($serialized); + $this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyIntBackedEnum', $obj); + $this->assertSame(SupportEnums\MyIntBackedEnum::Two, $obj); + $this->assertSame(SupportEnums\MyIntBackedEnum::Two->value, $obj->value); + + // wrong value of BackedEnum is ignored + $serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"S"}'; + $obj = $this->serializer->unserialize($serialized); + $this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyBackedEnum', $obj); + $this->assertSame(SupportEnums\MyBackedEnum::Hearts, $obj); + $this->assertSame(SupportEnums\MyBackedEnum::Hearts->value, $obj->value); + } + + /** + * Test unserialization of multiple Enums + * + * @return void + */ + public function testUnserializeMultipleEnums() + { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped("Enums are only available since PHP 8.1"); + } + + $obj = new stdClass(); + $obj->enum1 = SupportEnums\MyUnitEnum::Hearts; + $obj->enum2 = SupportEnums\MyBackedEnum::Hearts; + $obj->enum3 = SupportEnums\MyIntBackedEnum::One; + $obj->enum4 = SupportEnums\MyUnitEnum::Hearts; + $obj->enum5 = SupportEnums\MyBackedEnum::Hearts; + $obj->enum6 = SupportEnums\MyIntBackedEnum::One; + + $serialized = '{"@type":"stdClass","enum1":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"},"enum2":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"},"enum3":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"One","value":1},"enum4":{"@type":"@1"},"enum5":{"@type":"@2"},"enum6":{"@type":"@3"}}'; + $actualObj = $this->serializer->unserialize($serialized); + $this->assertInstanceOf('stdClass', $actualObj); + $this->assertEquals($obj, $actualObj); + } + + /** + * Test unserialization of wrong UnitEnum + * + * @return void + */ + public function testUnserializeWrongUnitEnum() { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped("Enums are only available since PHP 8.1"); + } + + // bad case generate Error + $serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Circles"}'; + $this->expectException(\Error::class); + $this->serializer->unserialize($serialized); + } + + /** + * Test unserialization of wrong BackedEnum + * + * @return void + */ + public function testUnserializeWrongBackedEnum() { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped("Enums are only available since PHP 8.1"); + } + + // bad case generate Error + $serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Circles","value":"C"}'; + $this->expectException(\Error::class); + $this->serializer->unserialize($serialized); + } + /** * Test serialization of objects using the custom serializers * @@ -296,6 +433,10 @@ $date = new \DateTime('2014-06-15 12:00:00', new \DateTimeZone('UTC')); $obj = $this->serializer->unserialize($this->serializer->serialize($date)); $this->assertSame($date->getTimestamp(), $obj->getTimestamp()); + + $date = new \DateTimeImmutable('2014-06-15 12:00:00', new \DateTimeZone('UTC')); + $obj = $this->serializer->unserialize($this->serializer->serialize($date)); + $this->assertSame($date->getTimestamp(), $obj->getTimestamp()); } /** @@ -303,13 +444,13 @@ * * @return void */ - public function testSerializationOfClosure() + public function testSerializationOfClosureWithSuperClosureOnConstructor() { if (!class_exists('SuperClosure\Serializer')) { $this->markTestSkipped('SuperClosure is not installed.'); } - $closureSerializer = new ClosureSerializer(); + $closureSerializer = new SuperClosureSerializer(); $serializer = new JsonSerializer($closureSerializer); $serialized = $serializer->serialize( array( @@ -328,6 +469,111 @@ } /** + * Test the serialization of closures providing closure serializer + * + * @return void + */ + public function testSerializationOfClosureWithSuperClosureOnManager() + { + if (!class_exists('SuperClosure\Serializer')) { + $this->markTestSkipped('SuperClosure is not installed.'); + } + + $closureSerializer = new SuperClosureSerializer(); + $serializer = new JsonSerializer(); + $serializer->addClosureSerializer(new ClosureSerializer\SuperClosureSerializer($closureSerializer)); + $serialized = $serializer->serialize( + array( + 'func' => function () { + return 'it works'; + }, + 'nice' => true + ) + ); + + $unserialized = $serializer->unserialize($serialized); + $this->assertTrue(is_array($unserialized)); + $this->assertTrue($unserialized['nice']); + $this->assertInstanceOf('Closure', $unserialized['func']); + $this->assertSame('it works', $unserialized['func']()); + } + + /** + * Test the serialization of closures providing closure serializer + * + * @return void + */ + public function testSerializationOfClosureWitOpisClosure() + { + if (!class_exists('Opis\Closure\SerializableClosure')) { + $this->markTestSkipped('OpisClosure is not installed.'); + } + + $serializer = new JsonSerializer(); + $serializer->addClosureSerializer(new ClosureSerializer\OpisClosureSerializer()); + $serialized = $serializer->serialize( + array( + 'func' => function () { + return 'it works'; + }, + 'nice' => true + ) + ); + + $unserialized = $serializer->unserialize($serialized); + $this->assertTrue(is_array($unserialized)); + $this->assertTrue($unserialized['nice']); + $this->assertInstanceOf('Closure', $unserialized['func']); + $this->assertSame('it works', $unserialized['func']()); + } + + /** + * Test the serialization of closures providing closure serializer + * + * @return void + */ + public function testSerializationOfClosureWitMultipleClosures() + { + if (!class_exists('SuperClosure\Serializer')) { + $this->markTestSkipped('SuperClosure is not installed.'); + } + if (!class_exists('Opis\Closure\SerializableClosure')) { + $this->markTestSkipped('OpisClosure is not installed.'); + } + + $closureSerializer = new SuperClosureSerializer(); + $serializer = new JsonSerializer(); + $serializer->addClosureSerializer(new ClosureSerializer\SuperClosureSerializer($closureSerializer)); + + $serializeData = array( + 'func' => function () { + return 'it works'; + }, + 'nice' => true + ); + + // Make sure it was serialized with SuperClosure + $serialized = $serializer->serialize($serializeData); + echo $serialized; + $this->assertGreaterThanOrEqual(0, strpos($serialized, 'SuperClosure')); + $this->assertFalse(strpos($serialized, 'OpisClosure')); + + // Test adding a new preferred closure serializer + $serializer->addClosureSerializer(new ClosureSerializer\OpisClosureSerializer()); + + $unserialized = $serializer->unserialize($serialized); + $this->assertTrue(is_array($unserialized)); + $this->assertTrue($unserialized['nice']); + $this->assertInstanceOf('Closure', $unserialized['func']); + $this->assertSame('it works', $unserialized['func']()); + + // Serialize again with the new preferred closure serializer + $serialized = $serializer->serialize($serializeData); + $this->assertFalse(strpos($serialized, 'SuperClosure')); + $this->assertGreaterThanOrEqual(0, strpos($serialized, 'OpisClosure')); + } + + /** * Test the unserialization of closures without providing closure serializer * * @return void @@ -338,7 +584,7 @@ $this->markTestSkipped('SuperClosure is not installed.'); } - $closureSerializer = new ClosureSerializer(); + $closureSerializer = new SuperClosureSerializer(); $serializer = new JsonSerializer($closureSerializer); $serialized = $serializer->serialize( array( diff -Nru php-zumba-json-serializer-3.0.2/tests/SupportEnums/MyBackedEnum.php php-zumba-json-serializer-3.2.1/tests/SupportEnums/MyBackedEnum.php --- php-zumba-json-serializer-3.0.2/tests/SupportEnums/MyBackedEnum.php 1970-01-01 00:00:00.000000000 +0000 +++ php-zumba-json-serializer-3.2.1/tests/SupportEnums/MyBackedEnum.php 2023-10-18 14:56:17.000000000 +0000 @@ -0,0 +1,11 @@ +