sonarrradarrplexorganizrnginxdashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboard
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							442 lines
						
					
					
						
							16 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							442 lines
						
					
					
						
							16 KiB
						
					
					
				| <?php | |
| 
 | |
| /* | |
|  * This file is part of the Symfony package. | |
|  * | |
|  * (c) Fabien Potencier <fabien@symfony.com> | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| namespace Symfony\Component\EventDispatcher\Tests; | |
| 
 | |
| use PHPUnit\Framework\TestCase; | |
| use Symfony\Component\EventDispatcher\Event; | |
| use Symfony\Component\EventDispatcher\EventDispatcher; | |
| use Symfony\Component\EventDispatcher\EventSubscriberInterface; | |
| 
 | |
| abstract class AbstractEventDispatcherTest extends TestCase | |
| { | |
|     /* Some pseudo events */ | |
|     const preFoo = 'pre.foo'; | |
|     const postFoo = 'post.foo'; | |
|     const preBar = 'pre.bar'; | |
|     const postBar = 'post.bar'; | |
| 
 | |
|     /** | |
|      * @var EventDispatcher | |
|      */ | |
|     private $dispatcher; | |
| 
 | |
|     private $listener; | |
| 
 | |
|     protected function setUp() | |
|     { | |
|         $this->dispatcher = $this->createEventDispatcher(); | |
|         $this->listener = new TestEventListener(); | |
|     } | |
| 
 | |
|     protected function tearDown() | |
|     { | |
|         $this->dispatcher = null; | |
|         $this->listener = null; | |
|     } | |
| 
 | |
|     abstract protected function createEventDispatcher(); | |
| 
 | |
|     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 testAddListener() | |
|     { | |
|         $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo')); | |
|         $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo')); | |
|         $this->assertTrue($this->dispatcher->hasListeners()); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); | |
|         $this->assertCount(1, $this->dispatcher->getListeners(self::preFoo)); | |
|         $this->assertCount(1, $this->dispatcher->getListeners(self::postFoo)); | |
|         $this->assertCount(2, $this->dispatcher->getListeners()); | |
|     } | |
| 
 | |
|     public function testGetListenersSortsByPriority() | |
|     { | |
|         $listener1 = new TestEventListener(); | |
|         $listener2 = new TestEventListener(); | |
|         $listener3 = new TestEventListener(); | |
|         $listener1->name = '1'; | |
|         $listener2->name = '2'; | |
|         $listener3->name = '3'; | |
| 
 | |
|         $this->dispatcher->addListener('pre.foo', array($listener1, 'preFoo'), -10); | |
|         $this->dispatcher->addListener('pre.foo', array($listener2, 'preFoo'), 10); | |
|         $this->dispatcher->addListener('pre.foo', array($listener3, 'preFoo')); | |
| 
 | |
|         $expected = array( | |
|             array($listener2, 'preFoo'), | |
|             array($listener3, 'preFoo'), | |
|             array($listener1, 'preFoo'), | |
|         ); | |
| 
 | |
|         $this->assertSame($expected, $this->dispatcher->getListeners('pre.foo')); | |
|     } | |
| 
 | |
|     public function testGetAllListenersSortsByPriority() | |
|     { | |
|         $listener1 = new TestEventListener(); | |
|         $listener2 = new TestEventListener(); | |
|         $listener3 = new TestEventListener(); | |
|         $listener4 = new TestEventListener(); | |
|         $listener5 = new TestEventListener(); | |
|         $listener6 = new TestEventListener(); | |
| 
 | |
|         $this->dispatcher->addListener('pre.foo', $listener1, -10); | |
|         $this->dispatcher->addListener('pre.foo', $listener2); | |
|         $this->dispatcher->addListener('pre.foo', $listener3, 10); | |
|         $this->dispatcher->addListener('post.foo', $listener4, -10); | |
|         $this->dispatcher->addListener('post.foo', $listener5); | |
|         $this->dispatcher->addListener('post.foo', $listener6, 10); | |
| 
 | |
|         $expected = array( | |
|             'pre.foo' => array($listener3, $listener2, $listener1), | |
|             'post.foo' => array($listener6, $listener5, $listener4), | |
|         ); | |
| 
 | |
|         $this->assertSame($expected, $this->dispatcher->getListeners()); | |
|     } | |
| 
 | |
