From 9aa63f27445089a144908246e7d5319bc2d707fc Mon Sep 17 00:00:00 2001 From: Funky Waddle Date: Wed, 25 Feb 2026 00:33:02 -0600 Subject: [PATCH] Milestone 2: Advanced Listener Resolution (ListenerProvider logic & tests) --- tests/Unit/AdvancedResolutionTest.php | 100 ++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tests/Unit/AdvancedResolutionTest.php diff --git a/tests/Unit/AdvancedResolutionTest.php b/tests/Unit/AdvancedResolutionTest.php new file mode 100644 index 0000000..697a259 --- /dev/null +++ b/tests/Unit/AdvancedResolutionTest.php @@ -0,0 +1,100 @@ +addListener('stdClass', function() use (&$order) { $order[] = 'low'; }, 0); + $provider->addListener('stdClass', function() use (&$order) { $order[] = 'high'; }, 100); + $provider->addListener('stdClass', function() use (&$order) { $order[] = 'medium'; }, 50); + + $listeners = $provider->getListenersForEvent(new \stdClass()); + foreach ($listeners as $listener) { + $listener(); + } + + $this->assertEquals(['high', 'medium', 'low'], $order); + } + + public function test_it_resolves_inheritance(): void + { + $provider = new ListenerProvider(); + $called = []; + + $provider->addListener(ParentEvent::class, function() use (&$called) { $called[] = 'parent'; }); + $provider->addListener(TestInterface::class, function() use (&$called) { $called[] = 'interface'; }); + $provider->addListener(ChildEvent::class, function() use (&$called) { $called[] = 'child'; }); + + $listeners = $provider->getListenersForEvent(new ChildEvent()); + foreach ($listeners as $listener) { + $listener(); + } + + $this->assertContains('parent', $called); + $this->assertContains('interface', $called); + $this->assertContains('child', $called); + } + + public function test_it_respects_interface_resolution_toggle(): void + { + $provider = new ListenerProvider(); + $provider->setResolveInterfaces(false); + $called = []; + + $provider->addListener(TestInterface::class, function() use (&$called) { $called[] = 'interface'; }); + $provider->addListener(ChildEvent::class, function() use (&$called) { $called[] = 'child'; }); + + $listeners = $provider->getListenersForEvent(new ChildEvent()); + foreach ($listeners as $listener) { $listener(); } + + $this->assertNotContains('interface', $called); + $this->assertContains('child', $called); + } + + public function test_it_resolves_wildcards(): void + { + $provider = new ListenerProvider(); + $called = []; + + $provider->addListener('Phred\Beacon\Tests\Unit\*', function() use (&$called) { $called[] = 'wildcard'; }); + + $listeners = $provider->getListenersForEvent(new ChildEvent()); + foreach ($listeners as $listener) { $listener(); } + + $this->assertContains('wildcard', $called); + } + + public function test_complex_priority_with_inheritance_and_wildcards(): void + { + $provider = new ListenerProvider(); + $order = []; + + // Exact match (low priority) + $provider->addListener(ChildEvent::class, function() use (&$order) { $order[] = 'exact'; }, 0); + + // Wildcard match (high priority) + $provider->addListener('Phred\*', function() use (&$order) { $order[] = 'wildcard'; }, 100); + + // Interface match (medium priority) + $provider->addListener(TestInterface::class, function() use (&$order) { $order[] = 'interface'; }, 50); + + $listeners = $provider->getListenersForEvent(new ChildEvent()); + foreach ($listeners as $listener) { $listener(); } + + $this->assertEquals(['wildcard', 'interface', 'exact'], $order); + } +}