@@ -204,4 +204,78 @@ describe('decorator', () => {
204204 expect ( spy . mock . calls [ 5 ] [ 0 ] . values ) . toEqual ( { items : [ 3 , 4 , 5 ] , total : 7 } )
205205 expect ( spy . mock . calls [ 6 ] [ 0 ] . values ) . toEqual ( { items : [ 3 , 4 , 5 ] , total : 12 } )
206206 } )
207+
208+ it ( 'should allow seperate array summing' , ( ) => {
209+ const form = createForm ( { onSubmit : onSubmitMock } )
210+ const spy = jest . fn ( )
211+ const total = jest . fn ( )
212+ const sum = jest . fn ( ( itemValue , allValues ) =>
213+ ( allValues . list [ 0 ] . items || [ ] ) . reduce ( ( sum , item ) => sum + item , 0 )
214+ )
215+ form . subscribe ( spy , { values : true } )
216+ form . registerField ( 'list[0].items[0]' , ( ) => { } , { } )
217+ form . registerField ( 'list[0].items[1]' , ( ) => { } , { } )
218+ form . registerField ( 'list[0].items[2]' , ( ) => { } , { } )
219+ form . registerField ( 'list[0].total' , total , { value : true } )
220+ const decorator = createDecorator ( {
221+ field : / \. i t e m s \[ \d + \] / ,
222+ updates : ( value , name , all ) => {
223+ const totalField = name . replace ( / i t e m s \[ [ 0 - 9 ] + \] / , 'total' )
224+ return {
225+ [ totalField ] : sum ( value , all )
226+ }
227+ }
228+ } )
229+ decorator ( form )
230+
231+ expect ( spy ) . toHaveBeenCalled ( )
232+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
233+ expect ( spy . mock . calls [ 0 ] [ 0 ] . values ) . toEqual ( { } )
234+
235+ expect ( total ) . toHaveBeenCalled ( )
236+ expect ( total ) . toHaveBeenCalledTimes ( 1 )
237+ expect ( total . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
238+
239+ expect ( sum ) . not . toHaveBeenCalled ( )
240+
241+ // change first item value
242+ form . change ( 'list[0].items[0]' , 3 )
243+
244+ expect ( sum ) . toHaveBeenCalled ( )
245+ expect ( sum ) . toHaveBeenCalledTimes ( 1 )
246+
247+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
248+ expect ( spy . mock . calls [ 1 ] [ 0 ] . values ) . toEqual ( { list : [ { items : [ 3 ] } ] } )
249+ expect ( spy . mock . calls [ 2 ] [ 0 ] . values ) . toEqual ( {
250+ list : [ { items : [ 3 ] , total : 3 } ]
251+ } )
252+
253+ // change second item value
254+ form . change ( 'list[0].items[1]' , 4 )
255+
256+ expect ( sum ) . toHaveBeenCalled ( )
257+ expect ( sum ) . toHaveBeenCalledTimes ( 2 )
258+
259+ expect ( spy ) . toHaveBeenCalledTimes ( 5 )
260+ expect ( spy . mock . calls [ 3 ] [ 0 ] . values ) . toEqual ( {
261+ list : [ { items : [ 3 , 4 ] , total : 3 } ]
262+ } )
263+ expect ( spy . mock . calls [ 4 ] [ 0 ] . values ) . toEqual ( {
264+ list : [ { items : [ 3 , 4 ] , total : 7 } ]
265+ } )
266+
267+ // change third item value
268+ form . change ( 'list[0].items[2]' , 5 )
269+
270+ expect ( sum ) . toHaveBeenCalled ( )
271+ expect ( sum ) . toHaveBeenCalledTimes ( 3 )
272+
273+ expect ( spy ) . toHaveBeenCalledTimes ( 7 )
274+ expect ( spy . mock . calls [ 5 ] [ 0 ] . values ) . toEqual ( {
275+ list : [ { items : [ 3 , 4 , 5 ] , total : 7 } ]
276+ } )
277+ expect ( spy . mock . calls [ 6 ] [ 0 ] . values ) . toEqual ( {
278+ list : [ { items : [ 3 , 4 , 5 ] , total : 12 } ]
279+ } )
280+ } )
207281} )
0 commit comments