|     public function testGetListenerPriority() | |
|     { | |
|         $listener1 = new TestEventListener(); | |
|         $listener2 = new TestEventListener(); | |
| 
 | |
|         $this->dispatcher->addListener('pre.foo', $listener1, -10); | |
|         $this->dispatcher->addListener('pre.foo', $listener2); | |
| 
 | |
|         $this->assertSame(-10, $this->dispatcher->getListenerPriority('pre.foo', $listener1)); | |
|         $this->assertSame(0, $this->dispatcher->getListenerPriority('pre.foo', $listener2)); | |
|         $this->assertNull($this->dispatcher->getListenerPriority('pre.bar', $listener2)); | |
|         $this->assertNull($this->dispatcher->getListenerPriority('pre.foo', function () {})); | |
|     } | |
| 
 | |
|     public function testDispatch() | |
|     { | |
|         $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo')); | |
|         $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo')); | |
|         $this->dispatcher->dispatch(self::preFoo); | |
|         $this->assertTrue($this->listener->preFooInvoked); | |
|         $this->assertFalse($this->listener->postFooInvoked); | |
|         $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch('noevent')); | |
|         $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch(self::preFoo)); | |
|         $event = new Event(); | |
|         $return = $this->dispatcher->dispatch(self::preFoo, $event); | |
|         $this->assertSame($event, $return); | |
|     } | |
| 
 | |
|     public function testDispatchForClosure() | |
|     { | |
|         $invoked = 0; | |
|         $listener = function () use (&$invoked) { | |
|             ++$invoked; | |
|         }; | |
|         $this->dispatcher->addListener('pre.foo', $listener); | |
|         $this->dispatcher->addListener('post.foo', $listener); | |
|         $this->dispatcher->dispatch(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->addListener('post.foo', array($this->listener, 'postFoo'), 10); | |
|         $this->dispatcher->addListener('post.foo', array($otherListener, 'postFoo')); | |
|         $this->dispatcher->dispatch(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->addListener('pre.foo', $listener1, -10); | |
|         $this->dispatcher->addListener('pre.foo', $listener2); | |
|         $this->dispatcher->addListener('pre.foo', $listener3, 10); | |
|         $this->dispatcher->dispatch(self::preFoo); | |
|         $this->assertEquals(array('3', '2', '1'), $invoked); | |
|     } | |
| 
 | |
|     public function testRemoveListener() | |
|     { | |
|         $this->dispatcher->addListener('pre.bar', $this->listener); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preBar)); | |
|         $this->dispatcher->removeListener('pre.bar', $this->listener); | |
|         $this->assertFalse($this->dispatcher->hasListeners(self::preBar)); | |
|         $this->dispatcher->removeListener('notExists', $this->listener); | |
|     } | |
| 
 | |
|     public function testAddSubscriber() | |
|     { | |
|         $eventSubscriber = new TestEventSubscriber(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); | |
|     } | |
| 
 | |
