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

ConcreteProviderTest   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 32
c 2
b 0
f 0
dl 0
loc 68
rs 10
wmc 5

4 Methods

Rating   Name   Duplication   Size   Complexity  
A createConcreteProvider() 0 3 1
A testListenerForEventIsReturned() 0 12 1
A testListenersForClassHierarchyAreReturned() 0 35 2
A testDetachListenersForEventAreDetached() 0 10 1
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