/**
  * @test
  * @author Karsten Dambekalns <*****@*****.**>
  */
 public function mapConvertsArraysInSourceToObjectsIfTargetPropertyIsObject()
 {
     $this->mockObjectManager->expects($this->once())->method('getObject')->with('F3\\FLOW3\\Property\\MappingResults')->will($this->returnValue($this->mappingResults));
     $target = new \F3\FLOW3\Fixtures\ClassWithSetters();
     $source = array('property1' => array('foo' => 'bar'));
     $classSchema = new \F3\FLOW3\Reflection\ClassSchema('F3\\FLOW3\\Fixture\\Validation\\ClassWithSetters');
     $classSchema->addProperty('property1', '\\F3\\Foo\\Bar');
     $this->mockReflectionService->expects($this->once())->method('getClassSchema')->will($this->returnValue($classSchema));
     $mapper = $this->getMock('F3\\FLOW3\\Property\\PropertyMapper', array('transformToObject'));
     $mapper->expects($this->once())->method('transformToObject')->with($source['property1'], 'F3\\Foo\\Bar', 'property1');
     $mapper->injectReflectionService($this->mockReflectionService);
     $mapper->injectObjectManager($this->mockObjectManager);
     $mapper->map(array('property1'), $source, $target);
 }
 /**
  * Builds class schemata from classes annotated as entities or value objects
  *
  * @param array $classNames
  * @return void
  * @author Robert Lemke <*****@*****.**>
  * @author Karsten Dambekalns <*****@*****.**>
  */
 protected function buildClassSchemata(array $classNames)
 {
     foreach ($classNames as $className) {
         $classSchema = new \F3\FLOW3\Reflection\ClassSchema($className);
         if ($this->isClassTaggedWith($className, 'entity')) {
             $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY);
             $possibleRepositoryClassName = str_replace('\\Model\\', '\\Repository\\', $className) . 'Repository';
             if ($this->isClassReflected($possibleRepositoryClassName)) {
                 $classSchema->setAggregateRoot(TRUE);
             }
         } elseif ($this->isClassTaggedWith($className, 'valueobject')) {
             $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_VALUEOBJECT);
         }
         foreach ($this->getClassPropertyNames($className) as $propertyName) {
             if (!$this->isPropertyTaggedWith($className, $propertyName, 'transient') && $this->isPropertyTaggedWith($className, $propertyName, 'var')) {
                 $classSchema->addProperty($propertyName, implode(' ', $this->getPropertyTagValues($className, $propertyName, 'var')), $this->isPropertyTaggedWith($className, $propertyName, 'lazy'));
             }
             if ($this->isPropertyTaggedWith($className, $propertyName, 'uuid')) {
                 $classSchema->setUuidPropertyName($propertyName);
             }
             if ($this->isPropertyTaggedWith($className, $propertyName, 'identity')) {
                 $classSchema->markAsIdentityProperty($propertyName);
             }
         }
         $this->classSchemata[$className] = $classSchema;
     }
 }
 /**
  * @test
  * @author Karsten Dambekalns <*****@*****.**>
  */
 public function setModelTypeResetsUuidPropertyNameAndIdentityPropertiesForValueObjects()
 {
     $classSchema = new \F3\FLOW3\Reflection\ClassSchema('SomeClass');
     $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY);
     $classSchema->addProperty('foo', 'string');
     $classSchema->addProperty('bar', 'string');
     $classSchema->setUuidPropertyName('foo');
     $classSchema->markAsIdentityProperty('bar');
     $this->assertSame('foo', $classSchema->getUuidPropertyName());
     $this->assertSame(array('bar' => 'string'), $classSchema->getIdentityProperties());
     $classSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_VALUEOBJECT);
     $this->assertNull($classSchema->getUuidPropertyName());
     $this->assertSame(array(), $classSchema->getIdentityProperties());
 }
 /**
  * @test
  * @author Karsten Dambekalns <*****@*****.**>
  */
 public function mapSplObjectStorageCreatesSplObjectStorage()
 {
     $objectData = array(array('value' => array('mappedObject1')), array('value' => array('mappedObject2')));
     $classSchema = new \F3\FLOW3\Reflection\ClassSchema('F3\\Post');
     $classSchema->addProperty('firstProperty', 'SplObjectStorage');
     $dataMapper = $this->getMock($this->buildAccessibleProxy('F3\\FLOW3\\Persistence\\Backend\\GenericPdo\\DataMapper'), array('mapToObject'));
     $dataMapper->expects($this->at(0))->method('mapToObject')->with($objectData[0]['value'])->will($this->returnValue(new \stdClass()));
     $dataMapper->expects($this->at(1))->method('mapToObject')->with($objectData[1]['value'])->will($this->returnValue(new \stdClass()));
     $dataMapper->_call('mapSplObjectStorage', $objectData);
 }
    /**
     * @test
     * @author Karsten Dambekalns <*****@*****.**>
     */
    public function objectsFoundInCleanPropertiesAreTraversed()
    {
        $otherClassName = 'OtherClass' . uniqid();
        $fullOtherClassName = 'F3\\FLOW3\\Persistence\\Tests\\' . $otherClassName;
        eval('namespace F3\\FLOW3\\Persistence\\Tests; class ' . $otherClassName . ' implements \\F3\\FLOW3\\AOP\\ProxyInterface {
			public function FLOW3_AOP_Proxy_getProxyTargetClassName() { return \'' . $fullOtherClassName . '\';}
			public function FLOW3_AOP_Proxy_construct() {}
			public function FLOW3_AOP_Proxy_invokeJoinPoint(\\F3\\FLOW3\\AOP\\JoinPointInterface $joinPoint) {}
			public function FLOW3_AOP_Proxy_hasProperty($propertyName) { return TRUE; }
			public function FLOW3_AOP_Proxy_getProperty($propertyName) { return NULL; }
			public function FLOW3_AOP_Proxy_setProperty($propertyName, $value) {}
			public function FLOW3_Persistence_isNew() { return TRUE; }
			public function FLOW3_Persistence_isDirty($propertyName) { return TRUE; }
			public function FLOW3_Persistence_memorizeCleanState($propertyName = NULL) {}
		}');
        $someClassName = 'SomeClass' . uniqid();
        $fullSomeClassName = 'F3\\FLOW3\\Persistence\\Tests\\' . $someClassName;
        eval('namespace F3\\FLOW3\\Persistence\\Tests; class ' . $someClassName . ' implements \\F3\\FLOW3\\AOP\\ProxyInterface {
			public function FLOW3_AOP_Proxy_getProxyTargetClassName() { return \'' . $fullSomeClassName . '\';}
			public function FLOW3_AOP_Proxy_construct() {}
			public function FLOW3_AOP_Proxy_invokeJoinPoint(\\F3\\FLOW3\\AOP\\JoinPointInterface $joinPoint) {}
			public function FLOW3_AOP_Proxy_hasProperty($propertyName) { return TRUE; }
			public function FLOW3_AOP_Proxy_getProperty($propertyName) { return $this->$propertyName; }
			public function FLOW3_AOP_Proxy_setProperty($propertyName, $value) {}
			public function FLOW3_Persistence_isNew() { return TRUE; }
			public function FLOW3_Persistence_isDirty($propertyName) { return FALSE; }
			public function FLOW3_Persistence_memorizeCleanState($propertyName = NULL) {}
		}');
        $otherAggregateRootObject = new $fullOtherClassName();
        $someAggregateRootObject = new $fullSomeClassName();
        $someAggregateRootObject->property = $otherAggregateRootObject;
        $otherClassSchema = new \F3\FLOW3\Reflection\ClassSchema($otherClassName);
        $otherClassSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY);
        $otherClassSchema->setAggregateRoot(TRUE);
        $someClassSchema = new \F3\FLOW3\Reflection\ClassSchema($someClassName);
        $someClassSchema->setModelType(\F3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY);
        $someClassSchema->setAggregateRoot(TRUE);
        $someClassSchema->addProperty('property', $fullOtherClassName);
        $aggregateRootObjects = new \SplObjectStorage();
        $aggregateRootObjects->attach($someAggregateRootObject);
        $persistenceSession = new \F3\FLOW3\Persistence\Session();
        $persistenceSession->registerObject($someAggregateRootObject, '');
        $backend = $this->getMock($this->buildAccessibleProxy('F3\\FLOW3\\Persistence\\Backend\\GenericPdo\\Backend'), array('createObjectRecord', 'emitPersistedNewObject', 'emitPersistedUpdatedObject'));
        $backend->expects($this->once())->method('createObjectRecord')->with($otherAggregateRootObject);
        $backend->injectPersistenceSession($persistenceSession);
        $backend->setAggregateRootObjects($aggregateRootObjects);
        $backend->_set('visitedDuringPersistence', new \SplObjectStorage());
        $backend->_set('classSchemata', array($fullOtherClassName => $otherClassSchema, $fullSomeClassName => $someClassSchema));
        $backend->_call('persistObjects');
    }