Example #1
0
 /**
  * Ensure event input is of type EventInterface or convert it.
  *
  * @param string|EventInterface $event
  *
  * @throws InvalidArgumentException
  *
  * @return EventInterface
  */
 public function ensureEvent($event)
 {
     if (is_string($event)) {
         return Event::named($event);
     }
     if (!$event instanceof EventInterface) {
         throw new \InvalidArgumentException(sprintf('Events should be provides as %s instances or string, received type: %s', EventInterface::class, gettype($event)));
     }
     return $event;
 }
Example #2
0
 /**
  * Test Dispatch method.
  */
 public function testDispatch()
 {
     // dispatch event name
     $this->given($dispatcher = $this->createEventDispatcher())->when($event = $dispatcher->dispatch('foo.event'))->then()->object($event)->isInstanceOf(Event::class);
     // dispatch event named
     $this->given($dispatcher = $this->createEventDispatcher())->when($event = $dispatcher->dispatch(Event::named('foo.event')))->then()->object($event)->isInstanceOf(Event::class);
     // dispatch event class
     $this->given($dispatcher = $this->createEventDispatcher())->when($event = $dispatcher->dispatch(new LoginUserEvent('*****@*****.**')))->then()->object($event)->isInstanceOf(EventInterface::class);
     // dispatch invalid event
     $this->given($dispatcher = $this->createEventDispatcher())->then()->exception(function () use($dispatcher) {
         $dispatcher->dispatch(new InvalidEvent());
     })->isInstanceOf(\InvalidArgumentException::class);
     // dispatch with one callable listener
     $this->given($dispatcher = $this->createEventDispatcher())->and($counter = 0)->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         ++$counter;
     }))->when($dispatcher->dispatch('foo.event'))->then()->integer($counter)->isEqualTo(1);
     // dispatch with many callable listener
     $this->given($dispatcher = $this->createEventDispatcher())->and($counter = 0)->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         ++$counter;
     }))->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         ++$counter;
     }))->when($dispatcher->dispatch('foo.event'))->then()->integer($counter)->isEqualTo(2);
     // dispatch with many callable listener but stopped the event propagation
     $this->given($dispatcher = $this->createEventDispatcher())->and($counter = 0)->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         ++$counter;
         $event->stopPropagation();
     }))->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         ++$counter;
     }))->when($dispatcher->dispatch('foo.event'))->then()->integer($counter)->isEqualTo(1);
     // dispatch with many callable listener and priority
     $this->given($dispatcher = $this->createEventDispatcher())->and($counter = 3)->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         $counter = $counter * 5;
     }, 50))->and($dispatcher->addListener('foo.event', function (Event $event) use(&$counter) {
         $counter = $counter + 2;
     }, 100))->when($dispatcher->dispatch('foo.event'))->then()->integer($counter)->isEqualTo(25);
     // dispatch with many listener class or callable
     $this->given($dispatcher = $this->createEventDispatcher())->and($event = new LoginUserEvent('*****@*****.**'))->and($dispatcher->addListener($event->eventName(), array(new LoginUserEventListener(), 'onLogin')))->and($dispatcher->addListener($event->eventName(), function (LoginUserEvent $event) {
         $this->string($event->email())->isEqualTo('*****@*****.**');
         $event->setEmail('*****@*****.**');
     }))->when($dispatcher->dispatch($event))->then()->string($event->email())->isEqualTo('*****@*****.**');
 }
Example #3
0
 /**
  * Test Named method.
  */
 public function testNamed()
 {
     $this->given($event = Event::named('foo.event'))->when($name = $event->eventName())->then()->string($name)->isEqualTo('foo.event');
 }