Passed
Pull Request — master (#14)
by Alexander
01:19
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->assertCount(1, $listeners);
28
        $this->assertContains($listener, $listeners);
29
    }
30
31
    public function testDetachListenersForEventAreDetached(): void
32
    {
33
        $provider = $this->createConcreteProvider();
34
35
        $provider->attach(Event::class, fn () => null);
36
        $provider->detach(Event::class);
37
38
        $listeners = $provider->getListenersForEvent(new Event());
39
40
        $this->assertCount(0, $listeners);
41
    }
42
43
    public function testListenersForClassHierarchyAreReturned(): void
44
    {
45
        $provider = $this->createConcreteProvider();
46
47
        $provider->attach(ParentInterface::class, function (ParentInterface $parentInterface) {
48
            $parentInterface->register('parent interface');
49
        });
50
        $provider->attach(ParentClass::class, function (ParentClass $parentClass) {
51
            $parentClass->register('parent class');
52
        });
53
        $provider->attach(ClassInterface::class, function (ClassInterface $classInterface) {
54
            $classInterface->register('class interface');
55
        });
56
        $provider->attach(ClassItself::class, function (ClassItself $classItself) {
57
            $classItself->register('class itself');
58
        });
59
60
        $event = new ClassItself();
61
        foreach ($provider->getListenersForEvent($event) as $listener) {
62
            $listener($event);
63
        }
64
65
        $classHierarchyHandlers = array_slice($event->registered(), 0, 2);
66
        $interfaceHandlers = array_slice($event->registered(), 2);
67
68
        $this->assertEquals(
69
            [
70
                'class itself',
71
                'parent class',
72
            ],
73
            $classHierarchyHandlers
74
        );
75
76
        $this->assertContains('class interface', $interfaceHandlers);
77
        $this->assertContains('parent interface', $interfaceHandlers);
78
    }
79
80
    private function createConcreteProvider(): ConcreteProvider
81
    {
82
        return new ConcreteProvider();
83
    }
84
}
85