<?php
// listener classes to hold values that can be checked after firing events
class MyEventListener implements A_Event_Listener {
public $name = '';
public $eventName = '';
public $eventObject = null;
public function __construct($name) {
$this->name = $name;
}
public function onEvent($name, $object) {
$this->eventName = $name;
$this->eventObject = $object;
# echo 'single ' . $name . '<br />';
print_r($object);
return $this->eventName;
}
public function anotherEvent($name, $object) {
$this->eventName = "anotherEvent:$name";
$this->eventObject = $object;
# echo 'single ' . $name . '<br />';
# print_r($object);
return $this->eventName;
}
}
class MyEventMultiListener implements A_Event_Listener {
public $name = '';
public $eventName = '';
public $eventObject = null;
public function __construct($name) {
$this->name = $name;
}
public function onEvent($name, $object) {
$this->eventName = $name;
$this->eventObject = $object;
return $this->eventName;
}
public function getEvents() {
return array('event2', 'event3');
}
}
// class to pass to event handlers
class Event_ManagerTest_ValueObject {
public $data = '';
}
class Event_ManagerTest extends UnitTestCase {
public function testEvents() {
$manager = new A_Event_Manager();
$listener1 = new MyEventListener('listener1');
$manager->addEventListener('event1', $listener1); // single event
$listener2 = new MyEventListener('listener2');
$manager->addEventListener('event2', $listener2); // single event
$listener3 = new MyEventListener('listener3');
$manager->addEventListener(array('event1', 'event3'), $listener3); // multiple events
$listener4 = new MyEventMultiListener('listener4'); // internally specifies listening for array('event2', 'event3')
$manager->addEventListener($listener4);
// intialized state
$this->assertTrue($listener1->eventName == '');
$this->assertTrue($listener2->eventName == '');
$this->assertTrue($listener3->eventName == '');
$this->assertTrue($listener4->eventName == '');
$manager->fireEvent('event1');
$this->assertTrue($listener1->eventName == 'event1');
$this->assertTrue($listener2->eventName == '');
$this->assertTrue($listener3->eventName == 'event1');
$this->assertTrue($listener4->eventName == '');
$manager->fireEvent('event2');
$this->assertTrue($listener1->eventName == 'event1');
$this->assertTrue($listener2->eventName == 'event2');
$this->assertTrue($listener3->eventName == 'event1');
$this->assertTrue($listener4->eventName == 'event2');
$manager->fireEvent('event3');
$this->assertTrue($listener1->eventName == 'event1');
$this->assertTrue($listener2->eventName == 'event2');
$this->assertTrue($listener3->eventName == 'event3');
$this->assertTrue($listener4->eventName == 'event3');
}
public function testUserFuncParam() {
$manager = new A_Event_Manager();
$listener1 = new MyEventListener('listener1');
$manager->addEventListener('event1', array($listener1, 'anotherEvent'));
$this->assertTrue($listener1->eventName == '');
$result = $manager->fireEvent('event1');
$this->assertTrue($listener1->eventName == 'anotherEvent:event1');
$this->assertTrue($result == array('anotherEvent:event1'));
}
public function testClosure() {
$manager = new A_Event_Manager();
// add a closure that sets an object's property
$manager->addEventListener('event1', function($name, $object) { $object->data = $name; return $name; });
// create object and pass to event
$object = new Event_ManagerTest_ValueObject();
$result = $manager->fireEvent('event1', $object);
$this->assertTrue($object->data == 'event1');
$this->assertTrue($result == array('event1'));
}
public function testEventsReturnValues() {
$manager = new A_Event_Manager();
$manager->addEventListener('event1', function($name, $object) { return 'listener1'; });
$manager->addEventListener('event1', function($name, $object) { return 'listener2'; });
$result = $manager->fireEvent('event1');
$this->assertTrue($result == array('listener1', 'listener2'));
}
public function testEventsCancel() {
$manager = new A_Event_Manager();
$manager->addEventListener('event1', function($name, $object) { return 'listener1'; });
$manager->addEventListener('event1', function($name, $object) { return false; });
$manager->addEventListener('event1', function($name, $object) { return 'listener3'; });
$result = $manager->fireEvent('event1');
$this->assertTrue($result == array('listener1'));
}
public function testLoadHandler() {
$manager = new A_Event_Manager();
$manager->addEventListener('event1', 'Handler');
$manager->setPath(__DIR__);
$result = $manager->fireEvent('event1');
$this->assertTrue($result == array('listener1'));
}
}
|