/Tests/ContainerAwareEventManagerTest.php

https://github.com/symfony/DoctrineBridge · PHP · 244 lines · 189 code · 47 blank · 8 comment · 0 complexity · 5198345ced21caa3a2cc7d79ee1c61b5 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bridge\Doctrine\Tests;
  11. use Doctrine\Common\EventSubscriber;
  12. use PHPUnit\Framework\TestCase;
  13. use Symfony\Bridge\Doctrine\ContainerAwareEventManager;
  14. use Symfony\Component\DependencyInjection\Container;
  15. class ContainerAwareEventManagerTest extends TestCase
  16. {
  17. private $container;
  18. private $evm;
  19. protected function setUp(): void
  20. {
  21. $this->container = new Container();
  22. $this->evm = new ContainerAwareEventManager($this->container);
  23. }
  24. public function testDispatchEventRespectOrder()
  25. {
  26. $this->evm = new ContainerAwareEventManager($this->container, ['sub1', [['foo'], 'list1'], 'sub2']);
  27. $this->container->set('list1', $listener1 = new MyListener());
  28. $this->container->set('sub1', $subscriber1 = new MySubscriber(['foo']));
  29. $this->container->set('sub2', $subscriber2 = new MySubscriber(['foo']));
  30. $this->assertSame([$subscriber1, $listener1, $subscriber2], array_values($this->evm->getListeners('foo')));
  31. }
  32. public function testDispatchEvent()
  33. {
  34. $this->evm = new ContainerAwareEventManager($this->container, ['lazy4']);
  35. $this->container->set('lazy4', $subscriber1 = new MySubscriber(['foo']));
  36. $this->assertSame(0, $subscriber1->calledSubscribedEventsCount);
  37. $this->container->set('lazy1', $listener1 = new MyListener());
  38. $this->evm->addEventListener('foo', 'lazy1');
  39. $this->evm->addEventListener('foo', $listener2 = new MyListener());
  40. $this->container->set('lazy2', $listener3 = new MyListener());
  41. $this->evm->addEventListener('bar', 'lazy2');
  42. $this->evm->addEventListener('bar', $listener4 = new MyListener());
  43. $this->container->set('lazy3', $listener5 = new MyListener());
  44. $this->evm->addEventListener('foo', $listener5 = new MyListener());
  45. $this->evm->addEventListener('bar', $listener5);
  46. $this->evm->addEventSubscriber($subscriber2 = new MySubscriber(['bar']));
  47. $this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
  48. $this->evm->dispatchEvent('foo');
  49. $this->evm->dispatchEvent('bar');
  50. $this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
  51. $this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
  52. $this->assertSame(0, $listener1->calledByInvokeCount);
  53. $this->assertSame(1, $listener1->calledByEventNameCount);
  54. $this->assertSame(0, $listener2->calledByInvokeCount);
  55. $this->assertSame(1, $listener2->calledByEventNameCount);
  56. $this->assertSame(1, $listener3->calledByInvokeCount);
  57. $this->assertSame(0, $listener3->calledByEventNameCount);
  58. $this->assertSame(1, $listener4->calledByInvokeCount);
  59. $this->assertSame(0, $listener4->calledByEventNameCount);
  60. $this->assertSame(1, $listener5->calledByInvokeCount);
  61. $this->assertSame(1, $listener5->calledByEventNameCount);
  62. $this->assertSame(0, $subscriber1->calledByInvokeCount);
  63. $this->assertSame(1, $subscriber1->calledByEventNameCount);
  64. $this->assertSame(1, $subscriber2->calledByInvokeCount);
  65. $this->assertSame(0, $subscriber2->calledByEventNameCount);
  66. }
  67. public function testAddEventListenerAndSubscriberAfterDispatchEvent()
  68. {
  69. $this->evm = new ContainerAwareEventManager($this->container, ['lazy7']);
  70. $this->container->set('lazy7', $subscriber1 = new MySubscriber(['foo']));
  71. $this->assertSame(0, $subscriber1->calledSubscribedEventsCount);
  72. $this->container->set('lazy1', $listener1 = new MyListener());
  73. $this->evm->addEventListener('foo', 'lazy1');
  74. $this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
  75. $this->evm->addEventListener('foo', $listener2 = new MyListener());
  76. $this->container->set('lazy2', $listener3 = new MyListener());
  77. $this->evm->addEventListener('bar', 'lazy2');
  78. $this->evm->addEventListener('bar', $listener4 = new MyListener());
  79. $this->container->set('lazy3', $listener5 = new MyListener());
  80. $this->evm->addEventListener('foo', $listener5 = new MyListener());
  81. $this->evm->addEventListener('bar', $listener5);
  82. $this->evm->addEventSubscriber($subscriber2 = new MySubscriber(['bar']));
  83. $this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
  84. $this->evm->dispatchEvent('foo');
  85. $this->evm->dispatchEvent('bar');
  86. $this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
  87. $this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
  88. $this->container->set('lazy4', $listener6 = new MyListener());
  89. $this->evm->addEventListener('foo', 'lazy4');
  90. $this->evm->addEventListener('foo', $listener7 = new MyListener());
  91. $this->container->set('lazy5', $listener8 = new MyListener());
  92. $this->evm->addEventListener('bar', 'lazy5');
  93. $this->evm->addEventListener('bar', $listener9 = new MyListener());
  94. $this->container->set('lazy6', $listener10 = new MyListener());
  95. $this->evm->addEventListener('foo', $listener10 = new MyListener());
  96. $this->evm->addEventListener('bar', $listener10);
  97. $this->evm->addEventSubscriber($subscriber3 = new MySubscriber(['bar']));
  98. $this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
  99. $this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
  100. $this->assertSame(1, $subscriber3->calledSubscribedEventsCount);
  101. $this->evm->dispatchEvent('foo');
  102. $this->evm->dispatchEvent('bar');
  103. $this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
  104. $this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
  105. $this->assertSame(1, $subscriber3->calledSubscribedEventsCount);
  106. $this->assertSame(0, $listener1->calledByInvokeCount);
  107. $this->assertSame(2, $listener1->calledByEventNameCount);
  108. $this->assertSame(0, $listener2->calledByInvokeCount);
  109. $this->assertSame(2, $listener2->calledByEventNameCount);
  110. $this->assertSame(2, $listener3->calledByInvokeCount);
  111. $this->assertSame(0, $listener3->calledByEventNameCount);
  112. $this->assertSame(2, $listener4->calledByInvokeCount);
  113. $this->assertSame(0, $listener4->calledByEventNameCount);
  114. $this->assertSame(2, $listener5->calledByInvokeCount);
  115. $this->assertSame(2, $listener5->calledByEventNameCount);
  116. $this->assertSame(0, $subscriber1->calledByInvokeCount);
  117. $this->assertSame(2, $subscriber1->calledByEventNameCount);
  118. $this->assertSame(2, $subscriber2->calledByInvokeCount);
  119. $this->assertSame(0, $subscriber2->calledByEventNameCount);
  120. $this->assertSame(0, $listener6->calledByInvokeCount);
  121. $this->assertSame(1, $listener6->calledByEventNameCount);
  122. $this->assertSame(0, $listener7->calledByInvokeCount);
  123. $this->assertSame(1, $listener7->calledByEventNameCount);
  124. $this->assertSame(1, $listener8->calledByInvokeCount);
  125. $this->assertSame(0, $listener8->calledByEventNameCount);
  126. $this->assertSame(1, $listener9->calledByInvokeCount);
  127. $this->assertSame(0, $listener9->calledByEventNameCount);
  128. $this->assertSame(1, $listener10->calledByInvokeCount);
  129. $this->assertSame(1, $listener10->calledByEventNameCount);
  130. $this->assertSame(1, $subscriber3->calledByInvokeCount);
  131. $this->assertSame(0, $subscriber3->calledByEventNameCount);
  132. }
  133. public function testGetListenersForEvent()
  134. {
  135. $this->evm = new ContainerAwareEventManager($this->container, ['lazy2']);
  136. $this->container->set('lazy', $listener1 = new MyListener());
  137. $this->container->set('lazy2', $subscriber1 = new MySubscriber(['foo']));
  138. $this->evm->addEventListener('foo', 'lazy');
  139. $this->evm->addEventListener('foo', $listener2 = new MyListener());
  140. $this->assertSame([$subscriber1, $listener1, $listener2], array_values($this->evm->getListeners('foo')));
  141. }
  142. public function testGetListeners()
  143. {
  144. $this->container->set('lazy', $listener1 = new MyListener());
  145. $this->evm->addEventListener('foo', 'lazy');
  146. $this->evm->addEventListener('foo', $listener2 = new MyListener());
  147. $this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners()['foo']));
  148. }
  149. public function testRemoveEventListener()
  150. {
  151. $this->container->set('lazy', $listener1 = new MyListener());
  152. $this->evm->addEventListener('foo', 'lazy');
  153. $this->evm->addEventListener('foo', $listener2 = new MyListener());
  154. $this->evm->removeEventListener('foo', $listener2);
  155. $this->assertSame([$listener1], array_values($this->evm->getListeners('foo')));
  156. $this->evm->removeEventListener('foo', 'lazy');
  157. $this->assertSame([], $this->evm->getListeners('foo'));
  158. }
  159. public function testRemoveEventListenerAfterDispatchEvent()
  160. {
  161. $this->container->set('lazy', $listener1 = new MyListener());
  162. $this->evm->addEventListener('foo', 'lazy');
  163. $this->evm->addEventListener('foo', $listener2 = new MyListener());
  164. $this->evm->dispatchEvent('foo');
  165. $this->evm->removeEventListener('foo', $listener2);
  166. $this->assertSame([$listener1], array_values($this->evm->getListeners('foo')));
  167. $this->evm->removeEventListener('foo', 'lazy');
  168. $this->assertSame([], $this->evm->getListeners('foo'));
  169. }
  170. }
  171. class MyListener
  172. {
  173. public $calledByInvokeCount = 0;
  174. public $calledByEventNameCount = 0;
  175. public function __invoke()
  176. {
  177. ++$this->calledByInvokeCount;
  178. }
  179. public function foo()
  180. {
  181. ++$this->calledByEventNameCount;
  182. }
  183. }
  184. class MySubscriber extends MyListener implements EventSubscriber
  185. {
  186. public $calledSubscribedEventsCount = 0;
  187. private $listenedEvents;
  188. public function __construct(array $listenedEvents)
  189. {
  190. $this->listenedEvents = $listenedEvents;
  191. }
  192. public function getSubscribedEvents(): array
  193. {
  194. ++$this->calledSubscribedEventsCount;
  195. return $this->listenedEvents;
  196. }
  197. }