@@ -176,16 +176,16 @@ describe(debounce, () => {
176176
177177 it ( "leading コールバック内から再帰呼び出ししても leading が二重発火しないこと" , ( ) => {
178178 const calls : string [ ] = [ ] ;
179- const debounced = debounce (
180- ( x : string ) => {
181- calls . push ( x ) ;
182- if ( x === "a" ) {
183- debounced ( "re-entry" ) ;
184- }
185- } ,
186- 100 ,
187- { edges : [ "leading" ] } ,
188- ) ;
179+ const callback = vi . fn < ( x : string ) => void > ( ( x ) => {
180+ calls . push ( x ) ;
181+ } ) ;
182+ const debounced = debounce ( callback , 100 , { edges : [ "leading" ] } ) ;
183+
184+ // 1 回目の invoke だけ再帰呼び出しする
185+ callback . mockImplementationOnce ( ( x ) => {
186+ calls . push ( x ) ;
187+ debounced ( "re-entry" ) ;
188+ } ) ;
189189
190190 debounced ( "a" ) ;
191191 // 再帰呼び出しは isLeadingInvoked ガードにより leading 発火せず
@@ -428,12 +428,15 @@ describe(debounce, () => {
428428 describe ( "再帰呼び出し" , ( ) => {
429429 it ( "trailing コールバック内から再帰呼び出しした引数が失われないこと" , ( ) => {
430430 const calls : string [ ] = [ ] ;
431- const debounced = debounce ( ( x : string ) => {
431+ const callback = vi . fn < ( x : string ) => void > ( ( x ) => {
432432 calls . push ( x ) ;
433- if ( x === "a" ) {
434- debounced ( "re-entry" ) ;
435- }
436- } , 100 ) ;
433+ } ) ;
434+ const debounced = debounce ( callback , 100 ) ;
435+
436+ callback . mockImplementationOnce ( ( x ) => {
437+ calls . push ( x ) ;
438+ debounced ( "re-entry" ) ;
439+ } ) ;
437440
438441 debounced ( "a" ) ;
439442 vi . advanceTimersByTime ( 100 ) ;
@@ -446,16 +449,17 @@ describe(debounce, () => {
446449
447450 it ( "leading+trailing コールバック内から再帰呼び出しした引数が trailing で実行されること" , ( ) => {
448451 const calls : string [ ] = [ ] ;
449- const debounced = debounce (
450- ( x : string ) => {
451- calls . push ( x ) ;
452- if ( x === "a" ) {
453- debounced ( "re-entry" ) ;
454- }
455- } ,
456- 100 ,
457- { edges : [ "leading" , "trailing" ] } ,
458- ) ;
452+ const callback = vi . fn < ( x : string ) => void > ( ( x ) => {
453+ calls . push ( x ) ;
454+ } ) ;
455+ const debounced = debounce ( callback , 100 , {
456+ edges : [ "leading" , "trailing" ] ,
457+ } ) ;
458+
459+ callback . mockImplementationOnce ( ( x ) => {
460+ calls . push ( x ) ;
461+ debounced ( "re-entry" ) ;
462+ } ) ;
459463
460464 debounced ( "a" ) ;
461465 expect ( calls ) . toStrictEqual ( [ "a" ] ) ;
@@ -1136,20 +1140,25 @@ describe(debounce, () => {
11361140
11371141 it ( "再帰呼び出し時に保存した this が失われないこと" , ( ) => {
11381142 const spy = vi . fn ( ) ;
1143+ const callback = vi . fn < ( this : { value : number } , step : number ) => void > (
1144+ function defaultImpl ( this : { value : number } , step ) {
1145+ spy ( this . value , step ) ;
1146+ } ,
1147+ ) ;
11391148 const obj = {
11401149 value : 1 ,
1141- update : debounce ( function update (
1142- this : { value : number } ,
1143- step : number ,
1144- ) {
1145- spy ( this . value , step ) ;
1146- if ( step === 1 ) {
1147- // trailing 実行中に再帰呼び出し
1148- obj . update ( 2 ) ;
1149- }
1150- } , 100 ) ,
1150+ update : debounce ( callback , 100 ) ,
11511151 } ;
11521152
1153+ // 1 回目の trailing 実行中だけ再帰呼び出しする
1154+ callback . mockImplementationOnce ( function recursingImpl (
1155+ this : { value : number } ,
1156+ step ,
1157+ ) {
1158+ spy ( this . value , step ) ;
1159+ obj . update ( 2 ) ;
1160+ } ) ;
1161+
11531162 obj . update ( 1 ) ;
11541163 vi . advanceTimersByTime ( 100 ) ;
11551164 expect ( spy ) . toHaveBeenNthCalledWith ( 1 , 1 , 1 ) ;
0 commit comments