3
3
// Note: emits and listener fallthrough is tested in
4
4
// ./rendererAttrsFallthrough.spec.ts.
5
5
6
- import { nextTick , onBeforeUnmount } from '../src'
6
+ import { toHandlers } from '@vue/runtime-core'
7
+ import {
8
+ createComponent ,
9
+ defineComponent ,
10
+ nextTick ,
11
+ onBeforeUnmount ,
12
+ } from '../src'
7
13
import { isEmitListener } from '../src/componentEmits'
8
14
import { makeRender } from './_utils'
9
15
10
- const define = makeRender < any > ( )
16
+ const define = makeRender ( )
11
17
12
- describe . todo ( 'component: emit' , ( ) => {
18
+ describe ( 'component: emit' , ( ) => {
13
19
test ( 'trigger handlers' , ( ) => {
14
20
const { render } = define ( {
15
- render ( ) { } ,
16
- setup ( _ : any , { emit } : any ) {
21
+ setup ( _ , { emit } ) {
17
22
emit ( 'foo' )
18
23
emit ( 'bar' )
19
24
emit ( '!baz' )
20
25
} ,
21
26
} )
22
- const onfoo = vi . fn ( )
27
+ const onFoo = vi . fn ( )
23
28
const onBar = vi . fn ( )
24
29
const onBaz = vi . fn ( )
25
30
render ( {
26
- get onfoo ( ) {
27
- return onfoo
28
- } ,
29
- get onBar ( ) {
30
- return onBar
31
- } ,
32
- get [ 'on!baz' ] ( ) {
33
- return onBaz
34
- } ,
31
+ onfoo : ( ) => onFoo ,
32
+ onBar : ( ) => onBar ,
33
+ [ 'on!baz' ] : ( ) => onBaz ,
35
34
} )
36
35
37
- expect ( onfoo ) . not . toHaveBeenCalled ( )
36
+ expect ( onFoo ) . not . toHaveBeenCalled ( )
38
37
expect ( onBar ) . toHaveBeenCalled ( )
39
38
expect ( onBaz ) . toHaveBeenCalled ( )
40
39
} )
41
40
42
41
test ( 'trigger camelCase handler' , ( ) => {
43
42
const { render } = define ( {
44
- render ( ) { } ,
45
- setup ( _ : any , { emit } : any ) {
43
+ setup ( _ , { emit } ) {
46
44
emit ( 'test-event' )
47
45
} ,
48
46
} )
49
47
50
48
const fooSpy = vi . fn ( )
51
- render ( {
52
- get onTestEvent ( ) {
53
- return fooSpy
54
- } ,
55
- } )
49
+ render ( { onTestEvent : ( ) => fooSpy } )
56
50
expect ( fooSpy ) . toHaveBeenCalled ( )
57
51
} )
58
52
59
53
test ( 'trigger kebab-case handler' , ( ) => {
60
54
const { render } = define ( {
61
- render ( ) { } ,
62
- setup ( _ : any , { emit } : any ) {
55
+ setup ( _ , { emit } ) {
63
56
emit ( 'test-event' )
64
57
} ,
65
58
} )
66
59
67
60
const fooSpy = vi . fn ( )
68
- render ( {
69
- get [ 'onTest-event' ] ( ) {
70
- return fooSpy
71
- } ,
72
- } )
61
+ render ( { [ 'onTest-event' ] : ( ) => fooSpy } )
73
62
expect ( fooSpy ) . toHaveBeenCalledTimes ( 1 )
74
63
} )
75
64
76
65
// #3527
77
- test . todo ( 'trigger mixed case handlers' , ( ) => {
66
+ test ( 'trigger mixed case handlers' , ( ) => {
78
67
const { render } = define ( {
79
- render ( ) { } ,
80
- setup ( _ : any , { emit } : any ) {
68
+ setup ( _ , { emit } ) {
81
69
emit ( 'test-event' )
82
70
emit ( 'testEvent' )
83
71
} ,
@@ -86,15 +74,10 @@ describe.todo('component: emit', () => {
86
74
const fooSpy = vi . fn ( )
87
75
const barSpy = vi . fn ( )
88
76
render (
89
- // TODO: impl `toHandlers`
90
- {
91
- get [ 'onTest-Event' ] ( ) {
92
- return fooSpy
93
- } ,
94
- get onTestEvent ( ) {
95
- return barSpy
96
- } ,
97
- } ,
77
+ toHandlers ( {
78
+ 'test-event' : ( ) => fooSpy ,
79
+ testEvent : ( ) => barSpy ,
80
+ } ) ,
98
81
)
99
82
expect ( fooSpy ) . toHaveBeenCalledTimes ( 1 )
100
83
expect ( barSpy ) . toHaveBeenCalledTimes ( 1 )
@@ -103,8 +86,7 @@ describe.todo('component: emit', () => {
103
86
// for v-model:foo-bar usage in DOM templates
104
87
test ( 'trigger hyphenated events for update:xxx events' , ( ) => {
105
88
const { render } = define ( {
106
- render ( ) { } ,
107
- setup ( _ : any , { emit } : any ) {
89
+ setup ( _ , { emit } ) {
108
90
emit ( 'update:fooProp' )
109
91
emit ( 'update:barProp' )
110
92
} ,
@@ -113,12 +95,8 @@ describe.todo('component: emit', () => {
113
95
const fooSpy = vi . fn ( )
114
96
const barSpy = vi . fn ( )
115
97
render ( {
116
- get [ 'onUpdate:fooProp' ] ( ) {
117
- return fooSpy
118
- } ,
119
- get [ 'onUpdate:bar-prop' ] ( ) {
120
- return barSpy
121
- } ,
98
+ [ 'onUpdate:fooProp' ] : ( ) => fooSpy ,
99
+ [ 'onUpdate:bar-prop' ] : ( ) => barSpy ,
122
100
} )
123
101
124
102
expect ( fooSpy ) . toHaveBeenCalled ( )
@@ -127,38 +105,57 @@ describe.todo('component: emit', () => {
127
105
128
106
test ( 'should trigger array of listeners' , async ( ) => {
129
107
const { render } = define ( {
130
- render ( ) { } ,
131
- setup ( _ : any , { emit } : any ) {
108
+ setup ( _ , { emit } ) {
132
109
emit ( 'foo' , 1 )
133
110
} ,
134
111
} )
135
112
136
113
const fn1 = vi . fn ( )
137
114
const fn2 = vi . fn ( )
138
115
139
- render ( {
140
- onFoo : ( ) => [ fn1 , fn2 ] ,
141
- } )
116
+ render ( { onFoo : ( ) => [ fn1 , fn2 ] } )
142
117
expect ( fn1 ) . toHaveBeenCalledTimes ( 1 )
143
118
expect ( fn1 ) . toHaveBeenCalledWith ( 1 )
144
119
expect ( fn2 ) . toHaveBeenCalledTimes ( 1 )
145
120
expect ( fn2 ) . toHaveBeenCalledWith ( 1 )
146
121
} )
147
122
148
- test . todo ( 'warning for undeclared event (array)' , ( ) => {
149
- // TODO: warning
123
+ test ( 'warning for undeclared event (array)' , ( ) => {
124
+ const { render } = define ( {
125
+ emits : [ 'foo' ] ,
126
+
127
+ setup ( _ , { emit } ) {
128
+ emit ( 'bar' )
129
+ } ,
130
+ } )
131
+ render ( )
132
+ expect (
133
+ `Component emitted event "bar" but it is neither declared` ,
134
+ ) . toHaveBeenWarned ( )
150
135
} )
151
136
152
- test . todo ( 'warning for undeclared event (object)' , ( ) => {
153
- // TODO: warning
137
+ test ( 'warning for undeclared event (object)' , ( ) => {
138
+ const { render } = define ( {
139
+ emits : {
140
+ foo : null ,
141
+ } ,
142
+
143
+ setup ( _ , { emit } ) {
144
+ emit ( 'bar' )
145
+ } ,
146
+ } )
147
+ render ( )
148
+ expect (
149
+ `Component emitted event "bar" but it is neither declared` ,
150
+ ) . toHaveBeenWarned ( )
154
151
} )
155
152
156
153
test ( 'should not warn if has equivalent onXXX prop' , ( ) => {
157
154
define ( {
158
155
props : [ 'onFoo' ] ,
159
156
emits : [ ] ,
160
- render ( ) { } ,
161
- setup ( _ : any , { emit } : any ) {
157
+
158
+ setup ( _ , { emit } ) {
162
159
emit ( 'foo' )
163
160
} ,
164
161
} ) . render ( )
@@ -182,12 +179,11 @@ describe.todo('component: emit', () => {
182
179
183
180
test ( '.once' , ( ) => {
184
181
const { render } = define ( {
185
- render ( ) { } ,
186
182
emits : {
187
183
foo : null ,
188
184
bar : null ,
189
185
} ,
190
- setup ( _ : any , { emit } : any ) {
186
+ setup ( _ , { emit } ) {
191
187
emit ( 'foo' )
192
188
emit ( 'foo' )
193
189
emit ( 'bar' )
@@ -197,71 +193,49 @@ describe.todo('component: emit', () => {
197
193
const fn = vi . fn ( )
198
194
const barFn = vi . fn ( )
199
195
render ( {
200
- get onFooOnce ( ) {
201
- return fn
202
- } ,
203
- get onBarOnce ( ) {
204
- return barFn
205
- } ,
196
+ onFooOnce : ( ) => fn ,
197
+ onBarOnce : ( ) => barFn ,
206
198
} )
207
199
expect ( fn ) . toHaveBeenCalledTimes ( 1 )
208
200
expect ( barFn ) . toHaveBeenCalledTimes ( 1 )
209
201
} )
210
202
211
203
test ( '.once with normal listener of the same name' , ( ) => {
212
204
const { render } = define ( {
213
- render ( ) { } ,
214
205
emits : {
215
206
foo : null ,
216
207
} ,
217
- setup ( _ : any , { emit } : any ) {
208
+ setup ( _ , { emit } ) {
218
209
emit ( 'foo' )
219
210
emit ( 'foo' )
220
211
} ,
221
212
} )
222
213
const onFoo = vi . fn ( )
223
214
const onFooOnce = vi . fn ( )
224
215
render ( {
225
- get onFoo ( ) {
226
- return onFoo
227
- } ,
228
- get onFooOnce ( ) {
229
- return onFooOnce
230
- } ,
216
+ onFoo : ( ) => onFoo ,
217
+ onFooOnce : ( ) => onFooOnce ,
231
218
} )
232
219
expect ( onFoo ) . toHaveBeenCalledTimes ( 2 )
233
220
expect ( onFooOnce ) . toHaveBeenCalledTimes ( 1 )
234
221
} )
235
222
236
223
test ( '.number modifier should work with v-model on component' , ( ) => {
237
224
const { render } = define ( {
238
- render ( ) { } ,
239
- setup ( _ : any , { emit } : any ) {
225
+ setup ( _ , { emit } ) {
240
226
emit ( 'update:modelValue' , '1' )
241
227
emit ( 'update:foo' , '2' )
242
228
} ,
243
229
} )
244
230
const fn1 = vi . fn ( )
245
231
const fn2 = vi . fn ( )
246
232
render ( {
247
- modelValue ( ) {
248
- return null
249
- } ,
250
- modelModifiers ( ) {
251
- return { number : true }
252
- } ,
253
- [ 'onUpdate:modelValue' ] ( ) {
254
- return fn1
255
- } ,
256
- foo ( ) {
257
- return null
258
- } ,
259
- fooModifiers ( ) {
260
- return { number : true }
261
- } ,
262
- [ 'onUpdate:foo' ] ( ) {
263
- return fn2
264
- } ,
233
+ modelValue : ( ) => null ,
234
+ modelModifiers : ( ) => ( { number : true } ) ,
235
+ [ 'onUpdate:modelValue' ] : ( ) => fn1 ,
236
+ foo : ( ) => null ,
237
+ fooModifiers : ( ) => ( { number : true } ) ,
238
+ [ 'onUpdate:foo' ] : ( ) => fn2 ,
265
239
} )
266
240
expect ( fn1 ) . toHaveBeenCalledTimes ( 1 )
267
241
expect ( fn1 ) . toHaveBeenCalledWith ( 1 )
@@ -271,8 +245,7 @@ describe.todo('component: emit', () => {
271
245
272
246
test ( '.trim modifier should work with v-model on component' , ( ) => {
273
247
const { render } = define ( {
274
- render ( ) { } ,
275
- setup ( _ : any , { emit } : any ) {
248
+ setup ( _ , { emit } ) {
276
249
emit ( 'update:modelValue' , ' one ' )
277
250
emit ( 'update:foo' , ' two ' )
278
251
} ,
@@ -307,8 +280,7 @@ describe.todo('component: emit', () => {
307
280
308
281
test ( '.trim and .number modifiers should work with v-model on component' , ( ) => {
309
282
const { render } = define ( {
310
- render ( ) { } ,
311
- setup ( _ : any , { emit } : any ) {
283
+ setup ( _ , { emit } ) {
312
284
emit ( 'update:modelValue' , ' +01.2 ' )
313
285
emit ( 'update:foo' , ' 1 ' )
314
286
} ,
@@ -343,8 +315,7 @@ describe.todo('component: emit', () => {
343
315
344
316
test ( 'only trim string parameter when work with v-model on component' , ( ) => {
345
317
const { render } = define ( {
346
- render ( ) { } ,
347
- setup ( _ : any , { emit } : any ) {
318
+ setup ( _ , { emit } ) {
348
319
emit ( 'update:modelValue' , ' foo ' , { bar : ' bar ' } )
349
320
} ,
350
321
} )
@@ -393,22 +364,23 @@ describe.todo('component: emit', () => {
393
364
expect ( isEmitListener ( options , 'onFooBaz' ) ) . toBe ( true )
394
365
} )
395
366
396
- test ( 'does not emit after unmount' , async ( ) => {
367
+ test . only ( 'does not emit after unmount' , async ( ) => {
397
368
const fn = vi . fn ( )
398
- const { app } = define ( {
369
+
370
+ const Foo = defineComponent ( {
399
371
emits : [ 'closing' ] ,
400
- setup ( _ : any , { emit } : any ) {
372
+ setup ( _ , { emit } ) {
401
373
onBeforeUnmount ( async ( ) => {
402
374
await nextTick ( )
403
375
emit ( 'closing' , true )
404
376
} )
405
377
} ,
406
- render ( ) { } ,
407
- } ) . render ( {
408
- get onClosing ( ) {
409
- return fn
410
- } ,
411
378
} )
379
+
380
+ const { app } = define ( ( ) =>
381
+ createComponent ( Foo , { onClosing : ( ) => fn } ) ,
382
+ ) . render ( )
383
+
412
384
await nextTick ( )
413
385
app . unmount ( )
414
386
await nextTick ( )
0 commit comments