diff --git a/tests/Unit/Fixture/CovariantTemplate.php b/tests/Unit/Fixture/CovariantTemplate.php new file mode 100644 index 0000000..6b00958 --- /dev/null +++ b/tests/Unit/Fixture/CovariantTemplate.php @@ -0,0 +1,19 @@ + $objects */ + public function __construct( + #[ArrayNormalizer(new ObjectNormalizer())] + public array $objects, + ) { + } +} diff --git a/tests/Unit/MetadataHydratorTest.php b/tests/Unit/MetadataHydratorTest.php index 88b66a7..dca4aee 100644 --- a/tests/Unit/MetadataHydratorTest.php +++ b/tests/Unit/MetadataHydratorTest.php @@ -23,6 +23,7 @@ use Patchlevel\Hydrator\Tests\Unit\Fixture\Circle2Dto; use Patchlevel\Hydrator\Tests\Unit\Fixture\Circle3Dto; use Patchlevel\Hydrator\Tests\Unit\Fixture\ContextAwareDto; +use Patchlevel\Hydrator\Tests\Unit\Fixture\CovariantTemplate; use Patchlevel\Hydrator\Tests\Unit\Fixture\DefaultDto; use Patchlevel\Hydrator\Tests\Unit\Fixture\DtoWithHooks; use Patchlevel\Hydrator\Tests\Unit\Fixture\Email; @@ -666,4 +667,18 @@ public function guess(ObjectType $type): Normalizer|null self::assertSame(4, $guesser->count); } + + public function testTypesWithCovariantTemplatesCanBeSerialisedAndHydrated(): void + { + $object = new CovariantTemplate([ + (object)['foo' => 1], + (object)['foo' => 2], + ]); + + $serialized = $this->hydrator->extract($object); + $hydrated = $this->hydrator->hydrate(CovariantTemplate::class, $serialized); + + self::assertNotSame($object, $hydrated); + self::assertEquals($object, $hydrated); + } }