Completed
Pull Request — master (#8)
by Mathieu
02:10
created

EventDispatcherTest::testFireObjet()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 7
rs 10
1
<?php
2
3
use Suricate\Event\EventDispatcher;
4
5
require_once 'stubs/Event.php';
6
require_once 'stubs/EventListener1.php';
7
require_once 'stubs/EventListener2.php';
8
require_once 'stubs/EventListener3.php';
9
10
/**
11
 * @SuppressWarnings("StaticAccess")
12
 */
13
class EventDispatcherTest extends \PHPUnit\Framework\TestCase
14
{
15
    public function testConfigure()
16
    {
17
        $parameters = [
18
            [
19
                'event' => 'my.event',
20
                'listeners' => ['listener1', 'listener2', 'listener3|50']
21
            ]
22
        ];
23
        $dispatcher = new EventDispatcher();
24
        $dispatcher->configure($parameters);
25
26
        $reflector = new ReflectionClass(get_class($dispatcher));
27
        $property = $reflector->getProperty('listeners');
28
        $property->setAccessible(true);
29
30
        $result = [
31
            'my.event' => [0 => ['listener1', 'listener2'], 50 => ['listener3']]
32
        ];
33
        $this->assertSame($result, $property->getValue($dispatcher));
34
    }
35
36
    public function testAddListener()
37
    {
38
        $dispatcher = new EventDispatcher();
39
40
        $reflector = new ReflectionClass(get_class($dispatcher));
41
        $property = $reflector->getProperty('listeners');
42
        $property->setAccessible(true);
43
        $this->assertSame([], $property->getValue($dispatcher));
44
45
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener', 12);
46
        $result = ['dummy.event' => [12 => ['\MyProject\MyListener']]];
47
        $this->assertSame($result, $property->getValue($dispatcher));
48
49
        $dispatcher->addListener(
50
            'dummy.event',
51
            '\MyProject\MySecondListener',
52
            10
53
        );
54
        $result = [
55
            'dummy.event' => [
56
                12 => ['\MyProject\MyListener'],
57
                10 => ['\MyProject\MySecondListener']
58
            ]
59
        ];
60
        $this->assertSame($result, $property->getValue($dispatcher));
61
62
        $dispatcher->addListener('TestEvent', '\MyProject\MyThirdListener', 12);
63
        $result = [
64
            'dummy.event' => [
65
                12 => ['\MyProject\MyListener'],
66
                10 => ['\MyProject\MySecondListener']
67
            ],
68
            'my.test.event' => [12 => ['\MyProject\MyThirdListener']]
69
        ];
70
        $this->assertSame($result, $property->getValue($dispatcher));
71
    }
72
73
    public function testFire()
74
    {
75
        $dispatcher = new EventDispatcher();
76
        $dispatcher->addListener('test.event', 'EventListener1');
77
        $dispatcher->addListener('test.event', 'EventListener2');
78
        $dispatcher->fire('test.event', 'payload_string');
79
        $this->expectOutputString(
80
            "payload for listerner1 is : payload_string\npayload for listerner2 is : payload_string\n"
81
        );
82
    }
83
84
    public function testFireObjet()
85
    {
86
        $dispatcher = new EventDispatcher();
87
        $dispatcher->addListener('my.test.event', 'EventListener3');
88
        $dispatcher->addListener('test.event', 'EventListener2');
89
        $dispatcher->fire(new TestEvent());
90
        $this->expectOutputString("payload for listerner3 is : lorem ipsum\n");
91
    }
92
93
    public function testFireException()
94
    {
95
        $dispatcher = new EventDispatcher();
96
        $this->expectException('InvalidArgumentException');
97
98
        $dispatcher->fire(
99
            /** @scrutinizer ignore-type */
100
            new \Stdclass()
101
        );
102
    }
103
104
    public function testGetImpactedListeners()
105
    {
106
        $dispatcher = new EventDispatcher();
107
108
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener', 12);
109
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener2', 10);
110
        $dispatcher->addListener('another.event', '\MyProject\MyListener3', 12);
111
112
        $reflection = new \ReflectionClass(get_class($dispatcher));
113
        $method = $reflection->getMethod('getImpactedListeners');
114
        $method->setAccessible(true);
115
        $methodResult = $method->invoke($dispatcher, 'dummy.event');
116
117
        $this->assertSame(
118
            ['\MyProject\MyListener2', '\MyProject\MyListener'],
119
            $methodResult
120
        );
121
122
        $methodResult = $method->invoke($dispatcher, 'dummy.event');
123
        $this->assertSame(
124
            ['\MyProject\MyListener2', '\MyProject\MyListener'],
125
            $methodResult
126
        );
127
    }
128
129
    public function testSortListeners()
130
    {
131
        $dispatcher = new EventDispatcher();
132
133
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener', 12);
134
        $dispatcher->addListener('dummy.event', '\MyProject\MyListener2', 10);
135
        $dispatcher->addListener('another.event', '\MyProject\MyListener3', 12);
136
137
        $reflection = new \ReflectionClass(get_class($dispatcher));
138
        $method = $reflection->getMethod('sortListeners');
139
        $method->setAccessible(true);
140
        $method->invoke($dispatcher, 'dummy.event');
141
142
        $property = $reflection->getProperty('sortedListeners');
143
        $property->setAccessible(true);
144
145
        $result = [
146
            'dummy.event' => ['\MyProject\MyListener2', '\MyProject\MyListener']
147
        ];
148
        $this->assertEquals($result, $property->getValue($dispatcher));
149
150
        $method->invoke($dispatcher, 'unknown.event');
151
        $this->assertEquals($result, $property->getValue($dispatcher));
152
    }
153
}
154