Passed
Pull Request — master (#14)
by Alexander
01:17
created

ConcreteProviderTest::createConcreteProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Yiisoft\EventDispatcher\Tests\Provider;
4
5
use PHPUnit\Framework\TestCase;
6
use Yiisoft\EventDispatcher\Provider\ConcreteProvider;
7
use Yiisoft\EventDispatcher\Tests\Event\ClassInterface;
8
use Yiisoft\EventDispatcher\Tests\Event\ClassItself;
9
use Yiisoft\EventDispatcher\Tests\Event\Event;
10
use Yiisoft\EventDispatcher\Tests\Event\ParentClass;
11
use Yiisoft\EventDispatcher\Tests\Event\ParentInterface;
12
13
use function array_slice;
14
15
final class ConcreteProviderTest extends TestCase
16
{
17
    public function testListenerForEventIsReturned(): void
18
    {
19
        $provider = $this->createConcreteProvider();
20
21
        $listener = fn () => null;
22
23
        $provider->attach(Event::class, $listener);
24
25
        $listeners = $provider->getListenersForEvent(new Event());
26
27
        $this->assertEquals([$listener], $listeners);
28
    }
29
30
    public function testDetachListenersForEventAreDetached(): void
31
    {
32
        $provider = $this->createConcreteProvider();
33
34
        $provider->attach(Event::class, fn () => null);
35
        $provider->detach(Event::class);
36
37
        $listeners = $provider->getListenersForEvent(new Event());
38
39
        $this->assertCount(0, $listeners);
40
    }
41
42
    public function testListenersForClassHierarchyAreReturned(): void
43
    {
44
        $provider = $this->createConcreteProvider();
45
46
        $provider->attach(ParentInterface::class, function (ParentInterface $parentInterface) {
47
            $parentInterface->register('parent interface');
48
        });
49
        $provider->attach(ParentClass::class, function (ParentClass $parentClass) {
50
            $parentClass->register('parent class');
51
        });
52
        $provider->attach(ClassInterface::class, function (ClassInterface $classInterface) {
53
            $classInterface->register('class interface');
54
        });
55
        $provider->attach(ClassItself::class, function (ClassItself $classItself) {
56
            $classItself->register('class itself');
57
        });
58
59
        $event = new ClassItself();
60
        foreach ($provider->getListenersForEvent($event) as $listener) {
61
            $listener($event);
62
        }
63
64
        $classHierarchyHandlers = array_slice($event->registered(), 0, 2);
65
        $interfaceHandlers = array_slice($event->registered(), 2);
66
67
        $this->assertEquals(
68
            [
69
                'class itself',
70
                'parent class',
71
            ],
72
            $classHierarchyHandlers
73
        );
74
75
        $this->assertContains('class interface', $interfaceHandlers);
76
        $this->assertContains('parent interface', $interfaceHandlers);
77
    }
78
79
    private function createConcreteProvider(): ConcreteProvider
80
    {
81
        return new ConcreteProvider();
82
    }
83
}
84