2015-08-17 17:00:26 -07:00
< ? 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 ();
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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 ();
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\SubscriberService' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$service
-> expects ( $this -> once ())
-> method ( 'onEvent' )
-> with ( $event )
;
2016-04-20 09:56:34 -07:00
$service
-> expects ( $this -> once ())
-> method ( 'onEventWithPriority' )
-> with ( $event )
;
$service
-> expects ( $this -> once ())
-> method ( 'onEventNested' )
-> with ( $event )
;
2015-08-17 17:00:26 -07:00
$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 );
2016-04-20 09:56:34 -07:00
$dispatcher -> dispatch ( 'onEventWithPriority' , $event );
$dispatcher -> dispatch ( 'onEventNested' , $event );
2015-08-17 17:00:26 -07:00
}
public function testPreventDuplicateListenerService ()
{
$event = new Event ();
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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
2016-04-20 09:56:34 -07:00
* @ group legacy
2015-08-17 17:00:26 -07:00
*/
public function testTriggerAListenerServiceOutOfScope ()
{
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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' );
}
2016-04-20 09:56:34 -07:00
/**
* @ group legacy
*/
2015-08-17 17:00:26 -07:00
public function testReEnteringAScope ()
{
$event = new Event ();
2017-02-02 16:28:38 -08:00
$service1 = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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 );
2017-02-02 16:28:38 -08:00
$service2 = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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 ();
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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 ()
{
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$container = new Container ();
$container -> set ( 'service.listener' , $service );
$dispatcher = new ContainerAwareEventDispatcher ( $container );
$dispatcher -> addListenerService ( 'onEvent' , array ( 'service.listener' , 'onEvent' ));
$listeners = $dispatcher -> getListeners ();
$this -> assertTrue ( isset ( $listeners [ 'onEvent' ]));
$this -> assertCount ( 1 , $dispatcher -> getListeners ( 'onEvent' ));
}
public function testRemoveAfterDispatch ()
{
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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 ()
{
2017-02-02 16:28:38 -08:00
$service = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\Tests\Service' ) -> getMock ();
2015-08-17 17:00:26 -07:00
$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 (
2016-04-20 09:56:34 -07:00
'onEvent' => 'onEvent' ,
'onEventWithPriority' => array ( 'onEventWithPriority' , 10 ),
'onEventNested' => array ( array ( 'onEventNested' )),
2015-08-17 17:00:26 -07:00
);
}
public function onEvent ( Event $e )
{
}
2016-04-20 09:56:34 -07:00
public function onEventWithPriority ( Event $e )
{
}
public function onEventNested ( Event $e )
{
}
2015-08-17 17:00:26 -07:00
}