@@ -5,41 +5,125 @@ describe('vdom events module', () => {
55 it ( 'should attach event handler to element' , ( ) => {
66 const click = jasmine . createSpy ( )
77 const vnode = new VNode ( 'a' , { on : { click } } )
8+
89 const elm = patch ( null , vnode )
910 document . body . appendChild ( elm )
1011 triggerEvent ( elm , 'click' )
1112 expect ( click . calls . count ( ) ) . toBe ( 1 )
1213 } )
1314
14- it ( 'should not attach new listener' , ( ) => {
15+ it ( 'should not duplicate the same listener' , ( ) => {
1516 const click = jasmine . createSpy ( )
1617 const vnode1 = new VNode ( 'a' , { on : { click } } )
1718 const vnode2 = new VNode ( 'a' , { on : { click } } )
18- patch ( null , vnode1 )
19- const elm = patch ( vnode1 , vnode2 )
19+
20+ const elm = patch ( null , vnode1 )
21+ patch ( vnode1 , vnode2 )
2022 document . body . appendChild ( elm )
2123 triggerEvent ( elm , 'click' )
2224 expect ( click . calls . count ( ) ) . toBe ( 1 )
2325 } )
2426
25- it ( 'should attach event handlers' , ( ) => {
27+ it ( 'should update different listener' , ( ) => {
28+ const click = jasmine . createSpy ( )
29+ const click2 = jasmine . createSpy ( )
30+ const vnode1 = new VNode ( 'a' , { on : { click } } )
31+ const vnode2 = new VNode ( 'a' , { on : { click : click2 } } )
32+
33+ const elm = patch ( null , vnode1 )
34+ document . body . appendChild ( elm )
35+ triggerEvent ( elm , 'click' )
36+ expect ( click . calls . count ( ) ) . toBe ( 1 )
37+ expect ( click2 . calls . count ( ) ) . toBe ( 0 )
38+
39+ patch ( vnode1 , vnode2 )
40+ triggerEvent ( elm , 'click' )
41+ expect ( click . calls . count ( ) ) . toBe ( 1 )
42+ expect ( click2 . calls . count ( ) ) . toBe ( 1 )
43+ } )
44+
45+ it ( 'should attach Array of multiple handlers' , ( ) => {
2646 const click = jasmine . createSpy ( )
2747 const vnode = new VNode ( 'a' , { on : { click : [ click , click ] } } )
48+
2849 const elm = patch ( null , vnode )
2950 document . body . appendChild ( elm )
3051 triggerEvent ( elm , 'click' )
3152 expect ( click . calls . count ( ) ) . toBe ( 2 )
3253 } )
3354
34- it ( 'should change attach event handlers' , ( ) => {
55+ it ( 'should update Array of multiple handlers' , ( ) => {
3556 const click = jasmine . createSpy ( )
36- const focus = jasmine . createSpy ( )
37- const vnode1 = new VNode ( 'a' , { on : { click : [ click , focus ] } } )
57+ const click2 = jasmine . createSpy ( )
58+ const vnode1 = new VNode ( 'a' , { on : { click : [ click , click2 ] } } )
3859 const vnode2 = new VNode ( 'a' , { on : { click : [ click ] } } )
39- patch ( null , vnode1 )
40- const elm = patch ( vnode1 , vnode2 )
60+
61+ const elm = patch ( null , vnode1 )
62+ document . body . appendChild ( elm )
63+ triggerEvent ( elm , 'click' )
64+ expect ( click . calls . count ( ) ) . toBe ( 1 )
65+ expect ( click2 . calls . count ( ) ) . toBe ( 1 )
66+
67+ patch ( vnode1 , vnode2 )
68+ triggerEvent ( elm , 'click' )
69+ expect ( click . calls . count ( ) ) . toBe ( 2 )
70+ expect ( click2 . calls . count ( ) ) . toBe ( 1 )
71+ } )
72+
73+ it ( 'should remove handlers that are no longer present' , ( ) => {
74+ const click = jasmine . createSpy ( )
75+ const vnode1 = new VNode ( 'a' , { on : { click } } )
76+ const vnode2 = new VNode ( 'a' , { } )
77+
78+ const elm = patch ( null , vnode1 )
4179 document . body . appendChild ( elm )
4280 triggerEvent ( elm , 'click' )
4381 expect ( click . calls . count ( ) ) . toBe ( 1 )
82+
83+ patch ( vnode1 , vnode2 )
84+ triggerEvent ( elm , 'click' )
85+ expect ( click . calls . count ( ) ) . toBe ( 1 )
86+ } )
87+
88+ it ( 'should remove Array handlers that are no longer present' , ( ) => {
89+ const click = jasmine . createSpy ( )
90+ const vnode1 = new VNode ( 'a' , { on : { click : [ click , click ] } } )
91+ const vnode2 = new VNode ( 'a' , { } )
92+
93+ const elm = patch ( null , vnode1 )
94+ document . body . appendChild ( elm )
95+ triggerEvent ( elm , 'click' )
96+ expect ( click . calls . count ( ) ) . toBe ( 2 )
97+
98+ patch ( vnode1 , vnode2 )
99+ triggerEvent ( elm , 'click' )
100+ expect ( click . calls . count ( ) ) . toBe ( 2 )
101+ } )
102+
103+ // #4650
104+ it ( 'should handle single -> array or array -> single handler changes' , ( ) => {
105+ const click = jasmine . createSpy ( )
106+ const click2 = jasmine . createSpy ( )
107+ const click3 = jasmine . createSpy ( )
108+ const vnode1 = new VNode ( 'a' , { on : { click : [ click , click2 ] } } )
109+ const vnode2 = new VNode ( 'a' , { on : { click : click } } )
110+ const vnode3 = new VNode ( 'a' , { on : { click : [ click2 , click3 ] } } )
111+
112+ const elm = patch ( null , vnode1 )
113+ document . body . appendChild ( elm )
114+ triggerEvent ( elm , 'click' )
115+ expect ( click . calls . count ( ) ) . toBe ( 1 )
116+ expect ( click2 . calls . count ( ) ) . toBe ( 1 )
117+
118+ patch ( vnode1 , vnode2 )
119+ triggerEvent ( elm , 'click' )
120+ expect ( click . calls . count ( ) ) . toBe ( 2 )
121+ expect ( click2 . calls . count ( ) ) . toBe ( 1 )
122+
123+ patch ( vnode2 , vnode3 )
124+ triggerEvent ( elm , 'click' )
125+ expect ( click . calls . count ( ) ) . toBe ( 2 )
126+ expect ( click2 . calls . count ( ) ) . toBe ( 2 )
127+ expect ( click3 . calls . count ( ) ) . toBe ( 1 )
44128 } )
45129} )
0 commit comments