* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Tests\Component\EventDispatcher; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class EventDispatcherTest extends \PHPUnit_Framework_TestCase { /* Some pseudo events */ const preFoo = 'preFoo'; const postFoo = 'postFoo'; const preBar = 'preBar'; const postBar = 'postBar'; private $dispatcher; private $listener; protected function setUp() { $this->dispatcher = new EventDispatcher(); $this->listener = new TestEventListener(); } public function testInitialState() { $this->assertEquals(array(), $this->dispatcher->getListeners()); $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); $this->assertFalse($this->dispatcher->hasListeners(self::postFoo)); } public function testAddEventListener() { $this->dispatcher->addEventListener(array('preFoo', 'postFoo'), $this->listener); $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); $this->assertEquals(1, count($this->dispatcher->getListeners(self::preFoo))); $this->assertEquals(1, count($this->dispatcher->getListeners(self::postFoo))); $this->assertEquals(2, count($this->dispatcher->getListeners())); } public function testGetListenersSortsByPriority() { $listener1 = new TestEventListener(); $listener2 = new TestEventListener(); $listener3 = new TestEventListener(); $this->dispatcher->addEventListener('preFoo', $listener1, -10); $this->dispatcher->addEventListener('preFoo', $listener2); $this->dispatcher->addEventListener('preFoo', $listener3, 10); $expected = array( spl_object_hash($listener3) => $listener3, spl_object_hash($listener2) => $listener2, spl_object_hash($listener1) => $listener1, ); $this->assertSame($expected, $this->dispatcher->getListeners('preFoo')); } public function testGetAllListenersSortsByPriority() { $listener1 = new TestEventListener(); $listener2 = new TestEventListener(); $listener3 = new TestEventListener(); $listener4 = new TestEventListener(); $listener5 = new TestEventListener(); $listener6 = new TestEventListener(); $this->dispatcher->addEventListener('preFoo', $listener1, -10); $this->dispatcher->addEventListener('preFoo', $listener2); $this->dispatcher->addEventListener('preFoo', $listener3, 10); $this->dispatcher->addEventListener('postFoo', $listener4, -10); $this->dispatcher->addEventListener('postFoo', $listener5); $this->dispatcher->addEventListener('postFoo', $listener6, 10); $expected = array( 'preFoo' => array( spl_object_hash($listener3) => $listener3, spl_object_hash($listener2) => $listener2, spl_object_hash($listener1) => $listener1, ), 'postFoo' => array( spl_object_hash($listener6) => $listener6, spl_object_hash($listener5) => $listener5, spl_object_hash($listener4) => $listener4, ), ); $this->assertSame($expected, $this->dispatcher->getListeners()); } public function testDispatchEvent() { $this->dispatcher->addEventListener(array('preFoo', 'postFoo'), $this->listener); $this->dispatcher->dispatchEvent(self::preFoo); $this->assertTrue($this->listener->preFooInvoked); $this->assertFalse($this->listener->postFooInvoked); } public function testDispatchEventForClosure() { $invoked = 0; $listener = function () use (&$invoked) { $invoked++; }; $this->dispatcher->addEventListener(array('preFoo', 'postFoo'), $listener); $this->dispatcher->dispatchEvent(self::preFoo); $this->assertEquals(1, $invoked); } public function testStopEventPropagation() { $otherListener = new TestEventListener; // postFoo() stops the propagation, so only one listener should // be executed // Manually set priority to enforce $this->listener to be called first $this->dispatcher->addEventListener('postFoo', $this->listener, 10); $this->dispatcher->addEventListener('postFoo', $otherListener); $this->dispatcher->dispatchEvent(self::postFoo); $this->assertTrue($this->listener->postFooInvoked); $this->assertFalse($otherListener->postFooInvoked); } public function testDispatchByPriority() { $invoked = array(); $listener1 = function () use (&$invoked) { $invoked[] = '1'; }; $listener2 = function () use (&$invoked) { $invoked[] = '2'; }; $listener3 = function () use (&$invoked) { $invoked[] = '3'; }; $this->dispatcher->addEventListener('preFoo', $listener1, -10); $this->dispatcher->addEventListener('preFoo', $listener2); $this->dispatcher->addEventListener('preFoo', $listener3, 10); $this->dispatcher->dispatchEvent(self::preFoo); $this->assertEquals(array('3', '2', '1'), $invoked); } public function testRemoveEventListener() { $this->dispatcher->addEventListener(array('preBar'), $this->listener); $this->assertTrue($this->dispatcher->hasListeners(self::preBar)); $this->dispatcher->removeEventListener(array('preBar'), $this->listener); $this->assertFalse($this->dispatcher->hasListeners(self::preBar)); } public function testAddEventSubscriber() { $eventSubscriber = new TestEventSubscriber(); $this->dispatcher->addEventSubscriber($eventSubscriber); $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); } } class TestEventListener { public $preFooInvoked = false; public $postFooInvoked = false; /* Listener methods */ public function preFoo(Event $e) { $this->preFooInvoked = true; } public function postFoo(Event $e) { $this->postFooInvoked = true; $e->stopPropagation(); } } class TestEventSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents() { return array('preFoo', 'postFoo'); } }