package Ġorg . un bro k end ome . gradle . plugins . helm . testutil . exec Ċ Ċ import Ġio . mock k . Answer Ċ import Ġio . mock k . Call Ċ import Ġio . mock k . Capt uring Slot Ċ import Ġio . mock k . every Ċ import Ġio . mock k . spy k Ċ import Ġorg . gradle . api . Action Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . internal . Process Operations Ċ import Ġorg . gradle . api . internal . project . Default Project Ċ import Ġorg . gradle . process . Exec Result Ċ import Ġorg . gradle . process . Exec Spec Ċ import Ġorg . gradle . process . internal . Exec Action Factory ĊĊ Ċ interface ĠProcess Operations Gradle Exec Mock Ġ: ĠGradle Exec Mock Ġ{ ĊĊĠĠĠ Ġfun Ġanswer ( slot : ĠCapt uring Slot < Action < Exec Spec >> ): ĠAnswer < Exec Result > ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( exec Action Factory : ĠExec Action Factory ): ĠProcess Operations Gradle Exec Mock Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Process Operations Gradle Exec Mock ( exec Action Factory ) ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( project : ĠProject ): ĠProcess Operations Gradle Exec Mock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġas ĠDefault Project ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexec Action Factory Ġ= Ġproject . services . get ( Exec Action Factory :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate ( exec Action Factory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġclass ĠDefault Process Operations Gradle Exec Mock ( ĊĠĠĠ Ġprivate Ġval Ġexec Action Factory : ĠExec Action Factory Ċ ) Ġ: ĠProcess Operations Gradle Exec Mock Ġ{ ĊĊĠĠĠ Ġprivate Ġclass ĠBehavior ( ĊĠĠĠĠĠĠĠ Ġval Ġargs Prefix : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġblock : ĠGradle Exec Result Builder . () Ġ-> ĠUnit ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġbehaviors Ġ= Ġmutable ListOf < Behavior >() ĊĠĠĠ Ġprivate Ġval Ġall Inv ocations Ġ= Ġmutable ListOf < Invocation >() ĊĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠPrefix ed ( ĊĠĠĠĠĠĠĠ Ġval Ġprefix : ĠList < String > ĊĠĠĠ Ġ) Ġ: ĠGradle Exec Mock Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfor Command ( args Prefix : ĠList < String >): ĠGradle Exec Mock Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrefix ed ( this . prefix Ġ+ Ġargs Prefix ) ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġevery Exec ( block : ĠGradle Exec Result Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbehaviors . add ( Behavior ( prefix , Ġblock )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġinv ocations : ĠList < Invocation > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġall Inv ocations . filter Ġ{ Ġit . args . startsWith ( prefix ) Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinv ocations Ġ= Ġinv ocations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Gradle Exec Mock Ġfor Ġprefix : Ġ$ prefix ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inv ocations . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ( no Ġrecorded Ġinv ocations )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln (" ĠĠĠ ĠRe corded Ġinv ocations Ġ(${ inv ocations . size }): ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln ( format Inv ocations ( inv ocations )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Inv ocations Ġ= Ġall Inv ocations Ġ- Ġinv ocations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Inv ocations . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln (" ĠĠĠ ĠOther Ġinv ocations Ġ(${ other Inv ocations . size }): ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln ( format Inv ocations ( other Inv ocations )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġval Ġinv ocations : ĠList < Invocation > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġall Inv ocations ĊĊĊĠĠĠ Ġoverride Ġfun Ġfor Command ( args Prefix : ĠList < String >): ĠGradle Exec Mock Ġ= ĊĠĠĠĠĠĠĠ ĠPrefix ed ( args Prefix ) ĊĊĊĠĠĠ Ġoverride Ġfun Ġevery Exec ( block : ĠGradle Exec Result Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbehaviors . add ( Behavior ( emptyList (), Ġblock )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġanswer ( slot : ĠCapt uring Slot < Action < Exec Spec >> ): ĠAnswer < Exec Result > Ġ= Ġobject Ġ: ĠAnswer < Exec Result > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġanswer ( call : ĠCall ): ĠExec Result Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġslot . captured ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexec Spec Ġ= Ġexec Action Factory . new Exec Action () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . execute ( exec Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexec Answer Builder Ġ= ĠGradle Exec Result Builder . from Exec Spec ( exec Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbehaviors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . args Prefix . isEmpty () Ġ|| Ġexec Spec . args . startsWith ( it . args Prefix ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġexec Answer Builder . run ( it . block ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexec Answer Builder . build Exec Result () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! exec Spec . is Ignore Exit Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . assert Normal Exit Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Inv ocations . add ( Exec Spec Invocation ( exec Spec )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġformat Inv ocations ( inv ocations : ĠList < Invocation >) Ġ= ĊĠĠĠĠĠĠĠ Ġinv ocations . join ToString ( separator Ġ= Ġ"\ n ") Ġ{ Ġ" ĠĠĠ Ġ- Ġ${ it . args } "} ĊĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend (" Gradle Exec Mock ") ĊĠĠĠĠĠĠĠ Ġif Ġ( all Inv ocations . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ( no Ġrecorded Ġinv ocations )") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln (" ĠĠĠ ĠRe corded Ġinv ocations Ġ(${ all Inv ocations . size }): ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln ( format Inv ocations ( all Inv ocations )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġ< T > ĠList < T >. startsWith ( elements : ĠIterable < T >) Ġ= ĊĠĠĠ Ġelements . with Index (). all Ġ{ Ġ( index , Ġelement ) Ġ-> ĊĠĠĠĠĠĠĠ Ġsize Ġ> Ġindex Ġ&& Ġget ( index ) Ġ== Ġelement ĊĠĠĠ Ġ} ĊĊ Ċ private Ġclass ĠExec Spec Invocation ( private Ġval Ġexec Spec : ĠExec Spec ) Ġ: ĠAbstract Invocation () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġexecutable : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġexec Spec . executable ĊĊĠĠĠ Ġoverride Ġval Ġargs : ĠList < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġexec Spec . args ĊĊĠĠĠ Ġoverride Ġval Ġenvironment : ĠMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġexec Spec . environment . map Values Ġ{ Ġ(_, Ġv ) Ġ-> Ġv . toString () Ġ} Ċ } ĊĊĊ Ċ internal Ġfun ĠProcess Operations . spy With ( exec Mock : ĠProcess Operations Gradle Exec Mock ): ĠProcess Operations Ġ= ĊĠĠĠ Ġspy k ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġslot Ġ= ĠCapt uring Slot < Action < Exec Spec >>() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġexec ( capture ( slot )) Ġ} Ġanswers Ġexec Mock . answer ( slot ) ĊĠĠĠ Ġ} ĊĊ Ċ internal Ġfun ĠProcess Operations Gradle Exec Mock . install ( project : ĠProject ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġcannot Ġjust Ġwrap Ġthe ĠProject Ġwith Ġa ĠS py , Ġbecause Ġthe ĠGradle Ġtasks Ġetc . Ġwill Ġstill Ġcall Ġexec () Ġon Ġthe ĊĠĠĠ Ġ// Ġinner ĠProject Ġobject . ĠL uck ily ĠProject . exec () Ġdeleg ates Ġto Ġa ĠProcess Operations Ġwhich Ġwe Ġcan Ġreplace Ġwith ĊĠĠĠ Ġ// Ġa Ġspy Ġby Ġreflection . ĠNeed less Ġto Ġsay Ġthat Ġthis Ġreaches Ġdown Ġinto Ġthe Ġimplementation Ġdetails Ġof ĠGradle ĊĠĠĠ Ġ// Ġand Ġmight Ġbreak Ġwith Ġa Ġfuture ĠGradle Ġversion . ĊĠĠĠ Ġval Ġprocess Operations Spy Ġ= Ġ( project Ġas ĠDefault Project ). process Operations . spy With ( this ) ĊĊĠĠĠ Ġproject . java Class . getDeclared Field ("__ process Operations __ "). run Ġ{ ĊĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset ( project , Ġprocess Operations Spy ) ĊĠĠĠ Ġ} Ċ } Ċ