/** * 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; }
/** * 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('*****@*****.**'); }
/** * Test StopPropagation method. */ public function testStopPropagation() { $this->given($event = new Event())->then()->boolean($event->isPropagationStopped())->isFalse()->and()->when($event->stopPropagation())->then()->boolean($event->isPropagationStopped())->isTrue(); }