2009-07-30 19:16:02 +04:00
< ? php
namespace Doctrine\Tests\ORM\Mapping ;
use Doctrine\ORM\Mapping\ClassMetadataFactory ;
2011-06-16 00:27:24 +04:00
use Doctrine\ORM\Tools\SchemaTool ;
2009-07-30 19:16:02 +04:00
require_once __DIR__ . '/../../TestInit.php' ;
class BasicInheritanceMappingTest extends \Doctrine\Tests\OrmTestCase
{
private $_factory ;
protected function setUp () {
2010-11-27 22:53:26 +03:00
$this -> _factory = new ClassMetadataFactory ();
$this -> _factory -> setEntityManager ( $this -> _getTestEntityManager ());
2009-07-30 19:16:02 +04:00
}
/**
2010-02-03 00:17:00 +03:00
* @ expectedException Doctrine\ORM\Mapping\MappingException
2009-07-30 19:16:02 +04:00
*/
public function testGetMetadataForTransientClassThrowsException ()
{
$this -> _factory -> getMetadataFor ( 'Doctrine\Tests\ORM\Mapping\TransientBaseClass' );
}
public function testGetMetadataForSubclassWithTransientBaseClass ()
{
$class = $this -> _factory -> getMetadataFor ( 'Doctrine\Tests\ORM\Mapping\EntitySubClass' );
$this -> assertTrue ( empty ( $class -> subClasses ));
$this -> assertTrue ( empty ( $class -> parentClasses ));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'id' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'name' ]));
}
public function testGetMetadataForSubclassWithMappedSuperclass ()
{
$class = $this -> _factory -> getMetadataFor ( 'Doctrine\Tests\ORM\Mapping\EntitySubClass2' );
$this -> assertTrue ( empty ( $class -> subClasses ));
$this -> assertTrue ( empty ( $class -> parentClasses ));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'mapped1' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'mapped2' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'id' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'name' ]));
$this -> assertFalse ( isset ( $class -> fieldMappings [ 'mapped1' ][ 'inherited' ]));
$this -> assertFalse ( isset ( $class -> fieldMappings [ 'mapped2' ][ 'inherited' ]));
$this -> assertFalse ( isset ( $class -> fieldMappings [ 'transient' ]));
$this -> assertTrue ( isset ( $class -> associationMappings [ 'mappedRelated1' ]));
}
2011-09-08 00:27:05 +04:00
public function testGetMetadataForSubclassWithMappedSuperclassWhithRepository ()
{
$class = $this -> _factory -> getMetadataFor ( 'Doctrine\Tests\ORM\Mapping\SubclassWithoutRepository' );
$this -> assertTrue ( empty ( $class -> subClasses ));
$this -> assertTrue ( empty ( $class -> parentClasses ));
$this -> assertEquals ( $class -> customRepositoryClassName , " App \R eposotories \ SuperRepository " );
$class = $this -> _factory -> getMetadataFor ( 'Doctrine\Tests\ORM\Mapping\SubclassWithRepository' );
$this -> assertTrue ( empty ( $class -> subClasses ));
2011-09-08 01:29:43 +04:00
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'name' ]));
$this -> assertEquals ( $class -> customRepositoryClassName , " App \R eposotories \ SubRepository " );
$class = $this -> _factory -> getMetadataFor ( 'Doctrine\Tests\Models\DDC869\DDC869CreditCardPayment' );
2011-09-08 00:27:05 +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 \T ests \ Models \ DDC869 \ DDC869PaymentRepository " );
2011-09-08 00:27:05 +04:00
2011-09-08 01:29:43 +04:00
$class = $this -> _factory -> getMetadataFor ( 'Doctrine\Tests\Models\DDC869\DDC869ChequePayment' );
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'id' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'value' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'serialNumber' ]));
$this -> assertEquals ( $class -> customRepositoryClassName , " Doctrine \T ests \ Models \ DDC869 \ DDC869PaymentRepository " );
2011-09-08 00:27:05 +04:00
}
2010-04-13 02:49:19 +04:00
/**
* @ group DDC - 388
*/
public function testSerializationWithPrivateFieldsFromMappedSuperclass ()
{
$class = $this -> _factory -> getMetadataFor ( __NAMESPACE__ . '\\EntitySubClass2' );
$class2 = unserialize ( serialize ( $class ));
$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' ]));
2010-04-13 02:49:19 +04:00
}
2011-06-16 00:27:24 +04:00
/**
* @ group DDC - 1203
*/
public function testUnmappedSuperclassInHierachy ()
{
$class = $this -> _factory -> getMetadataFor ( __NAMESPACE__ . '\\HierachyD' );
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'id' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'a' ]));
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'd' ]));
}
/**
* @ group DDC - 1204
*/
public function testUnmappedEntityInHierachy ()
{
2011-06-30 22:57:29 +04:00
$this -> setExpectedException ( 'Doctrine\ORM\Mapping\MappingException' , " Entity 'Doctrine \T ests \ ORM \ Mapping \ HierachyBEntity' has to be part of the descriminator map of 'Doctrine \T ests \ ORM \ Mapping \ HierachyBase' to be properly mapped in the inheritance hierachy. Alternatively you can make 'Doctrine \T ests \ ORM \ Mapping \ HierachyBEntity' an abstract class to avoid this exception from occuring. " );
2011-06-16 00:27:24 +04:00
$class = $this -> _factory -> getMetadataFor ( __NAMESPACE__ . '\\HierachyE' );
}
2011-06-17 01:00:59 +04:00
/**
* @ group DDC - 1204
* @ group DDC - 1203
*/
public function testMappedSuperclassWithId ()
{
$class = $this -> _factory -> getMetadataFor ( __NAMESPACE__ . '\\SuperclassEntity' );
$this -> assertTrue ( isset ( $class -> fieldMappings [ 'id' ]));
}
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 */
$this -> assertInstanceOf ( 'Doctrine\ORM\Id\SequenceGenerator' , $class -> idGenerator );
$this -> assertEquals ( array ( 'allocationSize' => 1 , 'initialValue' => 10 , 'sequenceName' => 'foo' ), $class -> sequenceGeneratorDefinition );
}
2011-06-25 12:20:37 +04:00
/**
* @ group DDC - 1156
* @ group DDC - 1218
*/
public function testSequenceDefinitionInHierachyWithSandwichMappedSuperclass ()
{
$class = $this -> _factory -> getMetadataFor ( __NAMESPACE__ . '\\HierachyD' );
/* @var $class ClassMetadataInfo */
$this -> assertInstanceOf ( 'Doctrine\ORM\Id\SequenceGenerator' , $class -> idGenerator );
$this -> assertEquals ( array ( 'allocationSize' => 1 , 'initialValue' => 10 , 'sequenceName' => 'foo' ), $class -> sequenceGeneratorDefinition );
}
/**
* @ group DDC - 1156
* @ group DDC - 1218
*/
public function testMultipleMappedSuperclasses ()
{
$class = $this -> _factory -> getMetadataFor ( __NAMESPACE__ . '\\MediumSuperclassEntity' );
/* @var $class ClassMetadataInfo */
$this -> assertInstanceOf ( 'Doctrine\ORM\Id\SequenceGenerator' , $class -> idGenerator );
$this -> assertEquals ( array ( 'allocationSize' => 1 , 'initialValue' => 10 , 'sequenceName' => 'foo' ), $class -> sequenceGeneratorDefinition );
}
2009-07-30 19:16:02 +04:00
}
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 ;
}
/** @Entity */
class EntitySubClass2 extends MappedSuperclassBase {
/** @Id @Column(type="integer") */
private $id ;
/** @Column(type="string") */
private $name ;
}
2011-06-16 00:27:24 +04:00
/**
* @ Entity
* @ InheritanceType ( " SINGLE_TABLE " )
* @ DiscriminatorColumn ( name = " type " , type = " string " , length = 20 )
* @ DiscriminatorMap ({
* " c " = " HierachyC " ,
* " d " = " HierachyD " ,
* " e " = " HierachyE "
* })
*/
abstract class HierachyBase
{
/**
2011-06-25 12:20:37 +04:00
* @ Column ( type = " integer " ) @ Id @ GeneratedValue ( strategy = " SEQUENCE " )
* @ SequenceGenerator ( sequenceName = " foo " , initialValue = " 10 " )
2011-06-16 00:27:24 +04:00
* @ var int
*/
public $id ;
}
/**
* @ MappedSuperclass
*/
abstract class HierachyASuperclass extends HierachyBase
{
/** @Column(type="string") */
public $a ;
}
/**
* @ Entity
*/
2011-06-30 22:57:29 +04:00
class HierachyBEntity extends HierachyBase
2011-06-16 00:27:24 +04:00
{
/** @Column(type="string") */
public $b ;
}
/**
* @ Entity
*/
class HierachyC extends HierachyBase
{
/** @Column(type="string") */
public $c ;
}
/**
* @ Entity
*/
class HierachyD extends HierachyASuperclass
{
/** @Column(type="string") */
public $d ;
}
/**
* @ Entity
*/
class HierachyE extends HierachyBEntity
{
/** @Column(type="string") */
public $e ;
2011-06-17 01:00:59 +04:00
}
/**
* @ Entity
*/
class SuperclassEntity extends SuperclassBase
{
}
/**
* @ MappedSuperclass
*/
abstract class SuperclassBase
{
/**
2011-06-25 12:20:37 +04:00
* @ Column ( type = " integer " ) @ Id @ GeneratedValue ( strategy = " SEQUENCE " )
* @ SequenceGenerator ( sequenceName = " foo " , initialValue = " 10 " )
2011-06-17 01:00:59 +04:00
* @ var int
*/
public $id ;
2011-06-25 12:20:37 +04:00
}
/**
* @ MappedSuperclass
*/
abstract class MediumSuperclassBase extends SuperclassBase
{
}
/**
* @ Entity
*/
class MediumSuperclassEntity extends MediumSuperclassBase
{
2011-09-08 00:27:05 +04:00
}
/**
* @ MappedSuperclass ( repositoryClass = " App \R eposotories \ SuperRepository " )
*/
abstract class SuperclassBaseWithRepository
{
/** @Id @Column(type="integer") */
public $id ;
/** @Column(type="string") */
public $name ;
}
/**
* @ Entity
*/
class SubclassWithoutRepository extends SuperclassBaseWithRepository
{
}
/**
* @ Entity ( repositoryClass = " App \R eposotories \ SubRepository " )
*/
class SubclassWithRepository extends SuperclassBaseWithRepository
{
2011-06-16 00:27:24 +04:00
}