/**
* @test
*/
public function serializeObjectAsPropertyArrayForDoctrineCollectionPropertyBuildsTheCorrectArrayStructureAndStoresEveryObjectInsideSeparately()
{
$propertyClassName1 = 'DummyClass' . md5(uniqid(mt_rand(), true));
$propertyClassName2 = 'DummyClass' . md5(uniqid(mt_rand(), true));
eval('class ' . $propertyClassName1 . ' {}');
eval('class ' . $propertyClassName2 . ' {}');
$propertyClass1 = new $propertyClassName1();
$propertyClass2 = new $propertyClassName2();
$className = 'DummyClass' . md5(uniqid(mt_rand(), true));
eval('class ' . $className . ' {
private $collectionProperty;
public function __construct($object1, $object2) {
$this->collectionProperty = new \\Doctrine\\Common\\Collections\\ArrayCollection();
$this->collectionProperty->add($object1);
$this->collectionProperty->add($object2);
}
public function getCollectionProperty() {
return $this->collectionProperty;
}
}');
$mockReflectionService = $this->getMockBuilder(ReflectionService::class)->disableOriginalConstructor()->getMock();
$mockReflectionService->expects($this->at(0))->method('getClassPropertyNames')->with($className)->will($this->returnValue(['collectionProperty']));
$mockReflectionService->expects($this->at(1))->method('getClassPropertyNames')->will($this->returnValue([]));
$mockReflectionService->expects($this->at(2))->method('getClassPropertyNames')->will($this->returnValue([]));
$mockReflectionService->expects($this->at(3))->method('getClassPropertyNames')->will($this->returnValue([]));
$mockReflectionService->expects($this->any())->method('isPropertyTaggedWith')->with($className, 'collectionProperty', 'transient')->will($this->returnValue(false));
$objectSerializer = new ObjectSerializer($this->getMockBuilder(SessionInterface::class)->disableOriginalConstructor()->getMock());
$objectSerializer->injectReflectionService($mockReflectionService);
$objectHash1 = spl_object_hash($propertyClass1);
$objectHash2 = spl_object_hash($propertyClass2);
$object = new $className($propertyClass1, $propertyClass2);
$expectedArray = [$objectHash1 => [ObjectSerializer::CLASSNAME => $propertyClassName1, ObjectSerializer::PROPERTIES => []], $objectHash2 => [ObjectSerializer::CLASSNAME => $propertyClassName2, ObjectSerializer::PROPERTIES => []], spl_object_hash($object) => [ObjectSerializer::CLASSNAME => $className, ObjectSerializer::PROPERTIES => ['collectionProperty' => [ObjectSerializer::TYPE => 'Collection', ObjectSerializer::CLASSNAME => 'Doctrine\\Common\\Collections\\ArrayCollection', ObjectSerializer::VALUE => [$objectHash1, $objectHash2]]]]];
$this->assertEquals($expectedArray, $objectSerializer->serializeObjectAsPropertyArray($object));
}