public function serializeObjectSerializesObjectInstancesOnlyOnceToPreventRecursion()
{
$className = 'DummyClassForRecursion' . md5(uniqid(mt_rand(), true));
eval('class ' . $className . ' {
public $name;
public $parent;
public $child;
}');
$mockObjectManager = $this->getMockBuilder(ObjectManager::class)->disableOriginalConstructor()->getMock();
$mockObjectManager->expects($this->any())->method('getObjectNameByClassName')->with($className)->will($this->returnValue(ObjectSerializer::CLASSNAME));
$mockReflectionService = $this->getMockBuilder(ReflectionService::class)->disableOriginalConstructor()->getMock();
$mockReflectionService->expects($this->any())->method('getClassPropertyNames')->with($className)->will($this->returnValue(['name', 'parent', 'child']));
$mockReflectionService->expects($this->any())->method('isPropertyTaggedWith')->will($this->returnValue(false));
$mockPersistenceManager = $this->createMock(PersistenceManagerInterface::class);
/** @var ObjectSerializer $objectSerializer */
$objectSerializer = $this->getAccessibleMock(ObjectSerializer::class, ['dummy']);
$objectSerializer->injectObjectManager($mockObjectManager);
$objectSerializer->injectReflectionService($mockReflectionService);
$objectSerializer->injectPersistenceManager($mockPersistenceManager);
$objectA = new $className();
$objectA->name = 'A';
$objectB = new $className();
$objectB->name = 'B';
$objectA->child = $objectB;
$objectB->parent = $objectA;
$expectedPropertyArray = [spl_object_hash($objectB) => [ObjectSerializer::CLASSNAME => $className, ObjectSerializer::PROPERTIES => ['name' => [ObjectSerializer::TYPE => 'simple', ObjectSerializer::VALUE => 'B'], 'parent' => [ObjectSerializer::TYPE => 'object', ObjectSerializer::VALUE => \spl_object_hash($objectA)], 'child' => [ObjectSerializer::TYPE => 'simple', ObjectSerializer::VALUE => null]]], spl_object_hash($objectA) => [ObjectSerializer::CLASSNAME => $className, ObjectSerializer::PROPERTIES => ['name' => [ObjectSerializer::TYPE => 'simple', ObjectSerializer::VALUE => 'A'], 'parent' => [ObjectSerializer::TYPE => 'simple', ObjectSerializer::VALUE => null], 'child' => [ObjectSerializer::TYPE => 'object', ObjectSerializer::VALUE => \spl_object_hash($objectB)]]]];
$actualPropertyArray = $objectSerializer->serializeObjectAsPropertyArray($objectA);
$this->assertEquals($expectedPropertyArray, $actualPropertyArray);
}