|     public function testAddSubscriberWithPriorities() | |
|     { | |
|         $eventSubscriber = new TestEventSubscriber(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
| 
 | |
|         $eventSubscriber = new TestEventSubscriberWithPriorities(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
| 
 | |
|         $listeners = $this->dispatcher->getListeners('pre.foo'); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertCount(2, $listeners); | |
|         $this->assertInstanceOf('Symfony\Component\EventDispatcher\Tests\TestEventSubscriberWithPriorities', $listeners[0][0]); | |
|     } | |
| 
 | |
|     public function testAddSubscriberWithMultipleListeners() | |
|     { | |
|         $eventSubscriber = new TestEventSubscriberWithMultipleListeners(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
| 
 | |
|         $listeners = $this->dispatcher->getListeners('pre.foo'); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertCount(2, $listeners); | |
|         $this->assertEquals('preFoo2', $listeners[0][1]); | |
|     } | |
| 
 | |
|     public function testRemoveSubscriber() | |
|     { | |
|         $eventSubscriber = new TestEventSubscriber(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); | |
|         $this->dispatcher->removeSubscriber($eventSubscriber); | |
|         $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertFalse($this->dispatcher->hasListeners(self::postFoo)); | |
|     } | |
| 
 | |
|     public function testRemoveSubscriberWithPriorities() | |
|     { | |
|         $eventSubscriber = new TestEventSubscriberWithPriorities(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->dispatcher->removeSubscriber($eventSubscriber); | |
|         $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); | |
|     } | |
| 
 | |
|     public function testRemoveSubscriberWithMultipleListeners() | |
|     { | |
|         $eventSubscriber = new TestEventSubscriberWithMultipleListeners(); | |
|         $this->dispatcher->addSubscriber($eventSubscriber); | |
|         $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); | |
|         $this->assertCount(2, $this->dispatcher->getListeners(self::preFoo)); | |
|         $this->dispatcher->removeSubscriber($eventSubscriber); | |
|         $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); | |
|     } | |
| 
 | |
|     public function testEventReceivesTheDispatcherInstanceAsArgument() | |
|     { | |
|         $listener = new TestWithDispatcher(); | |
|         $this->dispatcher->addListener('test', array($listener, 'foo')); | |
|         $this->assertNull($listener->name); | |
|         $this->assertNull($listener->dispatcher); | |
|         $this->dispatcher->dispatch('test'); | |
|         $this->assertEquals('test', $listener->name); | |
|         $this->assertSame($this->dispatcher, $listener->dispatcher); | |
|     } | |
| 
 | |
|     /** | |
|      * @see https://bugs.php.net/bug.php?id=62976 | |
|      * | |
|      * This bug affects: | |
|      *  - The PHP 5.3 branch for versions < 5.3.18 | |
|      *  - The PHP 5.4 branch for versions < 5.4.8 | |
|      *  - The PHP 5.5 branch is not affected | |
|      */ | |
|     public function testWorkaroundForPhpBug62976() | |
|     { | |
|         $dispatcher = $this->createEventDispatcher(); | |
|         $dispatcher->addListener('bug.62976', new CallableClass()); | |
|         $dispatcher->removeListener('bug.62976', function () {}); | |
|         $this->assertTrue($dispatcher->hasListeners('bug.62976')); | |
|     } | |
| 
 | |
|     public function testHasListenersWhenAddedCallbackListenerIsRemoved() | |
|     { | |
|         $listener = function () {}; | |
|         $this->dispatcher->addListener('foo', $listener); | |
|         $this->dispatcher->removeListener('foo', $listener); | |
|         $this->assertFalse($this->dispatcher->hasListeners()); | |
|     } | |
| 
 | |
|     public function testGetListenersWhenAddedCallbackListenerIsRemoved() | |
|     { | |
|         $listener = function () {}; | |
|         $this->dispatcher->addListener('foo', $listener); | |
|         $this->dispatcher->removeListener('foo', $listener); | |
|         $this->assertSame(array(), $this->dispatcher->getListeners()); | |
|     } | |
| 
 | |
|     public function testHasListenersWithoutEventsReturnsFalseAfterHasListenersWithEventHasBeenCalled() | |
|     { | |
|         $this->assertFalse($this->dispatcher->hasListeners('foo')); | |
|         $this->assertFalse($this->dispatcher->hasListeners()); | |
|     } | |
| 
 | |
|     public function testHasListenersIsLazy() | |
|     { | |
|         $called = 0; | |
|         $listener = array(function () use (&$called) { ++$called; }, 'onFoo'); | |
|         $this->dispatcher->addListener('foo', $listener); | |
|         $this->assertTrue($this->dispatcher->hasListeners()); | |
|         $this->assertTrue($this->dispatcher->hasListeners('foo')); | |
|         $this->assertSame(0, $called); | |
|     } | |
| 
 | |
|     public function testDispatchLazyListener() | |
|     { | |
|         $called = 0; | |
|         $factory = function () use (&$called) { | |
|             ++$called; | |
| 
 | |
|             return new TestWithDispatcher(); | |
|         }; | |
|         $this->dispatcher->addListener('foo', array($factory, 'foo')); | |
|         $this->assertSame(0, $called); | |
|         $this->dispatcher->dispatch('foo', new Event()); | |
|         $this->dispatcher->dispatch('foo', new Event()); | |
|         $this->assertSame(1, $called); | |
|     } | |
| 
 | |
|     public function testRemoveFindsLazyListeners() | |
|     { | |
|         $test = new TestWithDispatcher(); | |
|         $factory = function () use ($test) { return $test; }; | |
| 
 | |
|         $this->dispatcher->addListener('foo', array($factory, 'foo')); | |
|         $this->assertTrue($this->dispatcher->hasListeners('foo')); | |
|         $this->dispatcher->removeListener('foo', array($test, 'foo')); | |
|         $this->assertFalse($this->dispatcher->hasListeners('foo')); | |
| 
 | |
|         $this->dispatcher->addListener('foo', array($test, 'foo')); | |
|         $this->assertTrue($this->dispatcher->hasListeners('foo')); | |
|         $this->dispatcher->removeListener('foo', array($factory, 'foo')); | |
|         $this->assertFalse($this->dispatcher->hasListeners('foo')); | |
|     } | |
| 
 | |
|     public function testPriorityFindsLazyListeners() | |
|     { | |
|         $test = new TestWithDispatcher(); | |
|         $factory = function () use ($test) { return $test; }; | |
| 
 | |
|         $this->dispatcher->addListener('foo', array($factory, 'foo'), 3); | |
|         $this->assertSame(3, $this->dispatcher->getListenerPriority('foo', array($test, 'foo'))); | |
|         $this->dispatcher->removeListener('foo', array($factory, 'foo')); | |
| 
 | |
|         $this->dispatcher->addListener('foo', array($test, 'foo'), 5); | |
|         $this->assertSame(5, $this->dispatcher->getListenerPriority('foo', array($factory, 'foo'))); | |
|     } | |
| 
 | |
|     public function testGetLazyListeners() | |
|     { | |
|         $test = new TestWithDispatcher(); | |
|         $factory = function () use ($test) { return $test; }; | |
| 
 | |
|         $this->dispatcher->addListener('foo', array($factory, 'foo'), 3); | |
|         $this->assertSame(array(array($test, 'foo')), $this->dispatcher->getListeners('foo')); | |
| 
 | |
|         $this->dispatcher->removeListener('foo', array($test, 'foo')); | |
|         $this->dispatcher->addListener('bar', array($factory, 'foo'), 3); | |
|         $this->assertSame(array('bar' => array(array($test, 'foo'))), $this->dispatcher->getListeners()); | |
|     } | |
| } | |
| 
 | |
