<?php 
 
namespace Wingu\OctopusCore\EventDispatcher\Tests\Integration; 
 
use Wingu\OctopusCore\EventDispatcher\EventDispatcher; 
use Wingu\OctopusCore\EventDispatcher\EventInterface; 
use Wingu\OctopusCore\EventDispatcher\Event; 
use Wingu\OctopusCore\EventDispatcher\Subscription; 
use Wingu\OctopusCore\EventDispatcher\EventNameMatcher\AllNamesMatcher; 
use Wingu\OctopusCore\EventDispatcher\EventNameMatcher\NameMatcher; 
use Wingu\OctopusCore\EventDispatcher\EventNameMatcher\WildcardMatcher; 
 
class EventDispatcherTest extends TestCase { 
 
    public function testRaiseEventNoSubscriptions() { 
        $ed = new EventDispatcher(); 
        $event = new Event(null); 
        $response = $ed->raiseEvent('test', $event); 
 
        $this->assertFalse($ed->hasEventSubscriptions('test')); 
        $this->assertCount(0, $response); 
        $this->assertSame($event, $response->getRaisedEvent()); 
    } 
 
    public function testRaiseEventUntilCallbackCalledAfterEvent() { 
        $ed = new EventDispatcher(); 
        $event = new Event(null); 
 
        $callbackCalled = false; 
        $untilCallback = function () use (&$callbackCalled) { 
            $callbackCalled = true; 
        }; 
 
        $ed->on('test', function(EventInterface $event) use ($callbackCalled) { 
            $event->stopPropagation(); 
            $this->assertFalse($callbackCalled); 
        }); 
 
        $ed->raiseEventUntil('test', $event, $untilCallback); 
 
        $this->assertTrue($callbackCalled); 
    } 
 
    public function testRaiseEventUntilCallbackStops() { 
        $ed = new EventDispatcher(); 
        $event = new Event(null); 
 
        $untilCallback = function () { 
            return false; 
        }; 
 
        $ed->on('test', function(EventInterface $event) {}); 
        $ed->on('test', function(EventInterface $event) { 
            $this->fail('Callback returning FALSE did not stop the event.'); 
        }); 
 
        $ed->raiseEventUntil('test', $event, $untilCallback); 
    } 
 
    public function testStopEventPropagation() { 
        $ed = new EventDispatcher(); 
        $event = new Event(null); 
 
        $responseReturn1 = new \stdClass(); 
        $ed->on('test', function(EventInterface $event) use ($responseReturn1) { 
            $event->stopPropagation(); 
            return $responseReturn1; 
        }); 
        $ed->on('test', function() { 
            $this->fail('Event propagation did not stop event handler trigger.'); 
        }); 
        $ed->on('test2', function() { 
            $this->fail('Event should have not fired.'); 
        }); 
 
        $this->assertSame(3, count($ed->getSubscriptions())); 
        $this->assertTrue($ed->hasEventSubscriptions('test')); 
        $this->assertSame(2, count($ed->getEventSubscriptions('test'))); 
 
        $response = $ed->raiseEvent('test', $event); 
 
        $this->assertCount(1, $response); 
        $this->assertSame($event, $response->getRaisedEvent()); 
        $this->assertSame($responseReturn1, $response[0]); 
    } 
 
    public function testEventUnsubscribing() { 
        $ed = new EventDispatcher(); 
        $event = new Event(null); 
        $handler = function() { 
            $this->fail('Event unsubscribing failed.'); 
        }; 
        $ed->on('test', $handler); 
        $ed->off('test', $handler); 
 
        $ed->raiseEvent('test', $event); 
    } 
 
    public function testRemoveSubscription() { 
        $ed = new EventDispatcher(); 
 
        $handler1 = function() {}; 
        $handler2 = function() {}; 
        $subscription1 = new Subscription(new NameMatcher('test'), $handler1); 
        $subscription2 = new Subscription(new AllNamesMatcher(), $handler2); 
 
        $ed->addSubscription($subscription1); 
        $ed->addSubscription($subscription2); 
 
        $this->assertCount(2, $ed->getEventSubscriptions('test')); 
 
        $ed->removeSubscription($subscription1); 
        $this->assertCount(1, $ed->getEventSubscriptions('test')); 
 
        $ed->removeSubscription(new Subscription(new AllNamesMatcher(), $handler2)); 
        $this->assertCount(0, $ed->getEventSubscriptions('test')); 
    } 
 
    public function testAddSubscriber() { 
        $ed = new EventDispatcher(); 
 
        $handler = function() {}; 
        $subscription1 = new Subscription(new NameMatcher('test'), $handler); 
        $subscription2 = new Subscription(new NameMatcher('test'), $handler); 
 
        $subscriber = $this->getMock('Wingu\OctopusCore\EventDispatcher\EventSubscriberInterface'); 
        $subscriber->expects($this->any())->method('getSubscriptions')->will($this->returnValue([$subscription1, $subscription2])); 
 
        $ed->addSubscriber($subscriber); 
 
        $this->assertCount(2, $ed->getEventSubscriptions('test')); 
 
        $ed->removeSubscriber($subscriber); 
        $this->assertFalse($ed->hasSubscriptions()); 
    } 
}
 
 |