package Ġorg . apollo . game . plugin . testing . junit . api Ċ Ċ import Ġorg . apollo . game . action . Action Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . is Super class Of Ċ Ċ class ĠAction Capture ( val Ġtype : ĠK Class < out ĠAction <* >>) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġaction : ĠAction < *> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġcallbacks Ġ= Ġmutable ListOf < Action Capture Callback >() ĊĠĠĠ Ġprivate Ġvar Ġlast Ticks : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġcapture ( captured : ĠAction <* >) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertTrue ( type . is Super class Of ( captured :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ captured :: class . simple Name } Ġis Ġnot Ġan Ġinstance Ġof Ġ${ type . simple Name }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . action Ġ= Ġcaptured ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcallback ( delay : ĠAction Capture Delay ): ĠAction Capture Callback Registration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregistration Ġ= ĠAction Capture Callback Registration () ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠAction Capture Callback ( delay , Ġregistration ) ĊĊĠĠĠĠĠĠĠ Ġcallbacks . add ( callback ) ĊĠĠĠĠĠĠĠ Ġreturn Ġregistration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun Action ( timeout : ĠInt Ġ= Ġ 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpul ses Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pulse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpul ses ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtick Callbacks Ġ= Ġcallbacks . filter Ġ{ Ġit . delay Ġ== ĠAction Capture Delay . Ticks ( pul ses ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtick Callbacks . forEach Ġ{ Ġit . invoke () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . removeAll ( tick Callbacks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( it . isRunning Ġ&& Ġpul ses Ġ< Ġtimeout ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion Callbacks Ġ= Ġcallbacks . filter Ġ{ Ġit . delay Ġ== ĠAction Capture Delay . Completed Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Callbacks . forEach Ġ{ Ġit . invoke () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . removeAll ( completion Callbacks ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġcallbacks . size , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" unt rigger ed Ġcallbacks :\ n " Ġ+ Ġcallbacks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Description Ġ= Ġwhen Ġ( it . delay ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction Capture Delay . Ticks Ġ-> Ġ"${ it . delay . count } Ġticks " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction Capture Delay . Completed Ġ-> Ġ" action Ġcompletion " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ delay Description Ġ(${ it . callback Registration . description Ġ?: Ġ"" })" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. prepend Indent (" ĠĠĠ Ġ") ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġcallback Ġregistration Ġthat Ġtriggers Ġafter Ġexactly Ġ[ count ] Ġticks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexact Ticks ( count : ĠInt ) Ġ= Ġcallback ( Action Capture Delay . Ticks ( count )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġcallback Ġregistration Ġthat Ġtriggers Ġafter Ġ[ count ] Ġticks . Ġ ĠThis Ġmethod Ġis Ġcumulative , ĊĠĠĠĠ Ġ* Ġand Ġwill Ġtake Ġinto Ġaccount Ġprevious Ġcalls Ġto Ġ[ ticks ] Ġwhen Ġcreating Ġnew Ġcallbacks . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTo Ġrun Ġa Ġcallback Ġafter Ġan Ġexact Ġnumber Ġof Ġticks Ġuse Ġ[ exact Ticks ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġticks ( count : ĠInt ): ĠAction Capture Callback Registration Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Ticks Ġ+= Ġcount ĊĊĠĠĠĠĠĠĠ Ġreturn Ġexact Ticks ( last Ticks ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġcallback Ġregistration Ġthat Ġtriggers Ġwhen Ġan Ġ[ Action ] Ġcompletes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcomplete () Ġ= Ġcallback ( Action Capture Delay . Completed ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġthis Ġcapture Ġhas Ġa Ġpending Ġ[ Action ] Ġto Ġrun . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Pending (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaction ?. isRunning Ġ?: Ġfalse ĊĠĠĠ Ġ} Ċ }