| class CallableClass | |
| { | |
|     public function __invoke() | |
|     { | |
|     } | |
| } | |
| 
 | |
| 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 TestWithDispatcher | |
| { | |
|     public $name; | |
|     public $dispatcher; | |
| 
 | |
|     public function foo(Event $e, $name, $dispatcher) | |
|     { | |
|         $this->name = $name; | |
|         $this->dispatcher = $dispatcher; | |
|     } | |
| } | |
| 
 | |
| class TestEventSubscriber implements EventSubscriberInterface | |
| { | |
|     public static function getSubscribedEvents() | |
|     { | |
|         return array('pre.foo' => 'preFoo', 'post.foo' => 'postFoo'); | |
|     } | |
| } | |
| 
 | |
| class TestEventSubscriberWithPriorities implements EventSubscriberInterface | |
| { | |
|     public static function getSubscribedEvents() | |
|     { | |
|         return array( | |
|             'pre.foo' => array('preFoo', 10), | |
|             'post.foo' => array('postFoo'), | |
|             ); | |
|     } | |
| } | |
| 
 | |
| class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterface | |
| { | |
|     public static function getSubscribedEvents() | |
|     { | |
|         return array('pre.foo' => array( | |
|             array('preFoo1'), | |
|             array('preFoo2', 10), | |
|         )); | |
|     } | |
| }
 | |
| 
 |