@@ -92,6 +92,71 @@ describe('Directive', () => {
9292 expect ( wrapper . element . unmaskedValue ) . toBe ( '1122' )
9393 } )
9494
95+ describe ( 'Composition events' , ( ) => {
96+ test ( 'Should not update value when composing the input' , ( ) => {
97+ buildWrapper ( { value : 1234 } )
98+ expect ( wrapper . element . value ) . toBe ( '12.34' )
99+
100+ wrapper . element . value = '1122'
101+ wrapper . find ( 'input' ) . trigger ( 'compositionstart' )
102+ wrapper . find ( 'input' ) . trigger ( 'input' , { inputType : 'insertCompositionText' } )
103+
104+ expect ( wrapper . element . value ) . toBe ( '1122' )
105+ expect ( wrapper . element . unmaskedValue ) . toBe ( '1234' )
106+ } )
107+
108+ test ( 'Should not update value when updating the composed input' , ( ) => {
109+ buildWrapper ( { value : 1234 } )
110+ expect ( wrapper . element . value ) . toBe ( '12.34' )
111+
112+ wrapper . element . value = '1122'
113+ wrapper . find ( 'input' ) . trigger ( 'compositionupdate' )
114+ wrapper . find ( 'input' ) . trigger ( 'input' , { inputType : 'insertCompositionText' } )
115+
116+ expect ( wrapper . element . value ) . toBe ( '1122' )
117+ expect ( wrapper . element . unmaskedValue ) . toBe ( '1234' )
118+ } )
119+
120+ test ( 'Should update value when composition ends' , ( ) => {
121+ buildWrapper ( { value : 1234 } )
122+ expect ( wrapper . element . value ) . toBe ( '12.34' )
123+
124+ wrapper . element . value = '1122'
125+ wrapper . find ( 'input' ) . trigger ( 'compositionstart' )
126+ wrapper . find ( 'input' ) . trigger ( 'input' , { inputType : 'insertCompositionText' } )
127+
128+ expect ( wrapper . element . value ) . toBe ( '1122' )
129+ expect ( wrapper . element . unmaskedValue ) . toBe ( '1234' )
130+
131+ wrapper . find ( 'input' ) . trigger ( 'compositionend' )
132+
133+ expect ( wrapper . element . value ) . toBe ( '11.22' )
134+ expect ( wrapper . element . unmaskedValue ) . toBe ( '1122' )
135+ } )
136+
137+ test ( 'Should prevent all value updates while composing text' , ( ) => {
138+ buildWrapper ( { value : 1234 } )
139+ expect ( wrapper . element . value ) . toBe ( '12.34' )
140+
141+ wrapper . element . value = '1122'
142+ wrapper . find ( 'input' ) . trigger ( 'compositionstart' )
143+ wrapper . find ( 'input' ) . trigger ( 'input' , { inputType : 'insertCompositionText' } )
144+ wrapper . setValue ( '4321' )
145+
146+ expect ( wrapper . element . value ) . toBe ( '4321' )
147+ expect ( wrapper . element . unmaskedValue ) . toBe ( '1234' )
148+ } )
149+
150+ test ( 'Should prevent composition input events from propagating' , ( ) => {
151+ buildWrapper ( )
152+
153+ wrapper . find ( 'input' ) . trigger ( 'input' , { inputType : 'insertCompositionText' } )
154+ wrapper . find ( 'input' ) . trigger ( 'input' , { inputType : 'insertFromComposition' } )
155+
156+ expect ( inputListener ) . toHaveBeenCalledTimes ( 0 )
157+ } )
158+ } )
159+
95160 test ( 'Should honor short modifier' , async ( ) => {
96161 buildWrapper ( {
97162 template : `<input v-facade.short="mask" value="12" @input="inputListener" />`
@@ -241,5 +306,27 @@ describe('Directive', () => {
241306
242307 expect ( inputListener ) . toBeCalledTimes ( 1 )
243308 } )
309+
310+ test ( 'should not prevent updates when other inputs are composing text' , async ( ) => {
311+ otherInput . setValue ( '1122' )
312+
313+ otherInput . trigger ( 'compositionstart' )
314+
315+ facadeInput . element . value = '1234'
316+ facadeInput . trigger ( 'input' )
317+
318+ expect ( otherInput . element . value ) . toBe ( '1122' )
319+ expect ( facadeInput . element . value ) . toBe ( '12.34' )
320+ expect ( inputListener ) . toBeCalledTimes ( 1 )
321+ } )
322+
323+ test ( 'should handle composition events on the main element' , async ( ) => {
324+ facadeInput . setValue ( '1122' )
325+ facadeInput . element . value = '1234'
326+ facadeInput . trigger ( 'compositionstart' )
327+ facadeInput . trigger ( 'input' , { inputType : 'insertCompositionText' } )
328+
329+ expect ( facadeInput . element . unmaskedValue ) . toBe ( '1122' )
330+ } )
244331 } )
245332} )
0 commit comments