12
12
use PHPUnit_Framework_TestCase as TestCase ;
13
13
use ReflectionProperty ;
14
14
use Zend \EventManager \EventManager ;
15
- use Zend \Stdlib \PriorityQueue ;
16
15
17
16
/**
18
17
* Trait providing utility methods and assertions for use in PHPUnit test cases.
24
23
*
25
24
* Some functionality in this trait duplicates functionality present in the
26
25
* version 2 EventManagerInterface and/or EventManager implementation, but
27
- * abstracts that functionality for use in v3. As such, components or code
28
- * that is testing for listener registration should use the methods in this
29
- * trait to ensure tests are forwards-compatible between zend-eventmanager
30
- * versions.
26
+ * abstracts that functionality for use in v3.
31
27
*/
32
28
trait EventListenerIntrospectionTrait
33
29
{
@@ -39,7 +35,10 @@ trait EventListenerIntrospectionTrait
39
35
*/
40
36
private function getEventsFromEventManager (EventManager $ events )
41
37
{
42
- return $ events ->getEvents ();
38
+ $ r = new ReflectionProperty ($ events , 'events ' );
39
+ $ r ->setAccessible (true );
40
+ $ listeners = $ r ->getValue ($ events );
41
+ return array_keys ($ listeners );
43
42
}
44
43
45
44
/**
@@ -62,8 +61,15 @@ private function getEventsFromEventManager(EventManager $events)
62
61
*/
63
62
private function getListenersForEvent ($ event , EventManager $ events , $ withPriority = false )
64
63
{
65
- $ listeners = $ events ->getListeners ($ event );
66
- return $ this ->traverseListeners ($ listeners , $ withPriority );
64
+ $ r = new ReflectionProperty ($ events , 'events ' );
65
+ $ r ->setAccessible (true );
66
+ $ listeners = $ r ->getValue ($ events );
67
+
68
+ if (! isset ($ listeners [$ event ])) {
69
+ return $ this ->traverseListeners ([]);
70
+ }
71
+
72
+ return $ this ->traverseListeners ($ listeners [$ event ], $ withPriority );
67
73
}
68
74
69
75
/**
@@ -82,7 +88,7 @@ private function assertListenerAtPriority(
82
88
EventManager $ events ,
83
89
$ message = ''
84
90
) {
85
- $ message = $ message ?: sprintf (
91
+ $ message = $ message ?: sprintf (
86
92
'Listener not found for event "%s" and priority %d ' ,
87
93
$ event ,
88
94
$ expectedPriority
@@ -119,18 +125,21 @@ private function getArrayOfListenersForEvent($event, EventManager $events)
119
125
/**
120
126
* Generator for traversing listeners in priority order.
121
127
*
122
- * @param PriorityQueue $listeners
128
+ * @param array $listeners
123
129
* @param bool $withPriority When true, yields priority as key.
124
130
*/
125
- public function traverseListeners (PriorityQueue $ queue , $ withPriority = false )
131
+ public function traverseListeners (array $ queue , $ withPriority = false )
126
132
{
127
- foreach ($ queue as $ handler ) {
128
- $ listener = $ handler ->getCallback ();
129
- if ($ withPriority ) {
130
- $ priority = (int ) $ handler ->getMetadatum ('priority ' );
131
- yield $ priority => $ listener ;
132
- } else {
133
- yield $ listener ;
133
+ krsort ($ queue , SORT_NUMERIC );
134
+
135
+ foreach ($ queue as $ priority => $ listeners ) {
136
+ $ priority = (int ) $ priority ;
137
+ foreach ($ listeners as $ listener ) {
138
+ if ($ withPriority ) {
139
+ yield $ priority => $ listener ;
140
+ } else {
141
+ yield $ listener ;
142
+ }
134
143
}
135
144
}
136
145
}
0 commit comments