public function testCreate()
{
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
$dummyResourceMetadata = (new ResourceMetadata())->withAttributes(['normalization_context' => ['groups' => ['dummy_read']], 'denormalization_context' => ['groups' => ['dummy_write']]]);
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn($dummyResourceMetadata)->shouldBeCalled();
$resourceMetadataFactoryProphecy->create(RelatedDummy::class)->willReturn(new ResourceMetadata())->shouldBeCalled();
$resourceMetadataFactory = $resourceMetadataFactoryProphecy->reveal();
$serializerClassMetadataFactoryProphecy = $this->prophesize(SerializerClassMetadataFactoryInterface::class);
$dummySerializerClassMetadata = new SerializerClassMetadata(Dummy::class);
$fooSerializerAttributeMetadata = new SerializerAttributeMetadata('foo');
$fooSerializerAttributeMetadata->addGroup('dummy_read');
$fooSerializerAttributeMetadata->addGroup('dummy_write');
$dummySerializerClassMetadata->addAttributeMetadata($fooSerializerAttributeMetadata);
$relatedDummySerializerAttributeMetadata = new SerializerAttributeMetadata('relatedDummy');
$relatedDummySerializerAttributeMetadata->addGroup('dummy_read');
$relatedDummySerializerAttributeMetadata->addGroup('dummy_write');
$dummySerializerClassMetadata->addAttributeMetadata($relatedDummySerializerAttributeMetadata);
$nameConvertedSerializerAttributeMetadata = new SerializerAttributeMetadata('nameConverted');
$dummySerializerClassMetadata->addAttributeMetadata($nameConvertedSerializerAttributeMetadata);
$serializerClassMetadataFactoryProphecy->getMetadataFor(Dummy::class)->willReturn($dummySerializerClassMetadata)->shouldBeCalled();
$relatedDummySerializerClassMetadata = new SerializerClassMetadata(RelatedDummy::class);
$idSerializerAttributeMetadata = new SerializerAttributeMetadata('id');
$idSerializerAttributeMetadata->addGroup('dummy_read');
$relatedDummySerializerClassMetadata->addAttributeMetadata($idSerializerAttributeMetadata);
$nameSerializerAttributeMetadata = new SerializerAttributeMetadata('name');
$nameSerializerAttributeMetadata->addGroup('dummy_read');
$relatedDummySerializerClassMetadata->addAttributeMetadata($nameSerializerAttributeMetadata);
$serializerClassMetadataFactoryProphecy->getMetadataFor(RelatedDummy::class)->willReturn($relatedDummySerializerClassMetadata)->shouldBeCalled();
$serializerClassMetadataFactory = $serializerClassMetadataFactoryProphecy->reveal();
$decoratedProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
$fooPropertyMetadata = (new PropertyMetadata())->withType(new Type(Type::BUILTIN_TYPE_ARRAY, true))->withReadable(false)->withWritable(true);
$decoratedProphecy->create(Dummy::class, 'foo', [])->willReturn($fooPropertyMetadata)->shouldBeCalled();
$relatedDummyPropertyMetadata = (new PropertyMetadata())->withType(new Type(Type::BUILTIN_TYPE_OBJECT, true, RelatedDummy::class));
$decoratedProphecy->create(Dummy::class, 'relatedDummy', [])->willReturn($relatedDummyPropertyMetadata)->shouldBeCalled();
$nameConvertedPropertyMetadata = (new PropertyMetadata())->withType(new Type(Type::BUILTIN_TYPE_STRING, true));
$decoratedProphecy->create(Dummy::class, 'nameConverted', [])->willReturn($nameConvertedPropertyMetadata)->shouldBeCalled();
$decorated = $decoratedProphecy->reveal();
$serializerPropertyMetadataFactory = new SerializerPropertyMetadataFactory($resourceMetadataFactory, $serializerClassMetadataFactory, $decorated);
$actual = [];
$actual[] = $serializerPropertyMetadataFactory->create(Dummy::class, 'foo');
$actual[] = $serializerPropertyMetadataFactory->create(Dummy::class, 'relatedDummy');
$actual[] = $serializerPropertyMetadataFactory->create(Dummy::class, 'nameConverted');
$this->assertInstanceOf(PropertyMetadata::class, $actual[0]);
$this->assertFalse($actual[0]->isReadable());
$this->assertTrue($actual[0]->isWritable());
$this->assertInstanceOf(PropertyMetadata::class, $actual[1]);
$this->assertTrue($actual[1]->isReadable());
$this->assertTrue($actual[1]->isWritable());
$this->assertTrue($actual[1]->isReadableLink());
$this->assertFalse($actual[1]->isWritableLink());
$this->assertInstanceOf(PropertyMetadata::class, $actual[2]);
$this->assertFalse($actual[2]->isReadable());
$this->assertFalse($actual[2]->isWritable());
}