1
0
mirror of synced 2024-12-14 23:26:04 +03:00
doctrine2/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php

320 lines
9.0 KiB
PHP
Raw Normal View History

<?php
namespace Doctrine\Tests\ORM\Mapping;
use Doctrine\ORM\Mapping\ClassMetadataFactory;
use Doctrine\ORM\Tools\SchemaTool;
require_once __DIR__ . '/../../TestInit.php';
class BasicInheritanceMappingTest extends \Doctrine\Tests\OrmTestCase
{
private $_factory;
2011-12-20 01:56:19 +04:00
protected function setUp() {
$this->_factory = new ClassMetadataFactory();
$this->_factory->setEntityManager($this->_getTestEntityManager());
}
2011-12-20 01:56:19 +04:00
/**
* @expectedException Doctrine\ORM\Mapping\MappingException
*/
public function testGetMetadataForTransientClassThrowsException()
{
$this->_factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\TransientBaseClass');
}
2011-12-20 01:56:19 +04:00
public function testGetMetadataForSubclassWithTransientBaseClass()
{
$class = $this->_factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\EntitySubClass');
2011-12-20 01:56:19 +04:00
$this->assertTrue(empty($class->subClasses));
$this->assertTrue(empty($class->parentClasses));
$this->assertTrue(isset($class->fieldMappings['id']));
$this->assertTrue(isset($class->fieldMappings['name']));
}
2011-12-20 01:56:19 +04:00
public function testGetMetadataForSubclassWithMappedSuperclass()
{
$class = $this->_factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\EntitySubClass2');
2011-12-20 01:56:19 +04:00
$this->assertTrue(empty($class->subClasses));
$this->assertTrue(empty($class->parentClasses));
2011-12-20 01:56:19 +04:00
$this->assertTrue(isset($class->fieldMappings['mapped1']));
$this->assertTrue(isset($class->fieldMappings['mapped2']));
$this->assertTrue(isset($class->fieldMappings['id']));
$this->assertTrue(isset($class->fieldMappings['name']));
2011-12-20 01:56:19 +04:00
$this->assertFalse(isset($class->fieldMappings['mapped1']['inherited']));
$this->assertFalse(isset($class->fieldMappings['mapped2']['inherited']));
$this->assertFalse(isset($class->fieldMappings['transient']));
2011-12-20 01:56:19 +04:00
$this->assertTrue(isset($class->associationMappings['mappedRelated1']));
}
2011-12-20 01:56:19 +04:00
2011-09-08 19:55:55 +04:00
/**
* @group DDC-869
*/
2013-03-11 04:08:58 +04:00
public function testGetMetadataForSubclassWithMappedSuperclassWithRepository()
{
2011-09-08 01:29:43 +04:00
$class = $this->_factory->getMetadataFor('Doctrine\Tests\Models\DDC869\DDC869CreditCardPayment');
2011-12-20 01:56:19 +04:00
$this->assertTrue(isset($class->fieldMappings['id']));
2011-09-08 01:29:43 +04:00
$this->assertTrue(isset($class->fieldMappings['value']));
$this->assertTrue(isset($class->fieldMappings['creditCardNumber']));
$this->assertEquals($class->customRepositoryClassName, "Doctrine\Tests\Models\DDC869\DDC869PaymentRepository");
2011-12-20 01:56:19 +04:00
2011-09-08 01:29:43 +04:00
$class = $this->_factory->getMetadataFor('Doctrine\Tests\Models\DDC869\DDC869ChequePayment');
2011-12-20 01:56:19 +04:00
2011-09-08 01:29:43 +04:00
$this->assertTrue(isset($class->fieldMappings['id']));
$this->assertTrue(isset($class->fieldMappings['value']));
$this->assertTrue(isset($class->fieldMappings['serialNumber']));
$this->assertEquals($class->customRepositoryClassName, "Doctrine\Tests\Models\DDC869\DDC869PaymentRepository");
2011-12-20 01:56:19 +04:00
2011-09-08 19:55:55 +04:00
// override repositoryClass
$class = $this->_factory->getMetadataFor('Doctrine\Tests\ORM\Mapping\SubclassWithRepository');
2011-12-20 01:56:19 +04:00
2011-09-08 19:55:55 +04:00
$this->assertTrue(isset($class->fieldMappings['id']));
$this->assertTrue(isset($class->fieldMappings['value']));
$this->assertEquals($class->customRepositoryClassName, "Doctrine\ORM\EntityRepository");
}
/**
* @group DDC-388
*/
public function testSerializationWithPrivateFieldsFromMappedSuperclass()
{
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\EntitySubClass2');
$class2 = unserialize(serialize($class));
$class2->wakeupReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
$this->assertTrue(isset($class2->reflFields['mapped1']));
$this->assertTrue(isset($class2->reflFields['mapped2']));
2010-04-14 19:07:08 +04:00
$this->assertTrue(isset($class2->reflFields['mappedRelated1']));
}
2011-12-20 01:56:19 +04:00
/**
* @group DDC-1203
*/
2013-03-11 04:08:58 +04:00
public function testUnmappedSuperclassInHierarchy()
{
2013-03-11 04:08:58 +04:00
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\HierarchyD');
2011-12-20 01:56:19 +04:00
$this->assertTrue(isset($class->fieldMappings['id']));
$this->assertTrue(isset($class->fieldMappings['a']));
$this->assertTrue(isset($class->fieldMappings['d']));
}
2011-12-20 01:56:19 +04:00
/**
* @group DDC-1204
*/
2013-03-11 04:08:58 +04:00
public function testUnmappedEntityInHierarchy()
{
2013-03-14 23:12:20 +04:00
$this->setExpectedException('Doctrine\ORM\Mapping\MappingException', "Entity 'Doctrine\Tests\ORM\Mapping\HierarchyBEntity' has to be part of the discriminator map of 'Doctrine\Tests\ORM\Mapping\HierarchyBase' to be properly mapped in the inheritance hierarchy. Alternatively you can make 'Doctrine\Tests\ORM\Mapping\HierarchyBEntity' an abstract class to avoid this exception from occurring.");
2011-12-20 01:56:19 +04:00
2013-03-11 04:08:58 +04:00
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\HierarchyE');
}
2011-12-20 01:56:19 +04:00
/**
* @group DDC-1204
* @group DDC-1203
*/
public function testMappedSuperclassWithId()
{
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\SuperclassEntity');
2011-12-20 01:56:19 +04:00
$this->assertTrue(isset($class->fieldMappings['id']));
}
2011-12-20 01:56:19 +04:00
2011-06-25 11:57:15 +04:00
/**
* @group DDC-1156
* @group DDC-1218
*/
public function testGeneratedValueFromMappedSuperclass()
{
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\SuperclassEntity');
/* @var $class ClassMetadataInfo */
2011-12-20 01:56:19 +04:00
2011-06-25 11:57:15 +04:00
$this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator);
$this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition);
}
2011-12-20 01:56:19 +04:00
/**
* @group DDC-1156
* @group DDC-1218
*/
2013-03-11 04:08:58 +04:00
public function testSequenceDefinitionInHierarchyWithSandwichMappedSuperclass()
{
2013-03-11 04:08:58 +04:00
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\HierarchyD');
/* @var $class ClassMetadataInfo */
2011-12-20 01:56:19 +04:00
$this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator);
$this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition);
}
2011-12-20 01:56:19 +04:00
/**
* @group DDC-1156
* @group DDC-1218
*/
public function testMultipleMappedSuperclasses()
{
$class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\MediumSuperclassEntity');
/* @var $class ClassMetadataInfo */
2011-12-20 01:56:19 +04:00
$this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator);
$this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition);
}
}
class TransientBaseClass {
private $transient1;
private $transient2;
}
/** @Entity */
class EntitySubClass extends TransientBaseClass
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
}
/** @MappedSuperclass */
class MappedSuperclassBase {
/** @Column(type="integer") */
private $mapped1;
/** @Column(type="string") */
private $mapped2;
/**
* @OneToOne(targetEntity="MappedSuperclassRelated1")
* @JoinColumn(name="related1_id", referencedColumnName="id")
*/
private $mappedRelated1;
private $transient;
}
class MappedSuperclassRelated1 {}
/** @Entity */
class EntitySubClass2 extends MappedSuperclassBase {
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
}
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="type", type="string", length=20)
* @DiscriminatorMap({
2013-03-11 04:08:58 +04:00
* "c" = "HierarchyC",
* "d" = "HierarchyD",
* "e" = "HierarchyE"
* })
*/
2013-03-11 04:08:58 +04:00
abstract class HierarchyBase
{
/**
* @Column(type="integer") @Id @GeneratedValue(strategy="SEQUENCE")
* @SequenceGenerator(sequenceName="foo", initialValue=10)
* @var int
*/
public $id;
}
/**
* @MappedSuperclass
*/
2013-03-11 04:08:58 +04:00
abstract class HierarchyASuperclass extends HierarchyBase
{
/** @Column(type="string") */
public $a;
}
/**
* @Entity
*/
2013-03-11 04:08:58 +04:00
class HierarchyBEntity extends HierarchyBase
{
/** @Column(type="string") */
public $b;
}
/**
* @Entity
*/
2013-03-11 04:08:58 +04:00
class HierarchyC extends HierarchyBase
{
/** @Column(type="string") */
public $c;
}
/**
* @Entity
*/
2013-03-11 04:08:58 +04:00
class HierarchyD extends HierarchyASuperclass
{
/** @Column(type="string") */
public $d;
}
/**
* @Entity
*/
2013-03-11 04:08:58 +04:00
class HierarchyE extends HierarchyBEntity
{
/** @Column(type="string") */
public $e;
}
/**
* @Entity
*/
class SuperclassEntity extends SuperclassBase
{
}
/**
* @MappedSuperclass
*/
abstract class SuperclassBase
{
/**
2011-12-20 01:56:19 +04:00
* @Column(type="integer") @Id @GeneratedValue(strategy="SEQUENCE")
* @SequenceGenerator(sequenceName="foo", initialValue=10)
* @var int
*/
public $id;
}
/**
* @MappedSuperclass
*/
abstract class MediumSuperclassBase extends SuperclassBase
{
2011-12-20 01:56:19 +04:00
}
/**
* @Entity
*/
class MediumSuperclassEntity extends MediumSuperclassBase
{
2011-12-20 01:56:19 +04:00
}
/**
2011-09-08 19:55:55 +04:00
* @Entity(repositoryClass = "Doctrine\ORM\EntityRepository")
*/
2011-09-08 19:55:55 +04:00
class SubclassWithRepository extends \Doctrine\Tests\Models\DDC869\DDC869Payment
{
2011-12-20 01:56:19 +04:00
}