/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . workflow . testing Ċ Ċ import Ġcom . squareup . workflow . Snapshot Ċ import Ġcom . squareup . workflow . Workflow Ċ import Ġcom . squareup . workflow . Workflow Host Ċ import Ġcom . squareup . workflow . Workflow Host . Factory Ċ import Ġkotlinx . coroutines . experimental . Dispatch ers Ċ import Ġkotlinx . coroutines . experimental . Job Ċ import Ġkotlinx . coroutines . experimental . cancel Ċ import Ġorg . jetbrains . annotations . Test Only Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġ[ Workflow Tester ] Ġto Ġrun Ġthis Ġworkflow Ġfor Ġunit Ġtesting . Ċ Ġ* Ċ Ġ* ĠAll Ġworkflow - related Ġcor outines Ġare Ġcancelled Ġwhen Ġthe Ġblock Ġexits . Ċ Ġ*/ Ċ // Ġ@ formatter : off Ċ @ Test Only Ċ fun Ġ< Input T Ġ: ĠAny , ĠOutput T Ġ: ĠAny , ĠRendering T Ġ: ĠAny > ĊĠĠĠ ĠWorkflow < Input T , Ġ*, ĠOutput T , ĠRendering T >. test From Start ( ĊĠĠĠĠĠ Ġinput : ĠInput T , ĊĠĠĠĠĠ Ġsnapshot : ĠSnapshot ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġblock : Ġ( Workflow Tester < Output T , ĠRendering T >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġtest ( block ) Ġ{ Ġit . run ( this , Ġinput , Ġsnapshot ) Ġ} Ċ // Ġ@ formatter : on Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġ[ Workflow Tester ] Ġto Ġrun Ġthis Ġworkflow Ġfor Ġunit Ġtesting . Ċ Ġ* Ċ Ġ* ĠAll Ġworkflow - related Ġcor outines Ġare Ġcancelled Ġwhen Ġthe Ġblock Ġexits . Ċ Ġ*/ Ċ @ Test Only Ċ fun Ġ< Output T Ġ: ĠAny , ĠRendering T Ġ: ĠAny > ĠWorkflow < Unit , Ġ*, ĠOutput T , ĠRendering T >. test From Start ( ĊĠ Ġsnapshot : ĠSnapshot ? Ġ= Ġnull , ĊĠ Ġblock : Ġ( Workflow Tester < Output T , ĠRendering T >) Ġ-> ĠUnit Ċ ) Ġ= Ġtest From Start ( Unit , Ġsnapshot , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġ[ Workflow Tester ] Ġto Ġrun Ġthis Ġworkflow Ġfor Ġunit Ġtesting . Ċ Ġ* Ġ[ Workflow . initialState ] Ġis Ġnot Ġcalled . ĠInstead , Ġthe Ġworkflow Ġis Ġstarted Ġfrom Ġthe Ġgiven Ċ Ġ* Ġ[ initialState ]. Ċ Ġ* Ċ Ġ* ĠAll Ġworkflow - related Ġcor outines Ġare Ġcancelled Ġwhen Ġthe Ġblock Ġexits . Ċ Ġ*/ Ċ // Ġ@ formatter : off Ċ @ Test Only Ċ fun Ġ< Input T Ġ: ĠAny , ĠState T Ġ: ĠAny , ĠOutput T Ġ: ĠAny , ĠRendering T Ġ: ĠAny > ĊĠĠĠ ĠWorkflow < Input T , ĠState T , ĠOutput T , ĠRendering T >. test From State ( ĊĠĠĠĠĠ Ġinput : ĠInput T , ĊĠĠĠĠĠ ĠinitialState : ĠState T , ĊĠĠĠĠĠ Ġblock : Ġ( Workflow Tester < Output T , ĠRendering T >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġtest ( block ) Ġ{ Ġit . run Test From State ( this , Ġinput , ĠinitialState ) Ġ} Ċ // Ġ@ formatter : on Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġ[ Workflow Tester ] Ġto Ġrun Ġthis Ġworkflow Ġfor Ġunit Ġtesting . Ċ Ġ* Ġ[ Workflow . initialState ] Ġis Ġnot Ġcalled . ĠInstead , Ġthe Ġworkflow Ġis Ġstarted Ġfrom Ġthe Ġgiven Ċ Ġ* Ġ[ initialState ]. Ċ Ġ* Ċ Ġ* ĠAll Ġworkflow - related Ġcor outines Ġare Ġcancelled Ġwhen Ġthe Ġblock Ġexits . Ċ Ġ*/ Ċ // Ġ@ formatter : off Ċ @ Test Only Ċ fun Ġ< State T Ġ: ĠAny , ĠOutput T Ġ: ĠAny , ĠRendering T Ġ: ĠAny > ĊĠĠĠ ĠWorkflow < Unit , ĠState T , ĠOutput T , ĠRendering T >. test From State ( ĊĠĠĠĠĠ ĠinitialState : ĠState T , ĊĠĠĠĠĠ Ġblock : Ġ( Workflow Tester < Output T , ĠRendering T >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġtest From State ( Unit , ĠinitialState , Ġblock ) Ċ // Ġ@ formatter : on Ċ Ċ private Ġfun Ġ< O Ġ: ĠAny , ĠR Ġ: ĠAny > Ġtest ( ĊĠ Ġtest Block : Ġ( Workflow Tester < O , ĠR >) Ġ-> ĠUnit , ĊĠ Ġstarter : Ġ( Factory ) Ġ-> ĠWorkflow Host < O , ĠR > Ċ ) Ġ{ ĊĠ Ġval Ġcontext Ġ= ĠJob () Ġ+ ĠDispatch ers . Un conf ined ĊĠ Ġval Ġhost Ġ= ĠWorkflow Host . Factory ( context ) ĊĠĠĠĠĠ Ġ. let ( starter ) ĊĠĠĠĠĠ Ġ. let Ġ{ ĠWorkflow Tester ( it , Ġcontext ) Ġ} ĊĊĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĠ Ġtry Ġ{ ĊĠĠĠ Ġtest Block ( host ) ĊĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġerror Ġ= Ġe ĊĠĠĠ Ġthrow Ġe ĊĠ Ġ} Ġfinally Ġ{ ĊĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcancelled Ġ= Ġcontext . cancel ( error ) ĊĠĠĠĠĠ Ġif Ġ(! cancelled ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcancellation Cause Ġ= Ġcontext [ Job ] !!. getC ancellation Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. cause ĊĠĠĠĠĠĠĠ Ġif Ġ( c ancellation Cause Ġ!= Ġerror ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror . add Sup pressed ( c ancellation Cause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// ĠCancel Ġthe ĠJob Ġto Ġensure Ġeverything Ġgets Ġcleaned Ġup . ĊĠĠĠĠĠ Ġcontext . cancel () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