annotate vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php @ 2:92f882872392

Trusted hosts, + remove migration modules
author Chris Cannam
date Tue, 05 Dec 2017 09:26:43 +0000
parents 4c8ae668cc8c
children 7a779792577d
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\EventDispatcher\Tests;
Chris@0 13
Chris@0 14 use PHPUnit\Framework\TestCase;
Chris@0 15 use Symfony\Component\EventDispatcher\Event;
Chris@0 16 use Symfony\Component\EventDispatcher\EventDispatcher;
Chris@0 17 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
Chris@0 18
Chris@0 19 abstract class AbstractEventDispatcherTest extends TestCase
Chris@0 20 {
Chris@0 21 /* Some pseudo events */
Chris@0 22 const preFoo = 'pre.foo';
Chris@0 23 const postFoo = 'post.foo';
Chris@0 24 const preBar = 'pre.bar';
Chris@0 25 const postBar = 'post.bar';
Chris@0 26
Chris@0 27 /**
Chris@0 28 * @var EventDispatcher
Chris@0 29 */
Chris@0 30 private $dispatcher;
Chris@0 31
Chris@0 32 private $listener;
Chris@0 33
Chris@0 34 protected function setUp()
Chris@0 35 {
Chris@0 36 $this->dispatcher = $this->createEventDispatcher();
Chris@0 37 $this->listener = new TestEventListener();
Chris@0 38 }
Chris@0 39
Chris@0 40 protected function tearDown()
Chris@0 41 {
Chris@0 42 $this->dispatcher = null;
Chris@0 43 $this->listener = null;
Chris@0 44 }
Chris@0 45
Chris@0 46 abstract protected function createEventDispatcher();
Chris@0 47
Chris@0 48 public function testInitialState()
Chris@0 49 {
Chris@0 50 $this->assertEquals(array(), $this->dispatcher->getListeners());
Chris@0 51 $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
Chris@0 52 $this->assertFalse($this->dispatcher->hasListeners(self::postFoo));
Chris@0 53 }
Chris@0 54
Chris@0 55 public function testAddListener()
Chris@0 56 {
Chris@0 57 $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
Chris@0 58 $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'));
Chris@0 59 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 60 $this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
Chris@0 61 $this->assertCount(1, $this->dispatcher->getListeners(self::preFoo));
Chris@0 62 $this->assertCount(1, $this->dispatcher->getListeners(self::postFoo));
Chris@0 63 $this->assertCount(2, $this->dispatcher->getListeners());
Chris@0 64 }
Chris@0 65
Chris@0 66 public function testGetListenersSortsByPriority()
Chris@0 67 {
Chris@0 68 $listener1 = new TestEventListener();
Chris@0 69 $listener2 = new TestEventListener();
Chris@0 70 $listener3 = new TestEventListener();
Chris@0 71 $listener1->name = '1';
Chris@0 72 $listener2->name = '2';
Chris@0 73 $listener3->name = '3';
Chris@0 74
Chris@0 75 $this->dispatcher->addListener('pre.foo', array($listener1, 'preFoo'), -10);
Chris@0 76 $this->dispatcher->addListener('pre.foo', array($listener2, 'preFoo'), 10);
Chris@0 77 $this->dispatcher->addListener('pre.foo', array($listener3, 'preFoo'));
Chris@0 78
Chris@0 79 $expected = array(
Chris@0 80 array($listener2, 'preFoo'),
Chris@0 81 array($listener3, 'preFoo'),
Chris@0 82 array($listener1, 'preFoo'),
Chris@0 83 );
Chris@0 84
Chris@0 85 $this->assertSame($expected, $this->dispatcher->getListeners('pre.foo'));
Chris@0 86 }
Chris@0 87
Chris@0 88 public function testGetAllListenersSortsByPriority()
Chris@0 89 {
Chris@0 90 $listener1 = new TestEventListener();
Chris@0 91 $listener2 = new TestEventListener();
Chris@0 92 $listener3 = new TestEventListener();
Chris@0 93 $listener4 = new TestEventListener();
Chris@0 94 $listener5 = new TestEventListener();
Chris@0 95 $listener6 = new TestEventListener();
Chris@0 96
Chris@0 97 $this->dispatcher->addListener('pre.foo', $listener1, -10);
Chris@0 98 $this->dispatcher->addListener('pre.foo', $listener2);
Chris@0 99 $this->dispatcher->addListener('pre.foo', $listener3, 10);
Chris@0 100 $this->dispatcher->addListener('post.foo', $listener4, -10);
Chris@0 101 $this->dispatcher->addListener('post.foo', $listener5);
Chris@0 102 $this->dispatcher->addListener('post.foo', $listener6, 10);
Chris@0 103
Chris@0 104 $expected = array(
Chris@0 105 'pre.foo' => array($listener3, $listener2, $listener1),
Chris@0 106 'post.foo' => array($listener6, $listener5, $listener4),
Chris@0 107 );
Chris@0 108
Chris@0 109 $this->assertSame($expected, $this->dispatcher->getListeners());
Chris@0 110 }
Chris@0 111
Chris@0 112 public function testGetListenerPriority()
Chris@0 113 {
Chris@0 114 $listener1 = new TestEventListener();
Chris@0 115 $listener2 = new TestEventListener();
Chris@0 116
Chris@0 117 $this->dispatcher->addListener('pre.foo', $listener1, -10);
Chris@0 118 $this->dispatcher->addListener('pre.foo', $listener2);
Chris@0 119
Chris@0 120 $this->assertSame(-10, $this->dispatcher->getListenerPriority('pre.foo', $listener1));
Chris@0 121 $this->assertSame(0, $this->dispatcher->getListenerPriority('pre.foo', $listener2));
Chris@0 122 $this->assertNull($this->dispatcher->getListenerPriority('pre.bar', $listener2));
Chris@0 123 $this->assertNull($this->dispatcher->getListenerPriority('pre.foo', function () {}));
Chris@0 124 }
Chris@0 125
Chris@0 126 public function testDispatch()
Chris@0 127 {
Chris@0 128 $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
Chris@0 129 $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'));
Chris@0 130 $this->dispatcher->dispatch(self::preFoo);
Chris@0 131 $this->assertTrue($this->listener->preFooInvoked);
Chris@0 132 $this->assertFalse($this->listener->postFooInvoked);
Chris@0 133 $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch('noevent'));
Chris@0 134 $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch(self::preFoo));
Chris@0 135 $event = new Event();
Chris@0 136 $return = $this->dispatcher->dispatch(self::preFoo, $event);
Chris@0 137 $this->assertSame($event, $return);
Chris@0 138 }
Chris@0 139
Chris@0 140 public function testDispatchForClosure()
Chris@0 141 {
Chris@0 142 $invoked = 0;
Chris@0 143 $listener = function () use (&$invoked) {
Chris@0 144 ++$invoked;
Chris@0 145 };
Chris@0 146 $this->dispatcher->addListener('pre.foo', $listener);
Chris@0 147 $this->dispatcher->addListener('post.foo', $listener);
Chris@0 148 $this->dispatcher->dispatch(self::preFoo);
Chris@0 149 $this->assertEquals(1, $invoked);
Chris@0 150 }
Chris@0 151
Chris@0 152 public function testStopEventPropagation()
Chris@0 153 {
Chris@0 154 $otherListener = new TestEventListener();
Chris@0 155
Chris@0 156 // postFoo() stops the propagation, so only one listener should
Chris@0 157 // be executed
Chris@0 158 // Manually set priority to enforce $this->listener to be called first
Chris@0 159 $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'), 10);
Chris@0 160 $this->dispatcher->addListener('post.foo', array($otherListener, 'preFoo'));
Chris@0 161 $this->dispatcher->dispatch(self::postFoo);
Chris@0 162 $this->assertTrue($this->listener->postFooInvoked);
Chris@0 163 $this->assertFalse($otherListener->postFooInvoked);
Chris@0 164 }
Chris@0 165
Chris@0 166 public function testDispatchByPriority()
Chris@0 167 {
Chris@0 168 $invoked = array();
Chris@0 169 $listener1 = function () use (&$invoked) {
Chris@0 170 $invoked[] = '1';
Chris@0 171 };
Chris@0 172 $listener2 = function () use (&$invoked) {
Chris@0 173 $invoked[] = '2';
Chris@0 174 };
Chris@0 175 $listener3 = function () use (&$invoked) {
Chris@0 176 $invoked[] = '3';
Chris@0 177 };
Chris@0 178 $this->dispatcher->addListener('pre.foo', $listener1, -10);
Chris@0 179 $this->dispatcher->addListener('pre.foo', $listener2);
Chris@0 180 $this->dispatcher->addListener('pre.foo', $listener3, 10);
Chris@0 181 $this->dispatcher->dispatch(self::preFoo);
Chris@0 182 $this->assertEquals(array('3', '2', '1'), $invoked);
Chris@0 183 }
Chris@0 184
Chris@0 185 public function testRemoveListener()
Chris@0 186 {
Chris@0 187 $this->dispatcher->addListener('pre.bar', $this->listener);
Chris@0 188 $this->assertTrue($this->dispatcher->hasListeners(self::preBar));
Chris@0 189 $this->dispatcher->removeListener('pre.bar', $this->listener);
Chris@0 190 $this->assertFalse($this->dispatcher->hasListeners(self::preBar));
Chris@0 191 $this->dispatcher->removeListener('notExists', $this->listener);
Chris@0 192 }
Chris@0 193
Chris@0 194 public function testAddSubscriber()
Chris@0 195 {
Chris@0 196 $eventSubscriber = new TestEventSubscriber();
Chris@0 197 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 198 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 199 $this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
Chris@0 200 }
Chris@0 201
Chris@0 202 public function testAddSubscriberWithPriorities()
Chris@0 203 {
Chris@0 204 $eventSubscriber = new TestEventSubscriber();
Chris@0 205 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 206
Chris@0 207 $eventSubscriber = new TestEventSubscriberWithPriorities();
Chris@0 208 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 209
Chris@0 210 $listeners = $this->dispatcher->getListeners('pre.foo');
Chris@0 211 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 212 $this->assertCount(2, $listeners);
Chris@0 213 $this->assertInstanceOf('Symfony\Component\EventDispatcher\Tests\TestEventSubscriberWithPriorities', $listeners[0][0]);
Chris@0 214 }
Chris@0 215
Chris@0 216 public function testAddSubscriberWithMultipleListeners()
Chris@0 217 {
Chris@0 218 $eventSubscriber = new TestEventSubscriberWithMultipleListeners();
Chris@0 219 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 220
Chris@0 221 $listeners = $this->dispatcher->getListeners('pre.foo');
Chris@0 222 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 223 $this->assertCount(2, $listeners);
Chris@0 224 $this->assertEquals('preFoo2', $listeners[0][1]);
Chris@0 225 }
Chris@0 226
Chris@0 227 public function testRemoveSubscriber()
Chris@0 228 {
Chris@0 229 $eventSubscriber = new TestEventSubscriber();
Chris@0 230 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 231 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 232 $this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
Chris@0 233 $this->dispatcher->removeSubscriber($eventSubscriber);
Chris@0 234 $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
Chris@0 235 $this->assertFalse($this->dispatcher->hasListeners(self::postFoo));
Chris@0 236 }
Chris@0 237
Chris@0 238 public function testRemoveSubscriberWithPriorities()
Chris@0 239 {
Chris@0 240 $eventSubscriber = new TestEventSubscriberWithPriorities();
Chris@0 241 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 242 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 243 $this->dispatcher->removeSubscriber($eventSubscriber);
Chris@0 244 $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
Chris@0 245 }
Chris@0 246
Chris@0 247 public function testRemoveSubscriberWithMultipleListeners()
Chris@0 248 {
Chris@0 249 $eventSubscriber = new TestEventSubscriberWithMultipleListeners();
Chris@0 250 $this->dispatcher->addSubscriber($eventSubscriber);
Chris@0 251 $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
Chris@0 252 $this->assertCount(2, $this->dispatcher->getListeners(self::preFoo));
Chris@0 253 $this->dispatcher->removeSubscriber($eventSubscriber);
Chris@0 254 $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
Chris@0 255 }
Chris@0 256
Chris@0 257 public function testEventReceivesTheDispatcherInstanceAsArgument()
Chris@0 258 {
Chris@0 259 $listener = new TestWithDispatcher();
Chris@0 260 $this->dispatcher->addListener('test', array($listener, 'foo'));
Chris@0 261 $this->assertNull($listener->name);
Chris@0 262 $this->assertNull($listener->dispatcher);
Chris@0 263 $this->dispatcher->dispatch('test');
Chris@0 264 $this->assertEquals('test', $listener->name);
Chris@0 265 $this->assertSame($this->dispatcher, $listener->dispatcher);
Chris@0 266 }
Chris@0 267
Chris@0 268 /**
Chris@0 269 * @see https://bugs.php.net/bug.php?id=62976
Chris@0 270 *
Chris@0 271 * This bug affects:
Chris@0 272 * - The PHP 5.3 branch for versions < 5.3.18
Chris@0 273 * - The PHP 5.4 branch for versions < 5.4.8
Chris@0 274 * - The PHP 5.5 branch is not affected
Chris@0 275 */
Chris@0 276 public function testWorkaroundForPhpBug62976()
Chris@0 277 {
Chris@0 278 $dispatcher = $this->createEventDispatcher();
Chris@0 279 $dispatcher->addListener('bug.62976', new CallableClass());
Chris@0 280 $dispatcher->removeListener('bug.62976', function () {});
Chris@0 281 $this->assertTrue($dispatcher->hasListeners('bug.62976'));
Chris@0 282 }
Chris@0 283
Chris@0 284 public function testHasListenersWhenAddedCallbackListenerIsRemoved()
Chris@0 285 {
Chris@0 286 $listener = function () {};
Chris@0 287 $this->dispatcher->addListener('foo', $listener);
Chris@0 288 $this->dispatcher->removeListener('foo', $listener);
Chris@0 289 $this->assertFalse($this->dispatcher->hasListeners());
Chris@0 290 }
Chris@0 291
Chris@0 292 public function testGetListenersWhenAddedCallbackListenerIsRemoved()
Chris@0 293 {
Chris@0 294 $listener = function () {};
Chris@0 295 $this->dispatcher->addListener('foo', $listener);
Chris@0 296 $this->dispatcher->removeListener('foo', $listener);
Chris@0 297 $this->assertSame(array(), $this->dispatcher->getListeners());
Chris@0 298 }
Chris@0 299
Chris@0 300 public function testHasListenersWithoutEventsReturnsFalseAfterHasListenersWithEventHasBeenCalled()
Chris@0 301 {
Chris@0 302 $this->assertFalse($this->dispatcher->hasListeners('foo'));
Chris@0 303 $this->assertFalse($this->dispatcher->hasListeners());
Chris@0 304 }
Chris@0 305 }
Chris@0 306
Chris@0 307 class CallableClass
Chris@0 308 {
Chris@0 309 public function __invoke()
Chris@0 310 {
Chris@0 311 }
Chris@0 312 }
Chris@0 313
Chris@0 314 class TestEventListener
Chris@0 315 {
Chris@0 316 public $preFooInvoked = false;
Chris@0 317 public $postFooInvoked = false;
Chris@0 318
Chris@0 319 /* Listener methods */
Chris@0 320
Chris@0 321 public function preFoo(Event $e)
Chris@0 322 {
Chris@0 323 $this->preFooInvoked = true;
Chris@0 324 }
Chris@0 325
Chris@0 326 public function postFoo(Event $e)
Chris@0 327 {
Chris@0 328 $this->postFooInvoked = true;
Chris@0 329
Chris@0 330 $e->stopPropagation();
Chris@0 331 }
Chris@0 332 }
Chris@0 333
Chris@0 334 class TestWithDispatcher
Chris@0 335 {
Chris@0 336 public $name;
Chris@0 337 public $dispatcher;
Chris@0 338
Chris@0 339 public function foo(Event $e, $name, $dispatcher)
Chris@0 340 {
Chris@0 341 $this->name = $name;
Chris@0 342 $this->dispatcher = $dispatcher;
Chris@0 343 }
Chris@0 344 }
Chris@0 345
Chris@0 346 class TestEventSubscriber implements EventSubscriberInterface
Chris@0 347 {
Chris@0 348 public static function getSubscribedEvents()
Chris@0 349 {
Chris@0 350 return array('pre.foo' => 'preFoo', 'post.foo' => 'postFoo');
Chris@0 351 }
Chris@0 352 }
Chris@0 353
Chris@0 354 class TestEventSubscriberWithPriorities implements EventSubscriberInterface
Chris@0 355 {
Chris@0 356 public static function getSubscribedEvents()
Chris@0 357 {
Chris@0 358 return array(
Chris@0 359 'pre.foo' => array('preFoo', 10),
Chris@0 360 'post.foo' => array('postFoo'),
Chris@0 361 );
Chris@0 362 }
Chris@0 363 }
Chris@0 364
Chris@0 365 class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterface
Chris@0 366 {
Chris@0 367 public static function getSubscribedEvents()
Chris@0 368 {
Chris@0 369 return array('pre.foo' => array(
Chris@0 370 array('preFoo1'),
Chris@0 371 array('preFoo2', 10),
Chris@0 372 ));
Chris@0 373 }
Chris@0 374 }