diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1690Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1690Test.php new file mode 100644 index 000000000..ab5d2934a --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1690Test.php @@ -0,0 +1,153 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1690Parent'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC1690Child') + )); + } catch (\Exception $e) { + // Swallow all exceptions. We do not test the schema tool here. + } + } + + public function testChangeTracking() + { + $parent = new DDC1690Parent(); + $child = new DDC1690Child(); + $parent->setName('parent'); + $child->setName('child'); + + $parent->setChild($child); + $child->setParent($parent); + + $this->_em->persist($parent); + $this->_em->persist($child); + + $this->assertEquals(1, count($parent->listeners)); + $this->assertEquals(1, count($child->listeners)); + + $this->_em->flush(); + $this->_em->clear(); + + $this->assertEquals(1, count($parent->listeners)); + $this->assertEquals(1, count($child->listeners)); + + $parentId = $parent->getId(); + $childId = $child->getId(); + unset($parent, $child); + + $parent = $this->_em->find(__NAMESPACE__.'\DDC1690Parent', $parentId); + $child = $this->_em->find(__NAMESPACE__.'\DDC1690Child', $childId); + + $this->assertEquals(1, count($parent->listeners)); + $this->assertEquals(1, count($child->listeners)); + unset($parent, $child); + + $parent = $this->_em->find(__NAMESPACE__.'\DDC1690Parent', $parentId); + $child = $parent->getChild(); + + $this->assertEquals(1, count($parent->listeners)); + $this->assertEquals(1, count($child->listeners)); + unset($parent, $child); + + $child = $this->_em->find(__NAMESPACE__.'\DDC1690Child', $childId); + $parent = $child->getParent(); + + $this->assertEquals(1, count($parent->listeners)); + $this->assertEquals(1, count($child->listeners)); + } +} + +class NotifyBaseEntity implements NotifyPropertyChanged { + public $listeners = array(); + + public function addPropertyChangedListener(PropertyChangedListener $listener) { + if (!in_array($listener, $this->listeners)) { + $this->listeners[] = $listener; + } + } + + protected function onPropertyChanged($propName, $oldValue, $newValue) { + if ($this->listeners) { + foreach ($this->listeners as $listener) { + $listener->propertyChanged($this, $propName, $oldValue, $newValue); + } + } + } +} + +/** @Entity @ChangeTrackingPolicy("NOTIFY") */ +class DDC1690Parent extends NotifyBaseEntity { + /** @Id @Column(type="integer") @GeneratedValue */ + private $id; + + /** @Column */ + private $name; + + /** @OneToOne(targetEntity="DDC1690Child") */ + private $child; + + function getId() { + return $this->id; + } + + function getName() { + return $this->name; + } + + function setName($name) { + $this->onPropertyChanged('name', $this->name, $name); + $this->name = $name; + } + + function setChild($child) { + $this->child = $child; + } + + function getChild() { + return $this->child; + } +} + +/** @Entity */ +class DDC1690Child extends NotifyBaseEntity { + /** @Id @Column(type="integer") @GeneratedValue */ + private $id; + + /** @Column */ + private $name; + + /** @OneToOne(targetEntity="DDC1690Parent", mappedBy="child") */ + private $parent; + + function getId() { + return $this->id; + } + + function getName() { + return $this->name; + } + + function setName($name) { + $this->onPropertyChanged('name', $this->name, $name); + $this->name = $name; + } + + function setParent($parent) { + $this->parent = $parent; + } + + function getParent() { + return $this->parent; + } +} \ No newline at end of file