2 namespace Doctrine\Tests\ORM\Functional;
4 use Doctrine\Common\Collections\ArrayCollection,
5 Doctrine\Common\NotifyPropertyChanged,
6 Doctrine\Common\PropertyChangedListener;
8 require_once __DIR__ . '/../../TestInit.php';
15 class NotifyPolicyTest extends \Doctrine\Tests\OrmFunctionalTestCase
17 protected function setUp() {
20 $this->_schemaTool->createSchema(array(
21 $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\NotifyUser'),
22 $this->_em->getClassMetadata('Doctrine\Tests\ORM\Functional\NotifyGroup')
24 } catch (\Exception $e) {
25 // Swallow all exceptions. We do not test the schema tool here.
29 public function testChangeTracking()
31 //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
33 $user = new NotifyUser();
34 $group = new NotifyGroup();
35 $user->setName('roman');
36 $group->setName('dev');
38 $user->getGroups()->add($group);
39 $group->getUsers()->add($user);
41 $this->_em->persist($user);
42 $this->_em->persist($group);
44 $this->assertEquals(1, count($user->listeners));
45 $this->assertEquals(1, count($group->listeners));
50 $this->assertEquals(1, count($user->listeners));
51 $this->assertEquals(1, count($group->listeners));
53 $userId = $user->getId();
54 $groupId = $group->getId();
57 $user = $this->_em->find(__NAMESPACE__.'\NotifyUser', $userId);
58 $this->assertEquals(1, $user->getGroups()->count());
59 $group = $this->_em->find(__NAMESPACE__.'\NotifyGroup', $groupId);
60 $this->assertEquals(1, $group->getUsers()->count());
62 $this->assertEquals(1, count($user->listeners));
63 $this->assertEquals(1, count($group->listeners));
65 $group2 = new NotifyGroup();
66 $group2->setName('nerds');
67 $this->_em->persist($group2);
68 $user->getGroups()->add($group2);
69 $group2->getUsers()->add($user);
71 $group->setName('geeks');
76 $this->assertEquals(1, count($user->listeners));
77 $this->assertEquals(1, count($group->listeners));
79 $group2Id = $group2->getId();
80 unset($group2, $user);
82 $user = $this->_em->find(__NAMESPACE__.'\NotifyUser', $userId);
83 $this->assertEquals(2, $user->getGroups()->count());
84 $group2 = $this->_em->find(__NAMESPACE__.'\NotifyGroup', $group2Id);
85 $this->assertEquals(1, $group2->getUsers()->count());
86 $group = $this->_em->find(__NAMESPACE__.'\NotifyGroup', $groupId);
87 $this->assertEquals(1, $group->getUsers()->count());
88 $this->assertEquals('geeks', $group->getName());
92 class NotifyBaseEntity implements NotifyPropertyChanged {
93 public $listeners = array();
95 public function addPropertyChangedListener(PropertyChangedListener $listener) {
96 $this->listeners[] = $listener;
99 protected function onPropertyChanged($propName, $oldValue, $newValue) {
100 if ($this->listeners) {
101 foreach ($this->listeners as $listener) {
102 $listener->propertyChanged($this, $propName, $oldValue, $newValue);
108 /** @Entity @ChangeTrackingPolicy("NOTIFY") */
109 class NotifyUser extends NotifyBaseEntity {
110 /** @Id @Column(type="integer") @GeneratedValue */
116 /** @ManyToMany(targetEntity="NotifyGroup") */
119 function __construct() {
120 $this->groups = new ArrayCollection;
131 function setName($name) {
132 $this->onPropertyChanged('name', $this->name, $name);
136 function getGroups() {
137 return $this->groups;
142 class NotifyGroup extends NotifyBaseEntity {
143 /** @Id @Column(type="integer") @GeneratedValue */
149 /** @ManyToMany(targetEntity="NotifyUser", mappedBy="groups") */
152 function __construct() {
153 $this->users = new ArrayCollection;
164 function setName($name) {
165 $this->onPropertyChanged('name', $this->name, $name);
169 function getUsers() {