forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			278 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			278 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?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 Symfony\Component\DependencyInjection\Container; | ||
|  | use Symfony\Component\DependencyInjection\Scope; | ||
|  | use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher; | ||
|  | use Symfony\Component\EventDispatcher\Event; | ||
|  | use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
|  | 
 | ||
|  | class ContainerAwareEventDispatcherTest extends AbstractEventDispatcherTest | ||
|  | { | ||
|  |     protected function createEventDispatcher() | ||
|  |     { | ||
|  |         $container = new Container(); | ||
|  | 
 | ||
|  |         return new ContainerAwareEventDispatcher($container); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddAListenerService() | ||
|  |     { | ||
|  |         $event = new Event(); | ||
|  | 
 | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $service | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEvent') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.listener', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  | 
 | ||
|  |         $dispatcher->dispatch('onEvent', $event); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddASubscriberService() | ||
|  |     { | ||
|  |         $event = new Event(); | ||
|  | 
 | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\SubscriberService')->getMock(); | ||
|  | 
 | ||
|  |         $service | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEvent') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $service | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEventWithPriority') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $service | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEventNested') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.subscriber', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addSubscriberService('service.subscriber', 'Symfony\Component\EventDispatcher\Tests\SubscriberService'); | ||
|  | 
 | ||
|  |         $dispatcher->dispatch('onEvent', $event); | ||
|  |         $dispatcher->dispatch('onEventWithPriority', $event); | ||
|  |         $dispatcher->dispatch('onEventNested', $event); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPreventDuplicateListenerService() | ||
|  |     { | ||
|  |         $event = new Event(); | ||
|  | 
 | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $service | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEvent') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.listener', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 5); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 10); | ||
|  | 
 | ||
|  |         $dispatcher->dispatch('onEvent', $event); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @expectedException \InvalidArgumentException | ||
|  |      * @group legacy | ||
|  |      */ | ||
|  |     public function testTriggerAListenerServiceOutOfScope() | ||
|  |     { | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $scope = new Scope('scope'); | ||
|  |         $container = new Container(); | ||
|  |         $container->addScope($scope); | ||
|  |         $container->enterScope('scope'); | ||
|  | 
 | ||
|  |         $container->set('service.listener', $service, 'scope'); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  | 
 | ||
|  |         $container->leaveScope('scope'); | ||
|  |         $dispatcher->dispatch('onEvent'); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @group legacy | ||
|  |      */ | ||
|  |     public function testReEnteringAScope() | ||
|  |     { | ||
|  |         $event = new Event(); | ||
|  | 
 | ||
|  |         $service1 = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $service1 | ||
|  |             ->expects($this->exactly(2)) | ||
|  |             ->method('onEvent') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $scope = new Scope('scope'); | ||
|  |         $container = new Container(); | ||
|  |         $container->addScope($scope); | ||
|  |         $container->enterScope('scope'); | ||
|  | 
 | ||
|  |         $container->set('service.listener', $service1, 'scope'); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  |         $dispatcher->dispatch('onEvent', $event); | ||
|  | 
 | ||
|  |         $service2 = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $service2 | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEvent') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $container->enterScope('scope'); | ||
|  |         $container->set('service.listener', $service2, 'scope'); | ||
|  | 
 | ||
|  |         $dispatcher->dispatch('onEvent', $event); | ||
|  | 
 | ||
|  |         $container->leaveScope('scope'); | ||
|  | 
 | ||
|  |         $dispatcher->dispatch('onEvent'); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testHasListenersOnLazyLoad() | ||
|  |     { | ||
|  |         $event = new Event(); | ||
|  | 
 | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.listener', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  | 
 | ||
|  |         $event->setDispatcher($dispatcher); | ||
|  |         $event->setName('onEvent'); | ||
|  | 
 | ||
|  |         $service | ||
|  |             ->expects($this->once()) | ||
|  |             ->method('onEvent') | ||
|  |             ->with($event) | ||
|  |         ; | ||
|  | 
 | ||
|  |         $this->assertTrue($dispatcher->hasListeners()); | ||
|  | 
 | ||
|  |         if ($dispatcher->hasListeners('onEvent')) { | ||
|  |             $dispatcher->dispatch('onEvent'); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetListenersOnLazyLoad() | ||
|  |     { | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.listener', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  | 
 | ||
|  |         $listeners = $dispatcher->getListeners(); | ||
|  | 
 | ||
|  |         $this->assertArrayHasKey('onEvent', $listeners); | ||
|  | 
 | ||
|  |         $this->assertCount(1, $dispatcher->getListeners('onEvent')); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testRemoveAfterDispatch() | ||
|  |     { | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.listener', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  | 
 | ||
|  |         $dispatcher->dispatch('onEvent', new Event()); | ||
|  |         $dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent')); | ||
|  |         $this->assertFalse($dispatcher->hasListeners('onEvent')); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testRemoveBeforeDispatch() | ||
|  |     { | ||
|  |         $service = $this->getMockBuilder('Symfony\Component\EventDispatcher\Tests\Service')->getMock(); | ||
|  | 
 | ||
|  |         $container = new Container(); | ||
|  |         $container->set('service.listener', $service); | ||
|  | 
 | ||
|  |         $dispatcher = new ContainerAwareEventDispatcher($container); | ||
|  |         $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); | ||
|  | 
 | ||
|  |         $dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent')); | ||
|  |         $this->assertFalse($dispatcher->hasListeners('onEvent')); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class Service | ||
|  | { | ||
|  |     public function onEvent(Event $e) | ||
|  |     { | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class SubscriberService implements EventSubscriberInterface | ||
|  | { | ||
|  |     public static function getSubscribedEvents() | ||
|  |     { | ||
|  |         return array( | ||
|  |             'onEvent' => 'onEvent', | ||
|  |             'onEventWithPriority' => array('onEventWithPriority', 10), | ||
|  |             'onEventNested' => array(array('onEventNested')), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function onEvent(Event $e) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     public function onEventWithPriority(Event $e) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     public function onEventNested(Event $e) | ||
|  |     { | ||
|  |     } | ||
|  | } |