1
1
import Base from "./base" ;
2
2
import { BasePattern } from "./basepattern" ;
3
- import events from "./events" ;
3
+ import events , { event_listener_map } from "./events" ;
4
4
import utils from "./utils" ;
5
5
6
6
describe ( "core.events tests" , ( ) => {
7
7
describe ( "1 - add / remove event listener" , ( ) => {
8
- const _el = {
9
- event_list : [ ] ,
10
- addEventListener ( event_type , cb ) {
11
- this . event_list . push ( [ event_type , cb ] ) ;
12
- } ,
13
- removeEventListener ( event_type , cb ) {
14
- const idx = this . event_list . indexOf ( [ event_type , cb ] ) ;
15
- this . event_list . splice ( idx , 1 ) ;
16
- } ,
17
- } ;
8
+ afterEach ( ( ) => {
9
+ // Clear event_listener_map after each test.
10
+ for ( const el in event_listener_map ) {
11
+ delete event_listener_map [ el ] ;
12
+ }
13
+ } ) ;
18
14
19
15
it ( "Registers events only once and unregisters events." , ( done ) => {
16
+ // Mock a DOM element.
17
+ const _el = {
18
+ event_list : [ ] ,
19
+ addEventListener ( event_type , cb ) {
20
+ this . event_list . push ( [ event_type , cb ] ) ;
21
+ } ,
22
+ removeEventListener ( event_type , cb ) {
23
+ const idx = this . event_list . indexOf ( [ event_type , cb ] ) ;
24
+ this . event_list . splice ( idx , 1 ) ;
25
+ } ,
26
+ } ;
27
+
20
28
const cb1 = ( ) => { } ;
21
29
const cb2 = ( ) => { } ;
22
30
@@ -50,8 +58,7 @@ describe("core.events tests", () => {
50
58
done ( ) ;
51
59
} ) ;
52
60
53
- it ( "Supports once-events and unregisters them from the event_listener_map" , async ( ) => {
54
- const event_listener_map = ( await import ( "./events" ) ) . event_listener_map ;
61
+ it ( "Supports once-events and unregisters them from the event_listener_map" , ( ) => {
55
62
const el = document . createElement ( "div" ) ;
56
63
57
64
// register the once-event handler
@@ -65,6 +72,127 @@ describe("core.events tests", () => {
65
72
expect ( event_listener_map [ el ] . test_once_event ) . not . toBeDefined ( ) ;
66
73
} ) ;
67
74
75
+ it ( "Removes a specific event listener." , ( ) => {
76
+ const el = document . createElement ( "div" ) ;
77
+
78
+ let cnt = 0 ;
79
+
80
+ // register the once-event handler
81
+ events . add_event_listener ( el , "test" , "test_event" , ( ) => cnt ++ ) ;
82
+ expect ( event_listener_map [ el ] . test_event ) . toBeDefined ( ) ;
83
+
84
+ el . dispatchEvent ( new Event ( "test" ) ) ;
85
+ expect ( cnt ) . toBe ( 1 ) ;
86
+
87
+ el . dispatchEvent ( new Event ( "test" ) ) ;
88
+ expect ( cnt ) . toBe ( 2 ) ;
89
+
90
+ events . remove_event_listener ( el , "test_event" ) ;
91
+
92
+ // Now the event listener should be removed.
93
+ expect ( event_listener_map [ el ] ?. test_once_event ) . not . toBeDefined ( ) ;
94
+ // Even the element itself should be removed, if there are no more event listeners on it.
95
+ expect ( event_listener_map [ el ] ) . not . toBeDefined ( ) ;
96
+
97
+ // counter should not increase anymore
98
+ el . dispatchEvent ( new Event ( "test" ) ) ;
99
+ expect ( cnt ) . toBe ( 2 ) ;
100
+ } ) ;
101
+
102
+ it ( "Remove single and all event listeners from an element, not touching others." , ( ) => {
103
+ const el1 = document . createElement ( "div" ) ;
104
+ const el2 = document . createElement ( "span" ) ;
105
+
106
+ let cnt1 = 0 ;
107
+ let cnt2 = 0 ;
108
+ let cnt3 = 0 ;
109
+
110
+ const shared_cb = ( ) => {
111
+ cnt1 ++ ;
112
+ } ;
113
+
114
+ // register the event handlers
115
+ events . add_event_listener ( el1 , "test1" , "test_event_1" , shared_cb ) ;
116
+ events . add_event_listener ( el1 , "test2" , "test_event_2" , shared_cb ) ;
117
+ events . add_event_listener ( el1 , "test3" , "test_event_3" , ( ) => cnt2 ++ ) ;
118
+ events . add_event_listener ( el2 , "test4" , "test_event_4" , ( ) => cnt3 ++ ) ;
119
+
120
+ expect ( event_listener_map [ el1 ] . test_event_1 ) . toBeDefined ( ) ;
121
+ expect ( event_listener_map [ el1 ] . test_event_2 ) . toBeDefined ( ) ;
122
+ expect ( event_listener_map [ el1 ] . test_event_3 ) . toBeDefined ( ) ;
123
+ expect ( event_listener_map [ el2 ] . test_event_4 ) . toBeDefined ( ) ;
124
+
125
+ expect ( Object . keys ( event_listener_map ) . length ) . toBe ( 2 ) ;
126
+
127
+ el1 . dispatchEvent ( new Event ( "test1" ) ) ;
128
+ expect ( cnt1 ) . toBe ( 1 ) ;
129
+ expect ( cnt2 ) . toBe ( 0 ) ;
130
+ expect ( cnt3 ) . toBe ( 0 ) ;
131
+
132
+ el1 . dispatchEvent ( new Event ( "test1" ) ) ;
133
+ expect ( cnt1 ) . toBe ( 2 ) ;
134
+ expect ( cnt2 ) . toBe ( 0 ) ;
135
+ expect ( cnt3 ) . toBe ( 0 ) ;
136
+
137
+ el1 . dispatchEvent ( new Event ( "test2" ) ) ;
138
+ expect ( cnt1 ) . toBe ( 3 ) ;
139
+ expect ( cnt2 ) . toBe ( 0 ) ;
140
+ expect ( cnt3 ) . toBe ( 0 ) ;
141
+
142
+ el1 . dispatchEvent ( new Event ( "test3" ) ) ;
143
+ expect ( cnt1 ) . toBe ( 3 ) ;
144
+ expect ( cnt2 ) . toBe ( 1 ) ;
145
+ expect ( cnt3 ) . toBe ( 0 ) ;
146
+
147
+ el2 . dispatchEvent ( new Event ( "test4" ) ) ;
148
+ expect ( cnt1 ) . toBe ( 3 ) ;
149
+ expect ( cnt2 ) . toBe ( 1 ) ;
150
+ expect ( cnt3 ) . toBe ( 1 ) ;
151
+
152
+ // Remove only test_event_1
153
+ events . remove_event_listener ( el1 , "test_event_1" ) ;
154
+ expect ( event_listener_map [ el1 ] . test_event_1 ) . not . toBeDefined ( ) ;
155
+ expect ( event_listener_map [ el1 ] . test_event_2 ) . toBeDefined ( ) ;
156
+ expect ( event_listener_map [ el1 ] . test_event_3 ) . toBeDefined ( ) ;
157
+ expect ( event_listener_map [ el2 ] . test_event_4 ) . toBeDefined ( ) ;
158
+ expect ( Object . keys ( event_listener_map ) . length ) . toBe ( 2 ) ;
159
+
160
+ // Counter should not increase anymore on event "test1"
161
+ el1 . dispatchEvent ( new Event ( "test1" ) ) ;
162
+ expect ( cnt1 ) . toBe ( 3 ) ;
163
+ expect ( cnt2 ) . toBe ( 1 ) ;
164
+ expect ( cnt3 ) . toBe ( 1 ) ;
165
+
166
+ // Rest should not be affected.
167
+ el1 . dispatchEvent ( new Event ( "test2" ) ) ;
168
+ el1 . dispatchEvent ( new Event ( "test3" ) ) ;
169
+ el2 . dispatchEvent ( new Event ( "test4" ) ) ;
170
+ expect ( cnt1 ) . toBe ( 4 ) ;
171
+ expect ( cnt2 ) . toBe ( 2 ) ;
172
+ expect ( cnt3 ) . toBe ( 2 ) ;
173
+
174
+ // Remove all event handler on el1
175
+ events . remove_event_listener ( el1 ) ;
176
+ expect ( event_listener_map [ el1 ] ) . not . toBeDefined ( ) ;
177
+ expect ( Object . keys ( event_listener_map ) . length ) . toBe ( 1 ) ;
178
+
179
+ // Counter should not increase anymore on el1
180
+ el1 . dispatchEvent ( new Event ( "test1" ) ) ;
181
+ el1 . dispatchEvent ( new Event ( "test2" ) ) ;
182
+ el1 . dispatchEvent ( new Event ( "test3" ) ) ;
183
+ expect ( cnt1 ) . toBe ( 4 ) ;
184
+ expect ( cnt2 ) . toBe ( 2 ) ;
185
+ expect ( cnt3 ) . toBe ( 2 ) ;
186
+
187
+ // But el2 should still work.
188
+ el2 . dispatchEvent ( new Event ( "test4" ) ) ;
189
+ expect ( cnt1 ) . toBe ( 4 ) ;
190
+ expect ( cnt2 ) . toBe ( 2 ) ;
191
+ expect ( cnt3 ) . toBe ( 3 ) ;
192
+ } ) ;
193
+ } ) ;
194
+
195
+ describe ( "2 - await pattern initialization" , ( ) => {
68
196
it ( "Awaits an event to happen." , async ( ) => {
69
197
const el = document . createElement ( "div" ) ;
70
198
@@ -164,7 +292,7 @@ describe("core.events tests", () => {
164
292
} ) ;
165
293
} ) ;
166
294
167
- describe ( "2 - event factories" , ( ) => {
295
+ describe ( "3 - event factories" , ( ) => {
168
296
let catched ;
169
297
let outer ;
170
298
let inner ;
@@ -287,7 +415,7 @@ describe("core.events tests", () => {
287
415
} ) ;
288
416
} ) ;
289
417
290
- describe ( "3 - jQuery vs native" , ( ) => {
418
+ describe ( "4 - jQuery vs native" , ( ) => {
291
419
// These tests show an annoying difference between jQuery and native
292
420
// JavaScript events. jQuery catches native JavaScript events, which is
293
421
// good. But events triggered by jQuery are not compatibel with native
@@ -324,7 +452,7 @@ describe("core.events tests", () => {
324
452
} ) ;
325
453
} ) ;
326
454
327
- describe ( "4 - Special DOM behavior" , ( ) => {
455
+ describe ( "5 - Special DOM behavior" , ( ) => {
328
456
afterEach ( ( ) => {
329
457
document . body . innerHTML = "" ;
330
458
} ) ;
0 commit comments