*/ class AbstractNormalizerTest extends TestCase { /** * @var AbstractNormalizerDummy */ private $normalizer; /** * @var ClassMetadataFactoryInterface|MockObject */ private $classMetadata; protected function setUp() { $loader = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\Loader\LoaderChain')->setConstructorArgs([[]])->getMock(); $this->classMetadata = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory')->setConstructorArgs([$loader])->getMock(); $this->normalizer = new AbstractNormalizerDummy($this->classMetadata); } public function testGetAllowedAttributesAsString() { $classMetadata = new ClassMetadata('c'); $a1 = new AttributeMetadata('a1'); $classMetadata->addAttributeMetadata($a1); $a2 = new AttributeMetadata('a2'); $a2->addGroup('test'); $classMetadata->addAttributeMetadata($a2); $a3 = new AttributeMetadata('a3'); $a3->addGroup('other'); $classMetadata->addAttributeMetadata($a3); $a4 = new AttributeMetadata('a4'); $a4->addGroup('test'); $a4->addGroup('other'); $classMetadata->addAttributeMetadata($a4); $this->classMetadata->method('getMetadataFor')->willReturn($classMetadata); $result = $this->normalizer->getAllowedAttributes('c', [AbstractNormalizer::GROUPS => ['test']], true); $this->assertEquals(['a2', 'a4'], $result); $result = $this->normalizer->getAllowedAttributes('c', [AbstractNormalizer::GROUPS => ['other']], true); $this->assertEquals(['a3', 'a4'], $result); } public function testGetAllowedAttributesAsObjects() { $classMetadata = new ClassMetadata('c'); $a1 = new AttributeMetadata('a1'); $classMetadata->addAttributeMetadata($a1); $a2 = new AttributeMetadata('a2'); $a2->addGroup('test'); $classMetadata->addAttributeMetadata($a2); $a3 = new AttributeMetadata('a3'); $a3->addGroup('other'); $classMetadata->addAttributeMetadata($a3); $a4 = new AttributeMetadata('a4'); $a4->addGroup('test'); $a4->addGroup('other'); $classMetadata->addAttributeMetadata($a4); $this->classMetadata->method('getMetadataFor')->willReturn($classMetadata); $result = $this->normalizer->getAllowedAttributes('c', [AbstractNormalizer::GROUPS => ['test']], false); $this->assertEquals([$a2, $a4], $result); $result = $this->normalizer->getAllowedAttributes('c', [AbstractNormalizer::GROUPS => ['other']], false); $this->assertEquals([$a3, $a4], $result); } public function testObjectToPopulateWithProxy() { $proxyDummy = new ProxyDummy(); $context = [AbstractNormalizer::OBJECT_TO_POPULATE => $proxyDummy]; $normalizer = new ObjectNormalizer(); $normalizer->denormalize(['foo' => 'bar'], 'Symfony\Component\Serializer\Tests\Fixtures\ToBeProxyfiedDummy', null, $context); $this->assertSame('bar', $proxyDummy->getFoo()); } public function testObjectWithStaticConstructor() { $normalizer = new StaticConstructorNormalizer(); $dummy = $normalizer->denormalize(['foo' => 'baz'], StaticConstructorDummy::class); $this->assertInstanceOf(StaticConstructorDummy::class, $dummy); $this->assertEquals('baz', $dummy->quz); $this->assertNull($dummy->foo); } /** * @requires PHP 7.1 */ public function testObjectWithNullableConstructorArgument() { $normalizer = new ObjectNormalizer(); $dummy = $normalizer->denormalize(['foo' => null], NullableConstructorArgumentDummy::class); $this->assertNull($dummy->getFoo()); } /** * @dataProvider getNormalizer * * @requires PHP 5.6 */ public function testObjectWithVariadicConstructorTypedArguments(AbstractNormalizer $normalizer) { $d1 = new Dummy(); $d1->foo = 'Foo'; $d1->bar = 'Bar'; $d1->baz = 'Baz'; $d1->qux = 'Quz'; $d2 = new Dummy(); $d2->foo = 'FOO'; $d2->bar = 'BAR'; $d2->baz = 'BAZ'; $d2->qux = 'QUZ'; $obj = new VariadicConstructorTypedArgsDummy($d1, $d2); $serializer = new Serializer([$normalizer], [new JsonEncoder()]); $normalizer->setSerializer($serializer); $data = $serializer->serialize($obj, 'json'); $dummy = $normalizer->denormalize(json_decode($data, true), VariadicConstructorTypedArgsDummy::class); $this->assertInstanceOf(VariadicConstructorTypedArgsDummy::class, $dummy); $this->assertCount(2, $dummy->getFoo()); foreach ($dummy->getFoo() as $foo) { $this->assertInstanceOf(Dummy::class, $foo); } $dummy = $serializer->deserialize($data, VariadicConstructorTypedArgsDummy::class, 'json'); $this->assertInstanceOf(VariadicConstructorTypedArgsDummy::class, $dummy); $this->assertCount(2, $dummy->getFoo()); foreach ($dummy->getFoo() as $foo) { $this->assertInstanceOf(Dummy::class, $foo); } } public function getNormalizer() { $extractor = new PhpDocExtractor(); yield [new PropertyNormalizer()]; yield [new PropertyNormalizer(null, null, $extractor)]; yield [new ObjectNormalizer()]; yield [new ObjectNormalizer(null, null, null, $extractor)]; } }