3 namespace Doctrine\Tests\ORM\Mapping;
5 use Doctrine\ORM\Mapping\ClassMetadata;
6 use Doctrine\ORM\Events;
8 require_once __DIR__ . '/../../TestInit.php';
10 class AnnotationDriverTest extends AbstractMappingDriverTest
15 public function testLoadMetadataForNonEntityThrowsException()
17 $cm = new ClassMetadata('stdClass');
18 $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
19 $reader = new \Doctrine\Common\Annotations\AnnotationReader(new \Doctrine\Common\Cache\ArrayCache());
20 $annotationDriver = new \Doctrine\ORM\Mapping\Driver\AnnotationDriver($reader);
22 $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
23 $annotationDriver->loadMetadataForClass('stdClass', $cm);
29 public function testColumnWithMissingTypeDefaultsToString()
31 $cm = new ClassMetadata('Doctrine\Tests\ORM\Mapping\ColumnWithoutType');
32 $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
33 $annotationDriver = $this->_loadDriver();
35 $annotationDriver->loadMetadataForClass('Doctrine\Tests\ORM\Mapping\InvalidColumn', $cm);
36 $this->assertEquals('string', $cm->fieldMappings['id']['type']);
42 public function testGetAllClassNamesIsIdempotent()
44 $annotationDriver = $this->_loadDriverForCMSModels();
45 $original = $annotationDriver->getAllClassNames();
47 $annotationDriver = $this->_loadDriverForCMSModels();
48 $afterTestReset = $annotationDriver->getAllClassNames();
50 $this->assertEquals($original, $afterTestReset);
56 public function testGetAllClassNamesIsIdempotentEvenWithDifferentDriverInstances()
58 $annotationDriver = $this->_loadDriverForCMSModels();
59 $original = $annotationDriver->getAllClassNames();
61 $annotationDriver = $this->_loadDriverForCMSModels();
62 $afterTestReset = $annotationDriver->getAllClassNames();
64 $this->assertEquals($original, $afterTestReset);
70 public function testGetAllClassNamesReturnsAlreadyLoadedClassesIfAppropriate()
72 $rightClassName = 'Doctrine\Tests\Models\CMS\CmsUser';
73 $this->_ensureIsLoaded($rightClassName);
75 $annotationDriver = $this->_loadDriverForCMSModels();
76 $classes = $annotationDriver->getAllClassNames();
78 $this->assertContains($rightClassName, $classes);
84 public function testGetClassNamesReturnsOnlyTheAppropriateClasses()
86 $extraneousClassName = 'Doctrine\Tests\Models\ECommerce\ECommerceCart';
87 $this->_ensureIsLoaded($extraneousClassName);
89 $annotationDriver = $this->_loadDriverForCMSModels();
90 $classes = $annotationDriver->getAllClassNames();
92 $this->assertNotContains($extraneousClassName, $classes);
95 protected function _loadDriverForCMSModels()
97 $annotationDriver = $this->_loadDriver();
98 $annotationDriver->addPaths(array(__DIR__ . '/../../Models/CMS/'));
99 return $annotationDriver;
102 protected function _loadDriver()
104 return $this->createAnnotationDriver();
107 protected function _ensureIsLoaded($entityClassName)
109 new $entityClassName;
115 * Entities for this test are in AbstractMappingDriverTest
117 public function testJoinTablesWithMappedSuperclassForAnnotationDriver()
119 $annotationDriver = $this->_loadDriver();
120 $annotationDriver->addPaths(array(__DIR__ . '/../../Models/DirectoryTree/'));
122 $em = $this->_getTestEntityManager();
123 $em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
124 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
125 $factory->setEntityManager($em);
127 $classPage = $factory->getMetadataFor('Doctrine\Tests\Models\DirectoryTree\File');
128 $this->assertEquals('Doctrine\Tests\Models\DirectoryTree\File', $classPage->associationMappings['parentDirectory']['sourceEntity']);
130 $classDirectory = $factory->getMetadataFor('Doctrine\Tests\Models\DirectoryTree\Directory');
131 $this->assertEquals('Doctrine\Tests\Models\DirectoryTree\Directory', $classDirectory->associationMappings['parentDirectory']['sourceEntity']);
137 public function testInvalidMappedSuperClassWithManyToManyAssociation()
139 $annotationDriver = $this->_loadDriver();
141 $em = $this->_getTestEntityManager();
142 $em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
143 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
144 $factory->setEntityManager($em);
146 $this->setExpectedException('Doctrine\ORM\Mapping\MappingException',
147 "It is illegal to put an inverse side one-to-many or many-to-many association on ".
148 "mapped superclass 'Doctrine\Tests\ORM\Mapping\InvalidMappedSuperClass#users'");
149 $usingInvalidMsc = $factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\UsingInvalidMappedSuperClass');
155 public function testInvalidMappedSuperClassWithInheritanceInformation()
157 $annotationDriver = $this->_loadDriver();
159 $em = $this->_getTestEntityManager();
160 $em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
161 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
162 $factory->setEntityManager($em);
164 $this->setExpectedException('Doctrine\ORM\Mapping\MappingException',
165 "Its not supported to define inheritance information on a mapped ".
166 "superclass 'Doctrine\Tests\ORM\Mapping\MappedSuperClassInheritence'.");
167 $usingInvalidMsc = $factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\MappedSuperClassInheritence');
173 public function testInheritanceSkipsParentLifecycleCallbacks()
175 $annotationDriver = $this->_loadDriver();
177 $cm = new ClassMetadata('Doctrine\Tests\ORM\Mapping\AnnotationChild');
178 $em = $this->_getTestEntityManager();
179 $em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
180 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
181 $factory->setEntityManager($em);
183 $cm = $factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\AnnotationChild');
184 $this->assertEquals(array("postLoad" => array("postLoad"), "preUpdate" => array("preUpdate")), $cm->lifecycleCallbacks);
186 $cm = $factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\AnnotationParent');
187 $this->assertEquals(array("postLoad" => array("postLoad"), "preUpdate" => array("preUpdate")), $cm->lifecycleCallbacks);
193 public function testMappedSuperclassInMiddleOfInheritanceHierachy()
195 $annotationDriver = $this->_loadDriver();
197 $em = $this->_getTestEntityManager();
198 $em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
199 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
200 $factory->setEntityManager($em);
202 $cm = $factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\ChildEntity');
205 public function testInvalidFetchOptionThrowsException()
207 $annotationDriver = $this->_loadDriver();
209 $em = $this->_getTestEntityManager();
210 $em->getConfiguration()->setMetadataDriverImpl($annotationDriver);
211 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
212 $factory->setEntityManager($em);
214 $this->setExpectedException('Doctrine\ORM\Mapping\MappingException',
215 "Entity 'Doctrine\Tests\ORM\Mapping\InvalidFetchOption' has a mapping with invalid fetch mode 'eager");
216 $cm = $factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\InvalidFetchOption');
223 class ColumnWithoutType
232 class InvalidMappedSuperClass
235 * @ManyToMany(targetEntity="Doctrine\Tests\Models\CMS\CmsUser", mappedBy="invalid")
243 class UsingInvalidMappedSuperClass extends InvalidMappedSuperClass
246 * @Id @Column(type="integer") @GeneratedValue
253 * @InheritanceType("JOINED")
254 * @DiscriminatorMap({"test" = "ColumnWithoutType"})
256 class MappedSuperClassInheritence
263 * @InheritanceType("JOINED")
264 * @DiscriminatorMap({"parent" = "AnnotationParent", "child" = "AnnotationChild"})
265 * @HasLifecycleCallbacks
267 class AnnotationParent
270 * @Id @Column(type="integer") @GeneratedValue
277 public function postLoad()
285 public function preUpdate()
293 * @HasLifecycleCallbacks
295 class AnnotationChild extends AnnotationParent
302 * @InheritanceType("SINGLE_TABLE")
303 * @DiscriminatorMap({"s"="SuperEntity", "c"="ChildEntity"})
307 /** @Id @Column(type="string") */
314 class MiddleMappedSuperclass extends SuperEntity
316 /** @Column(type="string") */
323 class ChildEntity extends MiddleMappedSuperclass
326 * @Column(type="string")
334 class InvalidFetchOption
337 * @OneToMany(targetEntity="Doctrine\Tests\Models\CMS\CmsUser", fetch="eager")