emit($scope, $method, $arguments); } } /** * Class EmittedException * * a dummy exception so we can check if an event is emitted * * @package Test\Hooks */ class EmittedException extends \Exception { } class BasicEmitterTest extends \Test\TestCase { /** * @var \OC\Hooks\Emitter $emitter */ protected $emitter; protected function setUp(): void { parent::setUp(); $this->emitter = new DummyEmitter(); } public function nonStaticCallBack() { throw new EmittedException; } public static function staticCallBack() { throw new EmittedException; } public function testAnonymousFunction(): void { $this->expectException(\Test\Hooks\EmittedException::class); $this->emitter->listen('Test', 'test', function () { throw new EmittedException; }); $this->emitter->emitEvent('Test', 'test'); } public function testStaticCallback(): void { $this->expectException(\Test\Hooks\EmittedException::class); $this->emitter->listen('Test', 'test', ['\Test\Hooks\BasicEmitterTest', 'staticCallBack']); $this->emitter->emitEvent('Test', 'test'); } public function testNonStaticCallback(): void { $this->expectException(\Test\Hooks\EmittedException::class); $this->emitter->listen('Test', 'test', [$this, 'nonStaticCallBack']); $this->emitter->emitEvent('Test', 'test'); } public function testOnlyCallOnce(): void { $count = 0; $listener = function () use (&$count) { $count++; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->assertEquals(1, $count, 'Listener called an invalid number of times (' . $count . ') expected 1'); } public function testDifferentMethods(): void { $count = 0; $listener = function () use (&$count) { $count++; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Test', 'foo'); $this->assertEquals(2, $count, 'Listener called an invalid number of times (' . $count . ') expected 2'); } public function testDifferentScopes(): void { $count = 0; $listener = function () use (&$count) { $count++; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Bar', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Bar', 'test'); $this->assertEquals(2, $count, 'Listener called an invalid number of times (' . $count . ') expected 2'); } public function testDifferentCallbacks(): void { $count = 0; $listener1 = function () use (&$count) { $count++; }; $listener2 = function () use (&$count) { $count++; }; $this->emitter->listen('Test', 'test', $listener1); $this->emitter->listen('Test', 'test', $listener2); $this->emitter->emitEvent('Test', 'test'); $this->assertEquals(2, $count, 'Listener called an invalid number of times (' . $count . ') expected 2'); } public function testArguments(): void { $this->expectException(\Test\Hooks\EmittedException::class); $this->emitter->listen('Test', 'test', function ($foo, $bar) { if ($foo == 'foo' and $bar == 'bar') { throw new EmittedException; } }); $this->emitter->emitEvent('Test', 'test', ['foo', 'bar']); } public function testNamedArguments(): void { $this->expectException(\Test\Hooks\EmittedException::class); $this->emitter->listen('Test', 'test', function ($foo, $bar) { if ($foo == 'foo' and $bar == 'bar') { throw new EmittedException; } }); $this->emitter->emitEvent('Test', 'test', ['foo' => 'foo', 'bar' => 'bar']); } public function testRemoveAllSpecified(): void { $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->removeListener('Test', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->addToAssertionCount(1); } public function testRemoveWildcardListener(): void { $listener1 = function () { throw new EmittedException; }; $listener2 = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener1); $this->emitter->listen('Test', 'test', $listener2); $this->emitter->removeListener('Test', 'test'); $this->emitter->emitEvent('Test', 'test'); $this->addToAssertionCount(1); } public function testRemoveWildcardMethod(): void { $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); $this->emitter->removeListener('Test', null, $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Test', 'foo'); $this->addToAssertionCount(1); } public function testRemoveWildcardScope(): void { $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Bar', 'test', $listener); $this->emitter->removeListener(null, 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Bar', 'test'); $this->addToAssertionCount(1); } public function testRemoveWildcardScopeAndMethod(): void { $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); $this->emitter->listen('Bar', 'foo', $listener); $this->emitter->removeListener(null, null, $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Test', 'foo'); $this->emitter->emitEvent('Bar', 'foo'); $this->addToAssertionCount(1); } public function testRemoveKeepOtherCallback(): void { $this->expectException(\Test\Hooks\EmittedException::class); $listener1 = function () { throw new EmittedException; }; $listener2 = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener1); $this->emitter->listen('Test', 'test', $listener2); $this->emitter->removeListener('Test', 'test', $listener1); $this->emitter->emitEvent('Test', 'test'); $this->addToAssertionCount(1); } public function testRemoveKeepOtherMethod(): void { $this->expectException(\Test\Hooks\EmittedException::class); $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); $this->emitter->removeListener('Test', 'foo', $listener); $this->emitter->emitEvent('Test', 'test'); $this->addToAssertionCount(1); } public function testRemoveKeepOtherScope(): void { $this->expectException(\Test\Hooks\EmittedException::class); $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Bar', 'test', $listener); $this->emitter->removeListener('Bar', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->addToAssertionCount(1); } public function testRemoveNonExistingName(): void { $this->expectException(\Test\Hooks\EmittedException::class); $listener = function () { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->removeListener('Bar', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->addToAssertionCount(1); } }