name: SerializerTest class_comment: null dependencies: - name: TestCase type: class source: PHPUnit\Framework\TestCase - name: InvalidTypeException type: class source: Symfony\Component\PropertyAccess\Exception\InvalidTypeException - name: PropertyAccessor type: class source: Symfony\Component\PropertyAccess\PropertyAccessor - name: PhpDocExtractor type: class source: Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor - name: ReflectionExtractor type: class source: Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor - name: PropertyInfoExtractor type: class source: Symfony\Component\PropertyInfo\PropertyInfoExtractor - name: CsvEncoder type: class source: Symfony\Component\Serializer\Encoder\CsvEncoder - name: JsonEncoder type: class source: Symfony\Component\Serializer\Encoder\JsonEncoder - name: XmlEncoder type: class source: Symfony\Component\Serializer\Encoder\XmlEncoder - name: ExtraAttributesException type: class source: Symfony\Component\Serializer\Exception\ExtraAttributesException - name: InvalidArgumentException type: class source: Symfony\Component\Serializer\Exception\InvalidArgumentException - name: LogicException type: class source: Symfony\Component\Serializer\Exception\LogicException - name: NotNormalizableValueException type: class source: Symfony\Component\Serializer\Exception\NotNormalizableValueException - name: PartialDenormalizationException type: class source: Symfony\Component\Serializer\Exception\PartialDenormalizationException - name: UnexpectedValueException type: class source: Symfony\Component\Serializer\Exception\UnexpectedValueException - name: ClassDiscriminatorFromClassMetadata type: class source: Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata - name: ClassDiscriminatorMapping type: class source: Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping - name: ClassMetadata type: class source: Symfony\Component\Serializer\Mapping\ClassMetadata - name: ClassMetadataInterface type: class source: Symfony\Component\Serializer\Mapping\ClassMetadataInterface - name: ClassMetadataFactory type: class source: Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory - name: ClassMetadataFactoryInterface type: class source: Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface - name: AttributeLoader type: class source: Symfony\Component\Serializer\Mapping\Loader\AttributeLoader - name: AbstractNormalizer type: class source: Symfony\Component\Serializer\Normalizer\AbstractNormalizer - name: AbstractObjectNormalizer type: class source: Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer - name: ArrayDenormalizer type: class source: Symfony\Component\Serializer\Normalizer\ArrayDenormalizer - name: BackedEnumNormalizer type: class source: Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer - name: CustomNormalizer type: class source: Symfony\Component\Serializer\Normalizer\CustomNormalizer - name: DataUriNormalizer type: class source: Symfony\Component\Serializer\Normalizer\DataUriNormalizer - name: DateTimeNormalizer type: class source: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer - name: DateTimeZoneNormalizer type: class source: Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer - name: DenormalizerAwareInterface type: class source: Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface - name: DenormalizerInterface type: class source: Symfony\Component\Serializer\Normalizer\DenormalizerInterface - name: GetSetMethodNormalizer type: class source: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer - name: NormalizerAwareInterface type: class source: Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface - name: NormalizerInterface type: class source: Symfony\Component\Serializer\Normalizer\NormalizerInterface - name: ObjectNormalizer type: class source: Symfony\Component\Serializer\Normalizer\ObjectNormalizer - name: PropertyNormalizer type: class source: Symfony\Component\Serializer\Normalizer\PropertyNormalizer - name: UidNormalizer type: class source: Symfony\Component\Serializer\Normalizer\UidNormalizer - name: UnwrappingDenormalizer type: class source: Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer - name: Serializer type: class source: Symfony\Component\Serializer\Serializer - name: AbstractDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummy - name: AbstractDummyFirstChild type: class source: Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummyFirstChild - name: AbstractDummySecondChild type: class source: Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummySecondChild - name: DenormalizableDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\DenormalizableDummy - name: DummyFirstChildQuux type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyFirstChildQuux - name: DummyMessageInterface type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface - name: DummyMessageNumberOne type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberOne - name: DummyMessageNumberThree type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberThree - name: DummyMessageNumberTwo type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberTwo - name: DummyNullableInt type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyNullableInt - name: DummyObjectWithEnumConstructor type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumConstructor - name: DummyObjectWithEnumProperty type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumProperty - name: DummyWithObjectOrNull type: class source: Symfony\Component\Serializer\Tests\Fixtures\DummyWithObjectOrNull - name: FalseBuiltInDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\FalseBuiltInDummy - name: FooImplementationDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\FooImplementationDummy - name: FooInterfaceDummyDenormalizer type: class source: Symfony\Component\Serializer\Tests\Fixtures\FooInterfaceDummyDenormalizer - name: NormalizableTraversableDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy - name: ObjectCollectionPropertyDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\ObjectCollectionPropertyDummy - name: Php74Full type: class source: Symfony\Component\Serializer\Tests\Fixtures\Php74Full - name: Php80WithOptionalConstructorParameter type: class source: Symfony\Component\Serializer\Tests\Fixtures\Php80WithOptionalConstructorParameter - name: Php80WithPromotedTypedConstructor type: class source: Symfony\Component\Serializer\Tests\Fixtures\Php80WithPromotedTypedConstructor - name: TraversableDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\TraversableDummy - name: TrueBuiltInDummy type: class source: Symfony\Component\Serializer\Tests\Fixtures\TrueBuiltInDummy - name: WithTypedConstructor type: class source: Symfony\Component\Serializer\Tests\Fixtures\WithTypedConstructor - name: TestDenormalizer type: class source: Symfony\Component\Serializer\Tests\Normalizer\TestDenormalizer - name: TestNormalizer type: class source: Symfony\Component\Serializer\Tests\Normalizer\TestNormalizer properties: - name: map visibility: public comment: null - name: map visibility: public comment: null - name: map visibility: public comment: null - name: map visibility: public comment: null - name: changed visibility: public comment: "# @dataProvider provideObjectOrCollectionTests */\n# public function testNormalizeWithCollection(Serializer\ \ $serializer, array $data)\n# {\n# $expected = '{\"a1\":[],\"a2\":{\"k\":\"v\"\ },\"b1\":[],\"b2\":{\"k\":\"v\"},\"c1\":{\"nested\":[]},\"c2\":{\"nested\":{\"\ k\":\"v\"}},\"d1\":{\"nested\":[]},\"d2\":{\"nested\":{\"k\":\"v\"}},\"e1\":{\"\ map\":[]},\"e2\":{\"map\":{\"k\":\"v\"}},\"f1\":{\"map\":[]},\"f2\":{\"map\":{\"\ k\":\"v\"}},\"g1\":{\"list\":[],\"settings\":[]},\"g2\":{\"list\":[\"greg\"],\"\ settings\":[]}}';\n# $this->assertSame($expected, $serializer->serialize($data,\ \ 'json'));\n# }\n# \n# /** @dataProvider provideObjectOrCollectionTests */\n\ # public function testNormalizePreserveEmptyArrayObject(Serializer $serializer,\ \ array $data)\n# {\n# $expected = '{\"a1\":{},\"a2\":{\"k\":\"v\"},\"b1\":[],\"\ b2\":{\"k\":\"v\"},\"c1\":{\"nested\":{}},\"c2\":{\"nested\":{\"k\":\"v\"}},\"\ d1\":{\"nested\":[]},\"d2\":{\"nested\":{\"k\":\"v\"}},\"e1\":{\"map\":[]},\"\ e2\":{\"map\":{\"k\":\"v\"}},\"f1\":{\"map\":{}},\"f2\":{\"map\":{\"k\":\"v\"\ }},\"g1\":{\"list\":{},\"settings\":[]},\"g2\":{\"list\":[\"greg\"],\"settings\"\ :[]}}';\n# $this->assertSame($expected, $serializer->serialize($data, 'json',\ \ [\n# AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true,\n# ]));\n# }\n\ # \n# /** @dataProvider provideObjectOrCollectionTests */\n# public function testNormalizeEmptyArrayAsObject(Serializer\ \ $serializer, array $data)\n# {\n# $expected = '{\"a1\":[],\"a2\":{\"k\":\"v\"\ },\"b1\":{},\"b2\":{\"k\":\"v\"},\"c1\":{\"nested\":[]},\"c2\":{\"nested\":{\"\ k\":\"v\"}},\"d1\":{\"nested\":{}},\"d2\":{\"nested\":{\"k\":\"v\"}},\"e1\":{\"\ map\":{}},\"e2\":{\"map\":{\"k\":\"v\"}},\"f1\":{\"map\":[]},\"f2\":{\"map\":{\"\ k\":\"v\"}},\"g1\":{\"list\":[],\"settings\":{}},\"g2\":{\"list\":[\"greg\"],\"\ settings\":{}}}';\n# $this->assertSame($expected, $serializer->serialize($data,\ \ 'json', [\n# Serializer::EMPTY_ARRAY_AS_OBJECT => true,\n# ]));\n# }\n# \n#\ \ /** @dataProvider provideObjectOrCollectionTests */\n# public function testNormalizeEmptyArrayAsObjectAndPreserveEmptyArrayObject(Serializer\ \ $serializer, array $data)\n# {\n# $expected = '{\"a1\":{},\"a2\":{\"k\":\"v\"\ },\"b1\":{},\"b2\":{\"k\":\"v\"},\"c1\":{\"nested\":{}},\"c2\":{\"nested\":{\"\ k\":\"v\"}},\"d1\":{\"nested\":{}},\"d2\":{\"nested\":{\"k\":\"v\"}},\"e1\":{\"\ map\":{}},\"e2\":{\"map\":{\"k\":\"v\"}},\"f1\":{\"map\":{}},\"f2\":{\"map\":{\"\ k\":\"v\"}},\"g1\":{\"list\":{},\"settings\":{}},\"g2\":{\"list\":[\"greg\"],\"\ settings\":{}}}';\n# $this->assertSame($expected, $serializer->serialize($data,\ \ 'json', [\n# Serializer::EMPTY_ARRAY_AS_OBJECT => true,\n# AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS\ \ => true,\n# ]));\n# }\n# \n# public function testNormalizeScalar()\n# {\n# $serializer\ \ = new Serializer([], ['json' => new JsonEncoder()]);\n# \n# $this->assertSame('42',\ \ $serializer->serialize(42, 'json'));\n# $this->assertSame('true', $serializer->serialize(true,\ \ 'json'));\n# $this->assertSame('false', $serializer->serialize(false, 'json'));\n\ # $this->assertSame('3.14', $serializer->serialize(3.14, 'json'));\n# $this->assertSame('3.14',\ \ $serializer->serialize(31.4e-1, 'json'));\n# $this->assertSame('\" spaces \ \ \"', $serializer->serialize(' spaces ', 'json'));\n# $this->assertSame('\"\ @Ca$e%\"', $serializer->serialize('@Ca$e%', 'json'));\n# }\n# \n# public function\ \ testNormalizeScalarArray()\n# {\n# $serializer = new Serializer([], ['json'\ \ => new JsonEncoder()]);\n# \n# $this->assertSame('[42]', $serializer->serialize([42],\ \ 'json'));\n# $this->assertSame('[true,false]', $serializer->serialize([true,\ \ false], 'json'));\n# $this->assertSame('[3.14,3.24]', $serializer->serialize([3.14,\ \ 32.4e-1], 'json'));\n# $this->assertSame('[\" spaces \",\"@Ca$e%\"]', $serializer->serialize(['\ \ spaces ', '@Ca$e%'], 'json'));\n# }\n# \n# public function testDeserializeScalar()\n\ # {\n# $serializer = new Serializer([], ['json' => new JsonEncoder()]);\n# \n\ # $this->assertSame(42, $serializer->deserialize('42', 'int', 'json'));\n# $this->assertTrue($serializer->deserialize('true',\ \ 'bool', 'json'));\n# $this->assertSame(3.14, $serializer->deserialize('3.14',\ \ 'float', 'json'));\n# $this->assertSame(3.14, $serializer->deserialize('31.4e-1',\ \ 'float', 'json'));\n# $this->assertSame(' spaces ', $serializer->deserialize('\"\ \ spaces \"', 'string', 'json'));\n# $this->assertSame('@Ca$e%', $serializer->deserialize('\"\ @Ca$e%\"', 'string', 'json'));\n# }\n# \n# public function testDeserializeLegacyScalarType()\n\ # {\n# $serializer = new Serializer([], ['json' => new JsonEncoder()]);\n# \n\ # $this->expectException(LogicException::class);\n# \n# $serializer->deserialize('42',\ \ 'integer', 'json');\n# }\n# \n# public function testDeserializeScalarTypeToCustomType()\n\ # {\n# $serializer = new Serializer([], ['json' => new JsonEncoder()]);\n# \n\ # $this->expectException(LogicException::class);\n# \n# $serializer->deserialize('\"\ something\"', Foo::class, 'json');\n# }\n# \n# public function testDeserializeNonscalarTypeToScalar()\n\ # {\n# $serializer = new Serializer([], ['json' => new JsonEncoder()]);\n# \n\ # $this->expectException(NotNormalizableValueException::class);\n# \n# $serializer->deserialize('{\"\ foo\":true}', 'string', 'json');\n# }\n# \n# public function testDeserializeInconsistentScalarType()\n\ # {\n# $serializer = new Serializer([], ['json' => new JsonEncoder()]);\n# \n\ # $this->expectException(NotNormalizableValueException::class);\n# \n# $serializer->deserialize('\"\ 42\"', 'int', 'json');\n# }\n# \n# public function testDeserializeScalarArray()\n\ # {\n# $serializer = new Serializer([new ArrayDenormalizer()], ['json' => new\ \ JsonEncoder()]);\n# \n# $this->assertSame([42], $serializer->deserialize('[42]',\ \ 'int[]', 'json'));\n# $this->assertSame([true, false], $serializer->deserialize('[true,false]',\ \ 'bool[]', 'json'));\n# $this->assertSame([3.14, 3.24], $serializer->deserialize('[3.14,32.4e-1]',\ \ 'float[]', 'json'));\n# $this->assertSame([' spaces ', '@Ca$e%'], $serializer->deserialize('[\"\ \ spaces \",\"@Ca$e%\"]', 'string[]', 'json'));\n# }\n# \n# public function\ \ testDeserializeInconsistentScalarArray()\n# {\n# $serializer = new Serializer([new\ \ ArrayDenormalizer()], ['json' => new JsonEncoder()]);\n# \n# $this->expectException(NotNormalizableValueException::class);\n\ # \n# $serializer->deserialize('[\"42\"]', 'int[]', 'json');\n# }\n# \n# public\ \ function testDeserializeOnObjectWithObjectCollectionProperty()\n# {\n# $serializer\ \ = new Serializer([new FooInterfaceDummyDenormalizer(), new ObjectNormalizer(null,\ \ null, null, new PhpDocExtractor())], [new JsonEncoder()]);\n# \n# $obj = $serializer->deserialize('{\"\ foo\":[{\"name\":\"bar\"}]}', ObjectCollectionPropertyDummy::class, 'json');\n\ # $this->assertInstanceOf(ObjectCollectionPropertyDummy::class, $obj);\n# \n#\ \ $fooDummyObjects = $obj->getFoo();\n# $this->assertCount(1, $fooDummyObjects);\n\ # \n# $fooDummyObject = $fooDummyObjects[0];\n# $this->assertInstanceOf(FooImplementationDummy::class,\ \ $fooDummyObject);\n# $this->assertSame('bar', $fooDummyObject->name);\n# }\n\ # \n# public function testDeserializeWrappedScalar()\n# {\n# $serializer = new\ \ Serializer([new UnwrappingDenormalizer()], ['json' => new JsonEncoder()]);\n\ # \n# $this->assertSame(42, $serializer->deserialize('{\"wrapper\": 42}', 'int',\ \ 'json', [UnwrappingDenormalizer::UNWRAP_PATH => '[wrapper]']));\n# }\n# \n#\ \ public function testDeserializeNullableIntInXml()\n# {\n# $extractor = new PropertyInfoExtractor([],\ \ [new ReflectionExtractor()]);\n# $serializer = new Serializer([new ObjectNormalizer(null,\ \ null, null, $extractor)], ['xml' => new XmlEncoder()]);\n# \n# $obj = $serializer->deserialize('',\ \ DummyNullableInt::class, 'xml');\n# $this->assertInstanceOf(DummyNullableInt::class,\ \ $obj);\n# $this->assertNull($obj->value);\n# }\n# \n# public function testUnionTypeDeserializable()\n\ # {\n# $classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());\n\ # $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);\n\ # $serializer = new Serializer(\n# [\n# new DateTimeNormalizer(),\n# new ObjectNormalizer($classMetadataFactory,\ \ null, null, $extractor, new ClassDiscriminatorFromClassMetadata($classMetadataFactory)),\n\ # ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# $actual = $serializer->deserialize('{\ \ \"changed\": null }', DummyUnionType::class, 'json', [\n# DateTimeNormalizer::FORMAT_KEY\ \ => \\DateTimeinterface::ATOM,\n# ]);\n# \n# $this->assertEquals((new DummyUnionType())->setChanged(null),\ \ $actual, 'Union type denormalization first case failed.');\n# \n# $actual =\ \ $serializer->deserialize('{ \"changed\": \"2022-03-22T16:15:05+0000\" }', DummyUnionType::class,\ \ 'json', [\n# DateTimeNormalizer::FORMAT_KEY => \\DateTimeinterface::ATOM,\n\ # ]);\n# \n# $expectedDateTime = \\DateTimeImmutable::createFromFormat(\\DateTimeinterface::ATOM,\ \ '2022-03-22T16:15:05+0000');\n# $this->assertEquals((new DummyUnionType())->setChanged($expectedDateTime),\ \ $actual, 'Union type denormalization second case failed.');\n# \n# $actual =\ \ $serializer->deserialize('{ \"changed\": false }', DummyUnionType::class, 'json',\ \ [\n# DateTimeNormalizer::FORMAT_KEY => \\DateTimeinterface::ATOM,\n# ]);\n#\ \ \n# $this->assertEquals(new DummyUnionType(), $actual, 'Union type denormalization\ \ third case failed.');\n# }\n# \n# public function testUnionTypeDeserializableWithoutAllowedExtraAttributes()\n\ # {\n# $classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());\n\ # $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);\n\ # $serializer = new Serializer(\n# [\n# new ObjectNormalizer($classMetadataFactory,\ \ null, null, $extractor, new ClassDiscriminatorFromClassMetadata($classMetadataFactory)),\n\ # ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# $actual = $serializer->deserialize('{\ \ \"v\": { \"a\": 0 }}', DummyUnionWithAAndCAndB::class, 'json', [\n# AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES\ \ => false,\n# ]);\n# \n# $this->assertEquals(new DummyUnionWithAAndCAndB(new\ \ DummyATypeForUnion()), $actual);\n# \n# $actual = $serializer->deserialize('{\ \ \"v\": { \"b\": 1 }}', DummyUnionWithAAndCAndB::class, 'json', [\n# AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES\ \ => false,\n# ]);\n# \n# $this->assertEquals(new DummyUnionWithAAndCAndB(new\ \ DummyBTypeForUnion()), $actual);\n# \n# $actual = $serializer->deserialize('{\ \ \"v\": { \"c\": 3 }}', DummyUnionWithAAndCAndB::class, 'json', [\n# AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES\ \ => false,\n# ]);\n# \n# $this->assertEquals(new DummyUnionWithAAndCAndB(new\ \ DummyCTypeForUnion(3)), $actual);\n# \n# $this->expectException(ExtraAttributesException::class);\n\ # $serializer->deserialize('{ \"v\": { \"b\": 1, \"d\": \"i am not allowed\" }}',\ \ DummyUnionWithAAndCAndB::class, 'json', [\n# AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES\ \ => false,\n# ]);\n# }\n# \n# public function testFalseBuiltInTypes()\n# {\n\ # $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]);\n#\ \ $serializer = new Serializer([new ObjectNormalizer(null, null, null, $extractor)],\ \ ['json' => new JsonEncoder()]);\n# \n# $actual = $serializer->deserialize('{\"\ false\":false}', FalseBuiltInDummy::class, 'json');\n# \n# $this->assertEquals(new\ \ FalseBuiltInDummy(), $actual);\n# }\n# \n# public function testTrueBuiltInTypes()\n\ # {\n# $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]);\n\ # $serializer = new Serializer([new ObjectNormalizer(null, null, null, $extractor)],\ \ ['json' => new JsonEncoder()]);\n# \n# $actual = $serializer->deserialize('{\"\ true\":true}', TrueBuiltInDummy::class, 'json');\n# \n# $this->assertEquals(new\ \ TrueBuiltInDummy(), $actual);\n# }\n# \n# public function testDeserializeUntypedFormat()\n\ # {\n# $serializer = new Serializer([new ObjectNormalizer(null, null, null, new\ \ PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]))],\ \ ['csv' => new CsvEncoder()]);\n# $actual = $serializer->deserialize('value'.\\\ PHP_EOL.',', DummyWithObjectOrNull::class, 'csv', [CsvEncoder::AS_COLLECTION_KEY\ \ => false]);\n# \n# $this->assertEquals(new DummyWithObjectOrNull(null), $actual);\n\ # }\n# \n# private function serializerWithClassDiscriminator()\n# {\n# $classMetadataFactory\ \ = new ClassMetadataFactory(new AttributeLoader());\n# \n# return new Serializer([new\ \ ObjectNormalizer($classMetadataFactory, null, null, new ReflectionExtractor(),\ \ new ClassDiscriminatorFromClassMetadata($classMetadataFactory))], ['json' =>\ \ new JsonEncoder()]);\n# }\n# \n# public function testDeserializeAndUnwrap()\n\ # {\n# $jsonData = '{\"baz\": {\"foo\": \"bar\", \"inner\": {\"title\": \"value\"\ , \"numbers\": [5,3]}}}';\n# \n# $expectedData = Model::fromArray(['title' =>\ \ 'value', 'numbers' => [5, 3]]);\n# \n# $serializer = new Serializer([new UnwrappingDenormalizer(new\ \ PropertyAccessor()), new ObjectNormalizer()], ['json' => new JsonEncoder()]);\n\ # \n# $this->assertEquals(\n# $expectedData,\n# $serializer->deserialize($jsonData,\ \ __NAMESPACE__.'\\Model', 'json', [UnwrappingDenormalizer::UNWRAP_PATH => '[baz][inner]'])\n\ # );\n# }\n# \n# /**\n# * @dataProvider provideCollectDenormalizationErrors\n\ # */\n# public function testCollectDenormalizationErrors(?ClassMetadataFactory\ \ $classMetadataFactory)\n# {\n# $json = '\n# {\n# \"string\": null,\n# \"int\"\ : null,\n# \"float\": null,\n# \"bool\": null,\n# \"dateTime\": null,\n# \"dateTimeImmutable\"\ : null,\n# \"dateTimeZone\": null,\n# \"splFileInfo\": null,\n# \"uuid\": null,\n\ # \"array\": null,\n# \"collection\": [\n# {\n# \"string\": \"string\"\n# },\n\ # {\n# \"string\": null\n# }\n# ],\n# \"php74FullWithConstructor\": {},\n# \"\ php74FullWithTypedConstructor\": {\n# \"something\": \"not a float\",\n# \"somethingElse\"\ : \"not a bool\"\n# },\n# \"dummyMessage\": {\n# },\n# \"nestedObject\": {\n#\ \ \"int\": \"string\"\n# },\n# \"anotherCollection\": null\n# }';\n# \n# $extractor\ \ = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);\n\ # \n# $serializer = new Serializer(\n# [\n# new ArrayDenormalizer(),\n# new DateTimeNormalizer(),\n\ # new DateTimeZoneNormalizer(),\n# new DataUriNormalizer(),\n# new UidNormalizer(),\n\ # new ObjectNormalizer($classMetadataFactory, null, null, $extractor, $classMetadataFactory\ \ ? new ClassDiscriminatorFromClassMetadata($classMetadataFactory) : null),\n\ # ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try {\n# $serializer->deserialize($json,\ \ Php74Full::class, 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS\ \ => true,\n# ]);\n# \n# $this->fail();\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $this->assertInstanceOf(Php74Full::class, $th->getData());\n\ # \n# $exceptionsAsArray = array_map(fn (NotNormalizableValueException $e): array\ \ => [\n# 'currentType' => $e->getCurrentType(),\n# 'expectedTypes' => $e->getExpectedTypes(),\n\ # 'path' => $e->getPath(),\n# 'useMessageForUser' => $e->canUseMessageForUser(),\n\ # 'message' => $e->getMessage(),\n# ], $th->getErrors());\n# \n# $expected = [\n\ # [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n# ],\n#\ \ 'path' => 'string',\n# 'useMessageForUser' => false,\n# 'message' => 'The type\ \ of the \"string\" attribute for class \"Symfony\\\\Component\\\\Serializer\\\ \\Tests\\\\Fixtures\\\\Php74Full\" must be one of \"string\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'int',\n# ],\n\ # 'path' => 'int',\n# 'useMessageForUser' => false,\n# 'message' => 'The type\ \ of the \"int\" attribute for class \"Symfony\\\\Component\\\\Serializer\\\\\ Tests\\\\Fixtures\\\\Php74Full\" must be one of \"int\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'float',\n# ],\n\ # 'path' => 'float',\n# 'useMessageForUser' => false,\n# 'message' => 'The type\ \ of the \"float\" attribute for class \"Symfony\\\\Component\\\\Serializer\\\\\ Tests\\\\Fixtures\\\\Php74Full\" must be one of \"float\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'bool',\n# ],\n\ # 'path' => 'bool',\n# 'useMessageForUser' => false,\n# 'message' => 'The type\ \ of the \"bool\" attribute for class \"Symfony\\\\Component\\\\Serializer\\\\\ Tests\\\\Fixtures\\\\Php74Full\" must be one of \"bool\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n#\ \ ],\n# 'path' => 'dateTime',\n# 'useMessageForUser' => true,\n# 'message' =>\ \ 'The data is either not an string, an empty string, or null; you should pass\ \ a string that can be parsed with the passed format or a valid DateTime string.',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n#\ \ ],\n# 'path' => 'dateTimeImmutable',\n# 'useMessageForUser' => true,\n# 'message'\ \ => 'The data is either not an string, an empty string, or null; you should pass\ \ a string that can be parsed with the passed format or a valid DateTime string.',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n#\ \ ],\n# 'path' => 'dateTimeZone',\n# 'useMessageForUser' => true,\n# 'message'\ \ => 'The data is either an empty string or null, you should pass a string that\ \ can be parsed as a DateTimeZone.',\n# ],\n# [\n# 'currentType' => 'null',\n\ # 'expectedTypes' => [\n# 'string',\n# ],\n# 'path' => 'splFileInfo',\n# 'useMessageForUser'\ \ => true,\n# 'message' => 'The provided \"data:\" URI is not valid.',\n# ],\n\ # [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n# ],\n#\ \ 'path' => 'uuid',\n# 'useMessageForUser' => true,\n# 'message' => 'The data\ \ is not a valid \"Symfony\\Component\\Uid\\Uuid\" string representation.',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'array',\n# ],\n\ # 'path' => 'array',\n# 'useMessageForUser' => false,\n# 'message' => 'The type\ \ of the \"array\" attribute for class \"Symfony\\\\Component\\\\Serializer\\\\\ Tests\\\\Fixtures\\\\Php74Full\" must be one of \"array\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n#\ \ ],\n# 'path' => 'collection[1].string',\n# 'useMessageForUser' => false,\n#\ \ 'message' => 'The type of the \"string\" attribute for class \"Symfony\\Component\\\ Serializer\\Tests\\Fixtures\\Php74Full\" must be one of \"string\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'unknown',\n\ # ],\n# 'path' => 'php74FullWithConstructor.constructorArgument',\n# 'useMessageForUser'\ \ => true,\n# 'message' => 'Failed to create object because the class misses the\ \ \"constructorArgument\" property.',\n# ],\n# [\n# 'currentType' => 'string',\n\ # 'expectedTypes' => [\n# 'float',\n# ],\n# 'path' => 'php74FullWithTypedConstructor.something',\n\ # 'useMessageForUser' => false,\n# 'message' => 'The type of the \"something\"\ \ attribute for class \"Symfony\\Component\\Serializer\\Tests\\Fixtures\\Php74FullWithTypedConstructor\"\ \ must be one of \"float\" (\"string\" given).',\n# ],\n# [\n# 'currentType' =>\ \ 'string',\n# 'expectedTypes' => [\n# 'bool',\n# ],\n# 'path' => 'php74FullWithTypedConstructor.somethingElse',\n\ # 'useMessageForUser' => false,\n# 'message' => 'The type of the \"somethingElse\"\ \ attribute for class \"Symfony\\Component\\Serializer\\Tests\\Fixtures\\Php74FullWithTypedConstructor\"\ \ must be one of \"bool\" (\"string\" given).',\n# ],\n# $classMetadataFactory\ \ ?\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n# ],\n\ # 'path' => 'dummyMessage.type',\n# 'useMessageForUser' => false,\n# 'message'\ \ => 'Type property \"type\" not found for the abstract object \"Symfony\\Component\\\ Serializer\\Tests\\Fixtures\\DummyMessageInterface\".',\n# ] :\n# [\n# 'currentType'\ \ => 'array',\n# 'expectedTypes' => [\n# DummyMessageInterface::class,\n# ],\n\ # 'path' => 'dummyMessage',\n# 'useMessageForUser' => false,\n# 'message' => 'The\ \ type of the \"dummyMessage\" attribute for class \"Symfony\\Component\\Serializer\\\ Tests\\Fixtures\\Php74Full\" must be one of \"Symfony\\Component\\Serializer\\\ Tests\\Fixtures\\DummyMessageInterface\" (\"array\" given).',\n# ],\n# [\n# 'currentType'\ \ => 'string',\n# 'expectedTypes' => [\n# 'int',\n# ],\n# 'path' => 'nestedObject[int]',\n\ # 'useMessageForUser' => true,\n# 'message' => 'The type of the key \"int\" must\ \ be \"int\" (\"string\" given).',\n# ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes'\ \ => ['array'],\n# 'path' => 'anotherCollection',\n# 'useMessageForUser' => false,\n\ # 'message' => 'Data expected to be \"Symfony\\Component\\Serializer\\Tests\\\ Fixtures\\Php74Full[]\", \"null\" given.',\n# ],\n# ];\n# \n# $this->assertSame($expected,\ \ $exceptionsAsArray);\n# }\n# \n# /**\n# * @dataProvider provideCollectDenormalizationErrors\n\ # */\n# public function testCollectDenormalizationErrors2(?ClassMetadataFactory\ \ $classMetadataFactory)\n# {\n# $json = '\n# [\n# {\n# \"string\": null\n# },\n\ # {\n# \"string\": null\n# }\n# ]';\n# \n# $extractor = new PropertyInfoExtractor([],\ \ [new PhpDocExtractor(), new ReflectionExtractor()]);\n# \n# $serializer = new\ \ Serializer(\n# [\n# new ArrayDenormalizer(),\n# new ObjectNormalizer($classMetadataFactory,\ \ null, null, $extractor, $classMetadataFactory ? new ClassDiscriminatorFromClassMetadata($classMetadataFactory)\ \ : null),\n# ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try {\n# $serializer->deserialize($json,\ \ Php74Full::class.'[]', 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS\ \ => true,\n# ]);\n# \n# $this->fail();\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $this->assertCount(2, $th->getData());\n# $this->assertInstanceOf(Php74Full::class,\ \ $th->getData()[0]);\n# $this->assertInstanceOf(Php74Full::class, $th->getData()[1]);\n\ # \n# $exceptionsAsArray = array_map(fn (NotNormalizableValueException $e): array\ \ => [\n# 'currentType' => $e->getCurrentType(),\n# 'expectedTypes' => $e->getExpectedTypes(),\n\ # 'path' => $e->getPath(),\n# 'useMessageForUser' => $e->canUseMessageForUser(),\n\ # 'message' => $e->getMessage(),\n# ], $th->getErrors());\n# \n# $expected = [\n\ # [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n# ],\n#\ \ 'path' => '[0].string',\n# 'useMessageForUser' => false,\n# 'message' => 'The\ \ type of the \"string\" attribute for class \"Symfony\\\\Component\\\\Serializer\\\ \\Tests\\\\Fixtures\\\\Php74Full\" must be one of \"string\" (\"null\" given).',\n\ # ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes' => [\n# 'string',\n#\ \ ],\n# 'path' => '[1].string',\n# 'useMessageForUser' => false,\n# 'message'\ \ => 'The type of the \"string\" attribute for class \"Symfony\\\\Component\\\\\ Serializer\\\\Tests\\\\Fixtures\\\\Php74Full\" must be one of \"string\" (\"null\"\ \ given).',\n# ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n\ # }\n# \n# public function testCollectDenormalizationErrorsWithoutTypeExtractor()\n\ # {\n# $json = '\n# {\n# \"string\": [],\n# \"int\": [],\n# \"float\": []\n# }';\n\ # \n# $serializer = new Serializer([new ObjectNormalizer()], ['json' => new JsonEncoder()]);\n\ # \n# try {\n# $serializer->deserialize($json, Php74Full::class, 'json', [\n#\ \ DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true,\n# ]);\n# \n\ # $this->fail();\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $this->assertInstanceOf(Php74Full::class, $th->getData());\n\ # \n# $exceptionsAsArray = array_map(fn (NotNormalizableValueException $e): array\ \ => [\n# 'currentType' => $e->getCurrentType(),\n# 'expectedTypes' => $e->getExpectedTypes(),\n\ # 'path' => $e->getPath(),\n# 'useMessageForUser' => $e->canUseMessageForUser(),\n\ # 'message' => $e->getMessage(),\n# ], $th->getErrors());\n# \n# $expected = [\n\ # [\n# 'currentType' => 'array',\n# 'expectedTypes' => [\n# class_exists(InvalidTypeException::class)\ \ ? 'string' : 'unknown',\n# ],\n# 'path' => 'string',\n# 'useMessageForUser'\ \ => false,\n# 'message' => 'Failed to denormalize attribute \"string\" value\ \ for class \"Symfony\\\\Component\\\\Serializer\\\\Tests\\\\Fixtures\\\\Php74Full\"\ : Expected argument of type \"string\", \"array\" given at property path \"string\"\ .',\n# ],\n# [\n# 'currentType' => 'array',\n# 'expectedTypes' => [\n# class_exists(InvalidTypeException::class)\ \ ? 'int' : 'unknown',\n# ],\n# 'path' => 'int',\n# 'useMessageForUser' => false,\n\ # 'message' => 'Failed to denormalize attribute \"int\" value for class \"Symfony\\\ \\Component\\\\Serializer\\\\Tests\\\\Fixtures\\\\Php74Full\": Expected argument\ \ of type \"int\", \"array\" given at property path \"int\".',\n# ],\n# [\n# 'currentType'\ \ => 'array',\n# 'expectedTypes' => [\n# class_exists(InvalidTypeException::class)\ \ ? 'float' : 'unknown',\n# ],\n# 'path' => 'float',\n# 'useMessageForUser' =>\ \ false,\n# 'message' => 'Failed to denormalize attribute \"float\" value for\ \ class \"Symfony\\\\Component\\\\Serializer\\\\Tests\\\\Fixtures\\\\Php74Full\"\ : Expected argument of type \"float\", \"array\" given at property path \"float\"\ .',\n# ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n# }\n\ # \n# /**\n# * @dataProvider provideCollectDenormalizationErrors\n# */\n# public\ \ function testCollectDenormalizationErrorsWithConstructor(?ClassMetadataFactory\ \ $classMetadataFactory)\n# {\n# $json = '{\"bool\": \"bool\"}';\n# \n# $extractor\ \ = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);\n\ # \n# $serializer = new Serializer(\n# [\n# new ObjectNormalizer($classMetadataFactory,\ \ null, null, $extractor, $classMetadataFactory ? new ClassDiscriminatorFromClassMetadata($classMetadataFactory)\ \ : null),\n# ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try {\n# $serializer->deserialize($json,\ \ Php80WithPromotedTypedConstructor::class, 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS\ \ => true,\n# ]);\n# \n# $this->fail();\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $this->assertInstanceOf(Php80WithPromotedTypedConstructor::class,\ \ $th->getData());\n# \n# $exceptionsAsArray = array_map(fn (NotNormalizableValueException\ \ $e): array => [\n# 'currentType' => $e->getCurrentType(),\n# 'expectedTypes'\ \ => $e->getExpectedTypes(),\n# 'path' => $e->getPath(),\n# 'useMessageForUser'\ \ => $e->canUseMessageForUser(),\n# 'message' => $e->getMessage(),\n# ], $th->getErrors());\n\ # \n# $expected = [\n# [\n# 'currentType' => 'string',\n# 'expectedTypes' => [\n\ # 'bool',\n# ],\n# 'path' => 'bool',\n# 'useMessageForUser' => false,\n# 'message'\ \ => 'The type of the \"bool\" attribute for class \"Symfony\\\\Component\\\\\ Serializer\\\\Tests\\\\Fixtures\\\\Php80WithPromotedTypedConstructor\" must be\ \ one of \"bool\" (\"string\" given).',\n# ],\n# [\n# 'currentType' => 'null',\n\ # 'expectedTypes' => [\n# 'string',\n# ],\n# 'path' => 'string',\n# 'useMessageForUser'\ \ => true,\n# 'message' => 'Failed to create object because the class misses the\ \ \"string\" property.',\n# ],\n# [\n# 'currentType' => 'null',\n# 'expectedTypes'\ \ => [\n# 'int',\n# ],\n# 'path' => 'int',\n# 'useMessageForUser' => true,\n#\ \ 'message' => 'Failed to create object because the class misses the \"int\" property.',\n\ # ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n# }\n# \n\ # public function testCollectDenormalizationErrorsWithInvalidConstructorTypes()\n\ # {\n# $json = '{\"string\": \"some string\", \"bool\": \"bool\", \"int\": true}';\n\ # \n# $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]);\n\ # \n# $serializer = new Serializer(\n# [new ObjectNormalizer(null, null, null,\ \ $extractor)],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try {\n# $serializer->deserialize($json,\ \ WithTypedConstructor::class, 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS\ \ => true,\n# ]);\n# \n# $this->fail();\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $this->assertInstanceOf(WithTypedConstructor::class, $object\ \ = $th->getData());\n# \n# $this->assertSame('some string', $object->string);\n\ # $this->assertTrue($object->bool);\n# $this->assertSame(1, $object->int);\n#\ \ \n# $exceptionsAsArray = array_map(function (NotNormalizableValueException $e):\ \ array {\n# return [\n# 'currentType' => $e->getCurrentType(),\n# 'expectedTypes'\ \ => $e->getExpectedTypes(),\n# 'path' => $e->getPath(),\n# 'useMessageForUser'\ \ => $e->canUseMessageForUser(),\n# 'message' => $e->getMessage(),\n# ];\n# },\ \ $th->getErrors());\n# \n# $expected = [\n# [\n# 'currentType' => 'string',\n\ # 'expectedTypes' => [\n# 'bool',\n# ],\n# 'path' => 'bool',\n# 'useMessageForUser'\ \ => false,\n# 'message' => 'The type of the \"bool\" attribute for class \"Symfony\\\ Component\\Serializer\\Tests\\Fixtures\\WithTypedConstructor\" must be one of\ \ \"bool\" (\"string\" given).',\n# ],\n# [\n# 'currentType' => 'bool',\n# 'expectedTypes'\ \ => [\n# 'int',\n# ],\n# 'path' => 'int',\n# 'useMessageForUser' => false,\n\ # 'message' => 'The type of the \"int\" attribute for class \"Symfony\\Component\\\ Serializer\\Tests\\Fixtures\\WithTypedConstructor\" must be one of \"int\" (\"\ bool\" given).',\n# ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n\ # }\n# \n# public function testCollectDenormalizationErrorsWithEnumConstructor()\n\ # {\n# $serializer = new Serializer(\n# [\n# new BackedEnumNormalizer(),\n# new\ \ ObjectNormalizer(),\n# ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try\ \ {\n# $serializer->deserialize('{\"invalid\": \"GET\"}', DummyObjectWithEnumConstructor::class,\ \ 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true,\n\ # ]);\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $exceptionsAsArray = array_map(fn (NotNormalizableValueException\ \ $e): array => [\n# 'currentType' => $e->getCurrentType(),\n# 'useMessageForUser'\ \ => $e->canUseMessageForUser(),\n# 'message' => $e->getMessage(),\n# ], $th->getErrors());\n\ # \n# $expected = [\n# [\n# 'currentType' => 'null',\n# 'useMessageForUser' =>\ \ true,\n# 'message' => 'Failed to create object because the class misses the\ \ \"get\" property.',\n# ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n\ # }\n# \n# public function testCollectDenormalizationErrorsWithWrongPropertyWithoutConstruct()\n\ # {\n# $classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());\n\ # $reflectionExtractor = new ReflectionExtractor();\n# $propertyInfoExtractor\ \ = new PropertyInfoExtractor([], [$reflectionExtractor], [], [], []);\n# \n#\ \ $serializer = new Serializer(\n# [\n# new BackedEnumNormalizer(),\n# new ObjectNormalizer($classMetadataFactory,\ \ null, null, $propertyInfoExtractor),\n# ],\n# ['json' => new JsonEncoder()]\n\ # );\n# \n# try {\n# $serializer->deserialize('{\"get\": \"POST\"}', DummyObjectWithEnumProperty::class,\ \ 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true,\n\ # ]);\n# } catch (\\Throwable $e) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $e);\n# }\n# \n# $exceptionsAsArray = array_map(function (NotNormalizableValueException\ \ $e): array {\n# return [\n# 'currentType' => $e->getCurrentType(),\n# 'useMessageForUser'\ \ => $e->canUseMessageForUser(),\n# 'message' => $e->getMessage(),\n# ];\n# },\ \ $e->getErrors());\n# \n# $expected = [\n# [\n# 'currentType' => 'string',\n\ # 'useMessageForUser' => true,\n# 'message' => 'The data must belong to a backed\ \ enumeration of type Symfony\\Component\\Serializer\\Tests\\Fixtures\\StringBackedEnumDummy',\n\ # ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n# }\n# \n\ # public function testNoCollectDenormalizationErrorsWithWrongEnumOnConstructor()\n\ # {\n# $serializer = new Serializer(\n# [\n# new BackedEnumNormalizer(),\n# new\ \ ObjectNormalizer(),\n# ],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try\ \ {\n# $serializer->deserialize('{\"get\": \"POST\"}', DummyObjectWithEnumConstructor::class,\ \ 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true,\n\ # ]);\n# } catch (\\Throwable $th) {\n# $this->assertNotInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# $this->assertInstanceOf(InvalidArgumentException::class, $th);\n# }\n\ # }\n# \n# public function testGroupsOnClassSerialization()\n# {\n# $obj = new\ \ Fixtures\\Attributes\\GroupClassDummy();\n# $obj->setFoo('foo');\n# $obj->setBar('bar');\n\ # $obj->setBaz('baz');\n# \n# $serializer = new Serializer(\n# [\n# new ObjectNormalizer(),\n\ # ],\n# [\n# 'json' => new JsonEncoder(),\n# ]\n# );\n# \n# $this->assertSame(\n\ # '{\"foo\":\"foo\",\"bar\":\"bar\",\"baz\":\"baz\"}',\n# $serializer->serialize($obj,\ \ 'json', ['groups' => ['a']])\n# );\n# }\n# \n# public static function provideCollectDenormalizationErrors():\ \ array\n# {\n# return [\n# [null],\n# [new ClassMetadataFactory(new AttributeLoader())],\n\ # ];\n# }\n# \n# public function testSerializerUsesSupportedTypesMethod()\n# {\n\ # $neverCalledNormalizer = $this->createMock(DummyNormalizer::class);\n# $neverCalledNormalizer\n\ # // once for normalization, once for denormalization\n# ->expects($this->exactly(2))\n\ # ->method('getSupportedTypes')\n# ->willReturn([\n# Foo::class => true,\n# Bar::class\ \ => false,\n# ]);\n# \n# $supportedAndCachedNormalizer = $this->createMock(DummyNormalizer::class);\n\ # $supportedAndCachedNormalizer\n# // once for normalization, once for denormalization\n\ # ->expects($this->exactly(2))\n# ->method('getSupportedTypes')\n# ->willReturn([\n\ # Model::class => true,\n# ]);\n# \n# $serializer = new Serializer(\n# [\n# $neverCalledNormalizer,\n\ # $supportedAndCachedNormalizer,\n# new ObjectNormalizer(),\n# ],\n# ['json' =>\ \ new JsonEncoder()]\n# );\n# \n# // Normalization process\n# $neverCalledNormalizer\n\ # ->expects($this->never())\n# ->method('supportsNormalization');\n# $neverCalledNormalizer\n\ # ->expects($this->never())\n# ->method('normalize');\n# \n# $supportedAndCachedNormalizer\n\ # ->expects($this->once())\n# ->method('supportsNormalization')\n# ->willReturn(true);\n\ # $supportedAndCachedNormalizer\n# ->expects($this->exactly(2))\n# ->method('normalize')\n\ # ->willReturn(['foo' => 'bar']);\n# \n# $serializer->normalize(new Model(), 'json');\n\ # $serializer->normalize(new Model(), 'json');\n# \n# // Denormalization pass\n\ # $neverCalledNormalizer\n# ->expects($this->never())\n# ->method('supportsDenormalization');\n\ # $neverCalledNormalizer\n# ->expects($this->never())\n# ->method('denormalize');\n\ # $supportedAndCachedNormalizer\n# ->expects($this->once())\n# ->method('supportsDenormalization')\n\ # ->willReturn(true);\n# $supportedAndCachedNormalizer\n# ->expects($this->exactly(2))\n\ # ->method('denormalize')\n# ->willReturn(new Model());\n# \n# $serializer->denormalize('foo',\ \ Model::class, 'json');\n# $serializer->denormalize('foo', Model::class, 'json');\n\ # }\n# \n# public function testPartialDenormalizationWithMissingConstructorTypes()\n\ # {\n# $json = '{\"one\": \"one string\", \"three\": \"three string\"}';\n# \n\ # $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]);\n#\ \ \n# $serializer = new Serializer(\n# [new ObjectNormalizer(null, null, null,\ \ $extractor)],\n# ['json' => new JsonEncoder()]\n# );\n# \n# try {\n# $serializer->deserialize($json,\ \ Php80WithOptionalConstructorParameter::class, 'json', [\n# DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS\ \ => true,\n# ]);\n# \n# $this->fail();\n# } catch (\\Throwable $th) {\n# $this->assertInstanceOf(PartialDenormalizationException::class,\ \ $th);\n# }\n# \n# $this->assertInstanceOf(Php80WithOptionalConstructorParameter::class,\ \ $object = $th->getData());\n# \n# $this->assertSame('one string', $object->one);\n\ # $this->assertFalse(isset($object->two));\n# $this->assertSame('three string',\ \ $object->three);\n# \n# $exceptionsAsArray = array_map(function (NotNormalizableValueException\ \ $e): array {\n# return [\n# 'currentType' => $e->getCurrentType(),\n# 'expectedTypes'\ \ => $e->getExpectedTypes(),\n# 'path' => $e->getPath(),\n# 'useMessageForUser'\ \ => $e->canUseMessageForUser(),\n# 'message' => $e->getMessage(),\n# ];\n# },\ \ $th->getErrors());\n# \n# $expected = [\n# [\n# 'currentType' => 'null',\n#\ \ 'expectedTypes' => [\n# 'string',\n# ],\n# 'path' => 'two',\n# 'useMessageForUser'\ \ => true,\n# 'message' => 'Failed to create object because the class misses the\ \ \"two\" property.',\n# ],\n# ];\n# \n# $this->assertSame($expected, $exceptionsAsArray);\n\ # }\n# }\n# \n# class Model\n# {\n# private $title;\n# private $numbers;\n# \n\ # public static function fromArray($array)\n# {\n# $model = new self();\n# if\ \ (isset($array['title'])) {\n# $model->setTitle($array['title']);\n# }\n# if\ \ (isset($array['numbers'])) {\n# $model->setNumbers($array['numbers']);\n# }\n\ # \n# return $model;\n# }\n# \n# public function getTitle()\n# {\n# return $this->title;\n\ # }\n# \n# public function setTitle($title)\n# {\n# $this->title = $title;\n#\ \ }\n# \n# public function getNumbers()\n# {\n# return $this->numbers;\n# }\n\ # \n# public function setNumbers($numbers)\n# {\n# $this->numbers = $numbers;\n\ # }\n# \n# public function toArray()\n# {\n# return ['title' => $this->title,\ \ 'numbers' => $this->numbers];\n# }\n# }\n# \n# class Foo\n# {\n# private $bar;\n\ # \n# public function __construct(Bar $bar)\n# {\n# $this->bar = $bar;\n# }\n\ # }\n# \n# class Bar\n# {\n# private $value;\n# \n# public function __construct($value)\n\ # {\n# $this->value = $value;\n# }\n# }\n# \n# class DummyUnionType\n# {\n# /**\n\ # * @var \\DateTimeImmutable|bool|null" - name: v visibility: public comment: "# * @param \\DateTimeImmutable|bool|null\n# *\n# * @return $this\n# */\n\ # public function setChanged($changed): static\n# {\n# $this->changed = $changed;\n\ # \n# return $this;\n# }\n# }\n# \n# class DummyATypeForUnion\n# {\n# public $a\ \ = 0;\n# }\n# \n# class DummyBTypeForUnion\n# {\n# public $b = 1;\n# }\n# \n\ # class DummyCTypeForUnion\n# {\n# public $c = 2;\n# \n# public function __construct($c)\n\ # {\n# $this->c = $c;\n# }\n# }\n# \n# class DummyUnionWithAAndCAndB\n# {\n# /**\ \ @var DummyATypeForUnion|DummyCTypeForUnion|DummyBTypeForUnion" - name: list visibility: public comment: null - name: settings visibility: public comment: null - name: list visibility: public comment: null methods: - name: testItThrowsExceptionOnInvalidNormalizer visibility: public parameters: [] comment: null - name: testItThrowsExceptionOnInvalidEncoder visibility: public parameters: [] comment: null - name: testNormalizeNoMatch visibility: public parameters: [] comment: null - name: testNormalizeTraversable visibility: public parameters: [] comment: null - name: testNormalizeGivesPriorityToInterfaceOverTraversable visibility: public parameters: [] comment: null - name: testNormalizeOnDenormalizer visibility: public parameters: [] comment: null - name: testDenormalizeNoMatch visibility: public parameters: [] comment: null - name: testDenormalizeOnObjectThatOnlySupportsDenormalization visibility: public parameters: [] comment: null - name: testDenormalizeOnNormalizer visibility: public parameters: [] comment: null - name: testCustomNormalizerCanNormalizeCollectionsAndScalar visibility: public parameters: [] comment: null - name: testNormalizeWithSupportOnData visibility: public parameters: [] comment: null - name: testDenormalizeWithSupportOnData visibility: public parameters: [] comment: null - name: testSerialize visibility: public parameters: [] comment: null - name: testSerializeScalar visibility: public parameters: [] comment: null - name: testSerializeArrayOfScalars visibility: public parameters: [] comment: null - name: testSerializeEmpty visibility: public parameters: [] comment: null - name: testSerializeNoEncoder visibility: public parameters: [] comment: null - name: testSerializeNoNormalizer visibility: public parameters: [] comment: null - name: testDeserialize visibility: public parameters: [] comment: null - name: testDeserializeUseCache visibility: public parameters: [] comment: null - name: testDeserializeNoNormalizer visibility: public parameters: [] comment: null - name: testDeserializeWrongNormalizer visibility: public parameters: [] comment: null - name: testDeserializeNoEncoder visibility: public parameters: [] comment: null - name: testDeserializeSupported visibility: public parameters: [] comment: null - name: testDeserializeNotSupported visibility: public parameters: [] comment: null - name: testDeserializeNotSupportedMissing visibility: public parameters: [] comment: null - name: testEncode visibility: public parameters: [] comment: null - name: testDecode visibility: public parameters: [] comment: null - name: testSupportsArrayDeserialization visibility: public parameters: [] comment: null - name: testDeserializeArray visibility: public parameters: [] comment: null - name: testNormalizerAware visibility: public parameters: [] comment: null - name: testDenormalizerAware visibility: public parameters: [] comment: null - name: testDeserializeObjectConstructorWithObjectTypeHint visibility: public parameters: [] comment: null - name: testDeserializeAndSerializeAbstractObjectsWithTheClassMetadataDiscriminatorResolver visibility: public parameters: [] comment: null - name: getMetadataFor visibility: public parameters: - name: value comment: null - name: hasMetadataFor visibility: public parameters: - name: value comment: null - name: testDeserializeAndSerializeInterfacedObjectsWithTheClassMetadataDiscriminatorResolver visibility: public parameters: [] comment: null - name: testDeserializeAndSerializeInterfacedObjectsWithTheClassMetadataDiscriminatorResolverAndGroups visibility: public parameters: [] comment: null - name: testDeserializeAndSerializeNestedInterfacedObjectsWithTheClassMetadataDiscriminator visibility: public parameters: [] comment: null - name: testDeserializeAndSerializeNestedAbstractAndInterfacedObjectsWithTheClassMetadataDiscriminator visibility: public parameters: [] comment: null - name: testExceptionWhenTypeIsNotKnownInDiscriminator visibility: public parameters: [] comment: null - name: testExceptionWhenTypeIsNotInTheBodyToDeserialiaze visibility: public parameters: [] comment: null - name: testNotNormalizableValueExceptionMessageForAResource visibility: public parameters: [] comment: null - name: testNormalizeTransformEmptyArrayObjectToArray visibility: public parameters: [] comment: null - name: provideObjectOrCollectionTests visibility: public parameters: [] comment: null - name: __construct visibility: public parameters: - name: map comment: null - name: __construct visibility: public parameters: - name: map comment: null - name: testNormalizeWithCollection visibility: public parameters: - name: serializer - name: data comment: '# @dataProvider provideObjectOrCollectionTests' - name: testNormalizePreserveEmptyArrayObject visibility: public parameters: - name: serializer - name: data comment: '# @dataProvider provideObjectOrCollectionTests' - name: testNormalizeEmptyArrayAsObject visibility: public parameters: - name: serializer - name: data comment: '# @dataProvider provideObjectOrCollectionTests' - name: testNormalizeEmptyArrayAsObjectAndPreserveEmptyArrayObject visibility: public parameters: - name: serializer - name: data comment: '# @dataProvider provideObjectOrCollectionTests' - name: testNormalizeScalar visibility: public parameters: [] comment: null - name: testNormalizeScalarArray visibility: public parameters: [] comment: null - name: testDeserializeScalar visibility: public parameters: [] comment: null - name: testDeserializeLegacyScalarType visibility: public parameters: [] comment: null - name: testDeserializeScalarTypeToCustomType visibility: public parameters: [] comment: null - name: testDeserializeNonscalarTypeToScalar visibility: public parameters: [] comment: null - name: testDeserializeInconsistentScalarType visibility: public parameters: [] comment: null - name: testDeserializeScalarArray visibility: public parameters: [] comment: null - name: testDeserializeInconsistentScalarArray visibility: public parameters: [] comment: null - name: testDeserializeOnObjectWithObjectCollectionProperty visibility: public parameters: [] comment: null - name: testDeserializeWrappedScalar visibility: public parameters: [] comment: null - name: testDeserializeNullableIntInXml visibility: public parameters: [] comment: null - name: testUnionTypeDeserializable visibility: public parameters: [] comment: null - name: testUnionTypeDeserializableWithoutAllowedExtraAttributes visibility: public parameters: [] comment: null - name: testFalseBuiltInTypes visibility: public parameters: [] comment: null - name: testTrueBuiltInTypes visibility: public parameters: [] comment: null - name: testDeserializeUntypedFormat visibility: public parameters: [] comment: null - name: serializerWithClassDiscriminator visibility: private parameters: [] comment: null - name: testDeserializeAndUnwrap visibility: public parameters: [] comment: null - name: testCollectDenormalizationErrors visibility: public parameters: - name: classMetadataFactory comment: '# * @dataProvider provideCollectDenormalizationErrors' - name: testCollectDenormalizationErrors2 visibility: public parameters: - name: classMetadataFactory comment: '# * @dataProvider provideCollectDenormalizationErrors' - name: testCollectDenormalizationErrorsWithoutTypeExtractor visibility: public parameters: [] comment: null - name: testCollectDenormalizationErrorsWithConstructor visibility: public parameters: - name: classMetadataFactory comment: '# * @dataProvider provideCollectDenormalizationErrors' - name: testCollectDenormalizationErrorsWithInvalidConstructorTypes visibility: public parameters: [] comment: null - name: testCollectDenormalizationErrorsWithEnumConstructor visibility: public parameters: [] comment: null - name: testCollectDenormalizationErrorsWithWrongPropertyWithoutConstruct visibility: public parameters: [] comment: null - name: testNoCollectDenormalizationErrorsWithWrongEnumOnConstructor visibility: public parameters: [] comment: null - name: testGroupsOnClassSerialization visibility: public parameters: [] comment: null - name: provideCollectDenormalizationErrors visibility: public parameters: [] comment: null - name: testSerializerUsesSupportedTypesMethod visibility: public parameters: [] comment: null - name: testPartialDenormalizationWithMissingConstructorTypes visibility: public parameters: [] comment: null - name: fromArray visibility: public parameters: - name: array comment: null - name: getTitle visibility: public parameters: [] comment: null - name: setTitle visibility: public parameters: - name: title comment: null - name: getNumbers visibility: public parameters: [] comment: null - name: setNumbers visibility: public parameters: - name: numbers comment: null - name: toArray visibility: public parameters: [] comment: null - name: __construct visibility: public parameters: - name: bar comment: null - name: __construct visibility: public parameters: - name: value comment: null - name: setChanged visibility: public parameters: - name: changed comment: "# * @var \\DateTimeImmutable|bool|null\n# */\n# public $changed = false;\n\ # \n# /**\n# * @param \\DateTimeImmutable|bool|null\n# *\n# * @return $this" - name: __construct visibility: public parameters: - name: c comment: null - name: __construct visibility: public parameters: - name: v comment: "# @var DummyATypeForUnion|DummyCTypeForUnion|DummyBTypeForUnion */\n#\ \ public $v;\n# \n# /**\n# * @param DummyATypeForUnion|DummyCTypeForUnion|DummyBTypeForUnion\ \ $v" - name: __construct visibility: public parameters: - name: list comment: null - name: __construct visibility: public parameters: - name: list comment: null - name: count visibility: public parameters: [] comment: null - name: getIterator visibility: public parameters: [] comment: null - name: getSupportedTypes visibility: public parameters: - name: format comment: null traits: - PHPUnit\Framework\TestCase - Symfony\Component\PropertyAccess\Exception\InvalidTypeException - Symfony\Component\PropertyAccess\PropertyAccessor - Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor - Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor - Symfony\Component\PropertyInfo\PropertyInfoExtractor - Symfony\Component\Serializer\Encoder\CsvEncoder - Symfony\Component\Serializer\Encoder\JsonEncoder - Symfony\Component\Serializer\Encoder\XmlEncoder - Symfony\Component\Serializer\Exception\ExtraAttributesException - Symfony\Component\Serializer\Exception\InvalidArgumentException - Symfony\Component\Serializer\Exception\LogicException - Symfony\Component\Serializer\Exception\NotNormalizableValueException - Symfony\Component\Serializer\Exception\PartialDenormalizationException - Symfony\Component\Serializer\Exception\UnexpectedValueException - Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata - Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping - Symfony\Component\Serializer\Mapping\ClassMetadata - Symfony\Component\Serializer\Mapping\ClassMetadataInterface - Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory - Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface - Symfony\Component\Serializer\Mapping\Loader\AttributeLoader - Symfony\Component\Serializer\Normalizer\AbstractNormalizer - Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer - Symfony\Component\Serializer\Normalizer\ArrayDenormalizer - Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer - Symfony\Component\Serializer\Normalizer\CustomNormalizer - Symfony\Component\Serializer\Normalizer\DataUriNormalizer - Symfony\Component\Serializer\Normalizer\DateTimeNormalizer - Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer - Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface - Symfony\Component\Serializer\Normalizer\DenormalizerInterface - Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer - Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface - Symfony\Component\Serializer\Normalizer\NormalizerInterface - Symfony\Component\Serializer\Normalizer\ObjectNormalizer - Symfony\Component\Serializer\Normalizer\PropertyNormalizer - Symfony\Component\Serializer\Normalizer\UidNormalizer - Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer - Symfony\Component\Serializer\Serializer - Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummy - Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummyFirstChild - Symfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummySecondChild - Symfony\Component\Serializer\Tests\Fixtures\DenormalizableDummy - Symfony\Component\Serializer\Tests\Fixtures\DummyFirstChildQuux - Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface - Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberOne - Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberThree - Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberTwo - Symfony\Component\Serializer\Tests\Fixtures\DummyNullableInt - Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumConstructor - Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumProperty - Symfony\Component\Serializer\Tests\Fixtures\DummyWithObjectOrNull - Symfony\Component\Serializer\Tests\Fixtures\FalseBuiltInDummy - Symfony\Component\Serializer\Tests\Fixtures\FooImplementationDummy - Symfony\Component\Serializer\Tests\Fixtures\FooInterfaceDummyDenormalizer - Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy - Symfony\Component\Serializer\Tests\Fixtures\ObjectCollectionPropertyDummy - Symfony\Component\Serializer\Tests\Fixtures\Php74Full - Symfony\Component\Serializer\Tests\Fixtures\Php80WithOptionalConstructorParameter - Symfony\Component\Serializer\Tests\Fixtures\Php80WithPromotedTypedConstructor - Symfony\Component\Serializer\Tests\Fixtures\TraversableDummy - Symfony\Component\Serializer\Tests\Fixtures\TrueBuiltInDummy - Symfony\Component\Serializer\Tests\Fixtures\WithTypedConstructor - Symfony\Component\Serializer\Tests\Normalizer\TestDenormalizer - Symfony\Component\Serializer\Tests\Normalizer\TestNormalizer interfaces: - ClassMetadataFactoryInterface - NormalizerInterface