Completed
Branch feature/events (96fd77)
by Mathieu
05:41 queued 03:30
created

EventDispatcherTest::testConfigure()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 11
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 19
rs 9.9
1
<?php
2
3
use Suricate\EventDispatcher;
4
5
require_once 'stubs/Event.php';
6
7
/**
8
 * @SuppressWarnings("StaticAccess")
9
 */
10
class EventDispatcherTest extends \PHPUnit\Framework\TestCase
11
{
12
    public function testConfigure()
13
    {
14
        $parameters = [
15
            [
16
                'event' => 'my.event',
17
                'listeners' => ['listener1', 'listener2', 'listener3|50']
18
            ]
19
        ];
20
        $dispatcher = new EventDispatcher();
21
        $dispatcher->configure($parameters);
22
23
        $reflector = new ReflectionClass(get_class($dispatcher));
24
        $property = $reflector->getProperty('listeners');
25
        $property->setAccessible(true);
26
27
        $result = [
28
            'my.event' => [0 => ['listener1', 'listener2'], 50 => ['listener3']]
29
        ];
30
        $this->assertSame($result, $property->getValue($dispatcher));
31
    }
32
33
    public function testAddListener()
34
    {
35
        $dispatcher = new EventDispatcher();
36
37
        $reflector = new ReflectionClass(get_class($dispatcher));
38
        $property = $reflector->getProperty('listeners');
39
        $property->setAccessible(true);
40
        $this->assertSame([], $property->getValue($dispatcher));
41
42
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener', 12);
43
        $result = ['dummy.event' => [12 => ['\MyProject\MyListener']]];
44
        $this->assertSame($result, $property->getValue($dispatcher));
45
46
        $dispatcher->addListener(
47
            'dummy.event',
48
            '\MyProject\MySecondListener',
49
            10
50
        );
51
        $result = [
52
            'dummy.event' => [
53
                12 => ['\MyProject\MyListener'],
54
                10 => ['\MyProject\MySecondListener']
55
            ]
56
        ];
57
        $this->assertSame($result, $property->getValue($dispatcher));
58
59
        $dispatcher->addListener('TestEvent', '\MyProject\MyThirdListener', 12);
60
        $result = [
61
            'dummy.event' => [
62
                12 => ['\MyProject\MyListener'],
63
                10 => ['\MyProject\MySecondListener']
64
            ],
65
            'my.test.event' => [12 => ['\MyProject\MyThirdListener']]
66
        ];
67
        $this->assertSame($result, $property->getValue($dispatcher));
68
    }
69
    public function testGetImpactedListeners()
70
    {
71
        $dispatcher = new EventDispatcher();
72
73
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener', 12);
74
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener2', 10);
75
        $dispatcher->addListener('another.event', '\MyProject\MyListener3', 12);
76
77
        $reflection = new \ReflectionClass(get_class($dispatcher));
78
        $method = $reflection->getMethod('getImpactedListeners');
79
        $method->setAccessible(true);
80
        $methodResult = $method->invoke($dispatcher, 'dummy.event');
81
82
        $this->assertSame(
83
            ['\MyProject\MyListener2', '\MyProject\MyListener'],
84
            $methodResult
85
        );
86
87
        $methodResult = $method->invoke($dispatcher, 'dummy.event');
88
        $this->assertSame(
89
            ['\MyProject\MyListener2', '\MyProject\MyListener'],
90
            $methodResult
91
        );
92
    }
93
94
    public function testSortListeners()
95
    {
96
        $dispatcher = new EventDispatcher();
97
98
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener', 12);
99
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener2', 10);
100
        $dispatcher->addListener('another.event', '\MyProject\MyListener3', 12);
101
102
        $reflection = new \ReflectionClass(get_class($dispatcher));
103
        $method = $reflection->getMethod('sortListeners');
104
        $method->setAccessible(true);
105
        $method->invoke($dispatcher, 'dummy.event');
106
107
        $property = $reflection->getProperty('sortedListeners');
108
        $property->setAccessible(true);
109
110
        $result = [
111
            'dummy.event' => ['\MyProject\MyListener2', '\MyProject\MyListener']
112
        ];
113
        $this->assertEquals($result, $property->getValue($dispatcher));
114
115
        $method->invoke($dispatcher, 'unknown.event');
116
        $this->assertEquals($result, $property->getValue($dispatcher));
117
    }
118
}
119