| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 | 
							- <?php
 - 
 - namespace Doctrine\Tests\ORM\Mapping;
 - 
 - use Doctrine\ORM\Mapping\ClassMetadata;
 - use Doctrine\ORM\Events;
 - 
 - require_once __DIR__ . '/../../TestInit.php';
 - require_once __DIR__ . '/../../Models/Global/GlobalNamespaceModel.php';
 -  
 - class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase
 - {
 -     public function testClassMetadataInstanceSerialization()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         // Test initial state
 -         $this->assertTrue(count($cm->getReflectionProperties()) == 0);
 -         $this->assertTrue($cm->reflClass instanceof \ReflectionClass);
 -         $this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->name);
 -         $this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->rootEntityName);
 -         $this->assertEquals(array(), $cm->subClasses);
 -         $this->assertEquals(array(), $cm->parentClasses);
 -         $this->assertEquals(ClassMetadata::INHERITANCE_TYPE_NONE, $cm->inheritanceType);
 - 
 -         // Customize state
 -         $cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE);
 -         $cm->setSubclasses(array("One", "Two", "Three"));
 -         $cm->setParentClasses(array("UserParent"));
 -         $cm->setCustomRepositoryClass("UserRepository");
 -         $cm->setDiscriminatorColumn(array('name' => 'disc', 'type' => 'integer'));
 -         $cm->mapOneToOne(array('fieldName' => 'phonenumbers', 'targetEntity' => 'Bar', 'mappedBy' => 'foo'));
 -         $cm->markReadOnly();
 -         $cm->addNamedQuery(array('name' => 'dql', 'query' => 'foo'));
 -         $this->assertEquals(1, count($cm->associationMappings));
 - 
 -         $serialized = serialize($cm);
 -         $cm = unserialize($serialized);
 - 
 -         // Check state
 -         $this->assertTrue(count($cm->getReflectionProperties()) > 0);
 -         $this->assertEquals('Doctrine\Tests\Models\CMS', $cm->namespace);
 -         $this->assertTrue($cm->reflClass instanceof \ReflectionClass);
 -         $this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->name);
 -         $this->assertEquals('UserParent', $cm->rootEntityName);
 -         $this->assertEquals(array('Doctrine\Tests\Models\CMS\One', 'Doctrine\Tests\Models\CMS\Two', 'Doctrine\Tests\Models\CMS\Three'), $cm->subClasses);
 -         $this->assertEquals(array('UserParent'), $cm->parentClasses);
 -         $this->assertEquals('UserRepository', $cm->customRepositoryClassName);
 -         $this->assertEquals(array('name' => 'disc', 'type' => 'integer', 'fieldName' => 'disc'), $cm->discriminatorColumn);
 -         $this->assertTrue($cm->associationMappings['phonenumbers']['type'] == ClassMetadata::ONE_TO_ONE);
 -         $this->assertEquals(1, count($cm->associationMappings));
 -         $oneOneMapping = $cm->getAssociationMapping('phonenumbers');
 -         $this->assertTrue($oneOneMapping['fetch'] == ClassMetadata::FETCH_LAZY);
 -         $this->assertEquals('phonenumbers', $oneOneMapping['fieldName']);
 -         $this->assertEquals('Doctrine\Tests\Models\CMS\Bar', $oneOneMapping['targetEntity']);
 -         $this->assertTrue($cm->isReadOnly);
 -         $this->assertEquals(array('dql' => 'foo'), $cm->namedQueries);
 -     }
 - 
 -     public function testFieldIsNullable()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         // Explicit Nullable
 -         $cm->mapField(array('fieldName' => 'status', 'nullable' => true, 'type' => 'string', 'length' => 50));
 -         $this->assertTrue($cm->isNullable('status'));
 - 
 -         // Explicit Not Nullable
 -         $cm->mapField(array('fieldName' => 'username', 'nullable' => false, 'type' => 'string', 'length' => 50));
 -         $this->assertFalse($cm->isNullable('username'));
 - 
 -         // Implicit Not Nullable
 -         $cm->mapField(array('fieldName' => 'name', 'type' => 'string', 'length' => 50));
 -         $this->assertFalse($cm->isNullable('name'), "By default a field should not be nullable.");
 -     }
 - 
 -     /**
 -      * @group DDC-115
 -      */
 -     public function testMapAssocationInGlobalNamespace()
 -     {
 -         require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
 - 
 -         $cm = new ClassMetadata('DoctrineGlobal_Article');
 -         $cm->mapManyToMany(array(
 -             'fieldName' => 'author',
 -             'targetEntity' => 'DoctrineGlobal_User',
 -             'joinTable' => array(
 -                 'name' => 'bar',
 -                 'joinColumns' => array(array('name' => 'bar_id', 'referencedColumnName' => 'id')),
 -                 'inverseJoinColumns' => array(array('name' => 'baz_id', 'referencedColumnName' => 'id')),
 -             ),
 -         ));
 - 
 -         $this->assertEquals("DoctrineGlobal_User", $cm->associationMappings['author']['targetEntity']);
 -     }
 -     
 -     public function testMapManyToManyJoinTableDefaults()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapManyToMany(
 -             array(
 -             'fieldName' => 'groups',
 -             'targetEntity' => 'CmsGroup'
 -         ));
 -         
 -         $assoc = $cm->associationMappings['groups'];
 -         //$this->assertTrue($assoc instanceof \Doctrine\ORM\Mapping\ManyToManyMapping);
 -         $this->assertEquals(array(
 -             'name' => 'cmsuser_cmsgroup',
 -             'joinColumns' => array(array('name' => 'cmsuser_id', 'referencedColumnName' => 'id', 'onDelete' => 'CASCADE')),
 -             'inverseJoinColumns' => array(array('name' => 'cmsgroup_id', 'referencedColumnName' => 'id', 'onDelete' => 'CASCADE'))
 -         ), $assoc['joinTable']);
 -         $this->assertTrue($assoc['isOnDeleteCascade']);
 -     }
 - 
 -     public function testSerializeManyToManyJoinTableCascade()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapManyToMany(
 -             array(
 -             'fieldName' => 'groups',
 -             'targetEntity' => 'CmsGroup'
 -         ));
 - 
 -         /* @var $assoc \Doctrine\ORM\Mapping\ManyToManyMapping */
 -         $assoc = $cm->associationMappings['groups'];
 -         $assoc = unserialize(serialize($assoc));
 - 
 -         $this->assertTrue($assoc['isOnDeleteCascade']);
 -     }
 - 
 -     /**
 -      * @group DDC-115
 -      */
 -     public function testSetDiscriminatorMapInGlobalNamespace()
 -     {
 -         require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
 - 
 -         $cm = new ClassMetadata('DoctrineGlobal_User');
 -         $cm->setDiscriminatorMap(array('descr' => 'DoctrineGlobal_Article', 'foo' => 'DoctrineGlobal_User'));
 - 
 -         $this->assertEquals("DoctrineGlobal_Article", $cm->discriminatorMap['descr']);
 -         $this->assertEquals("DoctrineGlobal_User", $cm->discriminatorMap['foo']);
 -     }
 - 
 -     /**
 -      * @group DDC-115
 -      */
 -     public function testSetSubClassesInGlobalNamespace()
 -     {
 -         require_once __DIR__."/../../Models/Global/GlobalNamespaceModel.php";
 - 
 -         $cm = new ClassMetadata('DoctrineGlobal_User');
 -         $cm->setSubclasses(array('DoctrineGlobal_Article'));
 - 
 -         $this->assertEquals("DoctrineGlobal_Article", $cm->subClasses[0]);
 -     }
 - 
 -     /**
 -      * @group DDC-268
 -      */
 -     public function testSetInvalidVersionMapping_ThrowsException()
 -     {
 -         $field = array();
 -         $field['fieldName'] = 'foo';
 -         $field['type'] = 'string';
 - 
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->setVersionMapping($field);
 -     }
 - 
 -     public function testGetSingleIdentifierFieldName_MultipleIdentifierEntity_ThrowsException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->isIdentifierComposite  = true;
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->getSingleIdentifierFieldName();
 -     }
 - 
 -     public function testDuplicateAssociationMappingException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $a1 = array('fieldName' => 'foo', 'sourceEntity' => 'stdClass', 'targetEntity' => 'stdClass', 'mappedBy' => 'foo');
 -         $a2 = array('fieldName' => 'foo', 'sourceEntity' => 'stdClass', 'targetEntity' => 'stdClass', 'mappedBy' => 'foo');
 - 
 -         $cm->addInheritedAssociationMapping($a1);
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->addInheritedAssociationMapping($a2);
 -     }
 - 
 -     public function testDuplicateColumnName_ThrowsMappingException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name'));
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->mapField(array('fieldName' => 'username', 'columnName' => 'name'));
 -     }
 - 
 -     public function testDuplicateColumnName_DiscriminatorColumn_ThrowsMappingException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name'));
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->setDiscriminatorColumn(array('name' => 'name'));
 -     }
 - 
 -     public function testDuplicateColumnName_DiscriminatorColumn2_ThrowsMappingException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->setDiscriminatorColumn(array('name' => 'name'));
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name'));
 -     }
 - 
 -     public function testDuplicateFieldAndAssocationMapping1_ThrowsException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name'));
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->mapOneToOne(array('fieldName' => 'name', 'targetEntity' => 'CmsUser'));
 -     }
 - 
 -     public function testDuplicateFieldAndAssocationMapping2_ThrowsException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapOneToOne(array('fieldName' => 'name', 'targetEntity' => 'CmsUser'));
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 -         $cm->mapField(array('fieldName' => 'name', 'columnName' => 'name'));
 -     }
 -     
 -     /**
 -      * @group DDC-1224
 -      */
 -     public function testGetTemporaryTableNameSchema()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->setTableName('foo.bar');
 -         
 -         $this->assertEquals('foo_bar_id_tmp', $cm->getTemporaryIdTableName());
 -     }
 - 
 -     public function testDefaultTableName()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         // When table's name is not given
 -         $primaryTable = array();
 -         $cm->setPrimaryTable($primaryTable);
 - 
 -         $this->assertEquals('CmsUser', $cm->getTableName());
 -         $this->assertEquals('CmsUser', $cm->table['name']);
 - 
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress');
 -         // When joinTable's name is not given
 -         $cm->mapManyToMany(array(
 -             'fieldName' => 'user',
 -             'targetEntity' => 'CmsUser',
 -             'inversedBy' => 'users',
 -             'joinTable' => array('joinColumns' => array(array('referencedColumnName' => 'id')),
 -                                  'inverseJoinColumns' => array(array('referencedColumnName' => 'id')))));
 -         $this->assertEquals('cmsaddress_cmsuser', $cm->associationMappings['user']['joinTable']['name']);
 -     }
 - 
 -     public function testDefaultJoinColumnName()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress');
 -         // this is really dirty, but it's the simpliest way to test whether
 -         // joinColumn's name will be automatically set to user_id
 -         $cm->mapOneToOne(array(
 -             'fieldName' => 'user',
 -             'targetEntity' => 'CmsUser',
 -             'joinColumns' => array(array('referencedColumnName' => 'id'))));
 -         $this->assertEquals('user_id', $cm->associationMappings['user']['joinColumns'][0]['name']);
 - 
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress');
 -         $cm->mapManyToMany(array(
 -             'fieldName' => 'user',
 -             'targetEntity' => 'CmsUser',
 -             'inversedBy' => 'users',
 -             'joinTable' => array('name' => 'user_CmsUser',
 -                                 'joinColumns' => array(array('referencedColumnName' => 'id')),
 -                                 'inverseJoinColumns' => array(array('referencedColumnName' => 'id')))));
 -         $this->assertEquals('cmsaddress_id', $cm->associationMappings['user']['joinTable']['joinColumns'][0]['name']);
 -         $this->assertEquals('cmsuser_id', $cm->associationMappings['user']['joinTable']['inverseJoinColumns'][0]['name']);
 -     }
 - 
 -     /**
 -      * @group DDC-886
 -      */
 -     public function testSetMultipleIdentifierSetsComposite()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapField(array('fieldName' => 'name'));
 -         $cm->mapField(array('fieldName' => 'username'));
 - 
 -         $cm->setIdentifier(array('name', 'username'));
 -         $this->assertTrue($cm->isIdentifierComposite);
 -     }
 - 
 -     /**
 -      * @group DDC-944
 -      */
 -     public function testMappingNotFound()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', "No mapping found for field 'foo' on class 'Doctrine\Tests\Models\CMS\CmsUser'.");
 -         $cm->getFieldMapping('foo');
 -     }
 - 
 -     /**
 -      * @group DDC-961
 -      */
 -     public function testJoinTableMappingDefaults()
 -     {
 -         $cm = new ClassMetadata('DoctrineGlobal_Article');
 -         $cm->mapManyToMany(array('fieldName' => 'author', 'targetEntity' => 'Doctrine\Tests\Models\CMS\CmsUser'));
 - 
 -         $this->assertEquals('doctrineglobal_article_cmsuser', $cm->associationMappings['author']['joinTable']['name']);
 -     }
 - 
 -     /**
 -      * @group DDC-117
 -      */
 -     public function testMapIdentifierAssociation()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails');
 -         $cm->mapOneToOne(array(
 -             'fieldName' => 'article',
 -             'id' => true,
 -             'targetEntity' => 'Doctrine\Tests\Models\DDC117\DDC117Article',
 -             'joinColumns' => array(),
 -         ));
 - 
 -         $this->assertTrue($cm->containsForeignIdentifier, "Identifier Association should set 'containsForeignIdentifier' boolean flag.");
 -         $this->assertEquals(array("article"), $cm->identifier);
 -     }
 - 
 -     /**
 -      * @group DDC-117
 -      */
 -     public function testOrphanRemovalIdentifierAssociation()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails');
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', 'The orphan removal option is not allowed on an association that');
 -         $cm->mapOneToOne(array(
 -             'fieldName' => 'article',
 -             'id' => true,
 -             'targetEntity' => 'Doctrine\Tests\Models\DDC117\DDC117Article',
 -             'orphanRemoval' => true,
 -             'joinColumns' => array(),
 -         ));
 -     }
 - 
 -     /**
 -      * @group DDC-117
 -      */
 -     public function testInverseIdentifierAssocation()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails');
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', 'An inverse association is not allowed to be identifier in');
 -         $cm->mapOneToOne(array(
 -             'fieldName' => 'article',
 -             'id' => true,
 -             'mappedBy' => 'details', // INVERSE!
 -             'targetEntity' => 'Doctrine\Tests\Models\DDC117\DDC117Article',
 -             'joinColumns' => array(),
 -         ));
 -     }
 - 
 -     /**
 -      * @group DDC-117
 -      */
 -     public function testIdentifierAssocationManyToMany()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\DDC117\DDC117ArticleDetails');
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException', 'Many-to-many or one-to-many associations are not allowed to be identifier in');
 -         $cm->mapManyToMany(array(
 -             'fieldName' => 'article',
 -             'id' => true,
 -             'targetEntity' => 'Doctrine\Tests\Models\DDC117\DDC117Article',
 -             'joinColumns' => array(),
 -         ));
 -     }
 - 
 -     /**
 -      * @group DDC-996
 -      */
 -     public function testEmptyFieldNameThrowsException()
 -     {
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException',
 -             "The field or association mapping misses the 'fieldName' attribute in entity 'Doctrine\Tests\Models\CMS\CmsUser'.");
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 -         $cm->mapField(array('fieldName' => ''));
 -     }
 - 
 -     public function testRetrievalOfNamedQueries()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         $this->assertEquals(0, count($cm->getNamedQueries()));
 - 
 -         $cm->addNamedQuery(array(
 -             'name'  => 'userById',
 -             'query' => 'SELECT u FROM __CLASS__ u WHERE u.id = ?1'
 -         ));
 - 
 -         $this->assertEquals(1, count($cm->getNamedQueries()));
 -     }
 - 
 -     public function testExistanceOfNamedQuery()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         $cm->addNamedQuery(array(
 -             'name'  => 'all',
 -             'query' => 'SELECT u FROM __CLASS__ u'
 -         ));
 - 
 -         $this->assertTrue($cm->hasNamedQuery('all'));
 -         $this->assertFalse($cm->hasNamedQuery('userById'));
 -     }
 - 
 -     public function testRetrieveOfNamedQuery()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         $cm->addNamedQuery(array(
 -             'name'  => 'userById',
 -             'query' => 'SELECT u FROM __CLASS__ u WHERE u.id = ?1'
 -         ));
 - 
 -         $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1', $cm->getNamedQuery('userById'));
 -     }
 - 
 -     public function testNamingCollisionNamedQueryShouldThrowException()
 -     {
 -         $cm = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
 - 
 -         $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
 - 
 -         $cm->addNamedQuery(array(
 -             'name'  => 'userById',
 -             'query' => 'SELECT u FROM __CLASS__ u WHERE u.id = ?1'
 -         ));
 - 
 -         $cm->addNamedQuery(array(
 -             'name'  => 'userById',
 -             'query' => 'SELECT u FROM __CLASS__ u WHERE u.id = ?1'
 -         ));
 -     }
 - 
 -     /**
 -      * @group DDC-1068
 -      */
 -     public function testClassCaseSensitivity()
 -     {
 -         $user = new \Doctrine\Tests\Models\CMS\CmsUser();
 -         $cm = new ClassMetadata('DOCTRINE\TESTS\MODELS\CMS\CMSUSER');
 -         $this->assertEquals('Doctrine\Tests\Models\CMS\CmsUser', $cm->name);
 -     }
 - }
 
 
  |