package Ġcom . uber to b . pe stic ide . core Ċ Ċ import Ġjava . io . File Ċ import Ġjava . net . URI ĊĊ Ċ /** Ċ Ġ* ĠD dt Step Ġis Ġthe Ġclass Ġthat Ġshould Ġdrive Ġthe Ġ{@ link ĠD dt Actions } Ġand Ġkeep Ġthe ĠDomain Ġlevel Ġassertions Ġfor Ġall Ġthe Ġ{@ link ĠD dt Protocols } Ċ Ġ* Ċ Ġ* Ġsee Ġ{@ link ĠD dt Actor WithContext } Ġand Ġ{@ link ĠStep Context } Ċ Ġ* Ċ Ġ*/ Ċ data Ġclass ĠD dt Step < in ĠD Ġ: ĠD dt Actions <* >, ĠC Ġ: ĠAny >( ĊĠĠĠ Ġval ĠuserName : ĠString , ĊĠĠĠ Ġval Ġdescription : ĠString , ĊĠĠĠ Ġval Ġaction : ĠStep Block < D , ĠC > Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġstep Source Line Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstack Trace Ġ= ĠThread . currentThread (). stack Trace ĊĠĠĠĠĠĠĠ Ġstack Trace [ 5 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Source URI (): ĠURI ? Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Source Line ?. to Source Reference () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Error Ġwhile Ġtrying Ġto Ġget Ġthe Ġsource Ġline : Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Source String (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Source Line ?. to Source (). or Empty () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhile Ġtrying Ġto Ġget Ġthe Ġsource Ġline : Ġ$ t " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠStack Trace Element . to Source (): ĠString Ġ= Ġ"${ test Class ( className )} :$ line Number " ĊĊĠĠĠ Ġprivate Ġval Ġsource Root Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠFile (" src / test / kotlin "), ĊĠĠĠĠĠĠĠ ĠFile (" src / test / java "), ĊĠĠĠĠĠĠĠ ĠFile (" src / main / kotlin "), ĊĠĠĠĠĠĠĠ ĠFile (" src / main / java ") ĊĠĠĠ Ġ). first OrNull () Ġ{ Ġit . isDirectory Ġ} Ġ?: ĠFile (".") Ġ Ġ// TODO Ġmake Ġsure Ġit Ġworks Ġfor Ġothers Ġas Ġwell ĊĊĊĠĠĠ Ġfun ĠStack Trace Element . to Source Reference (): ĠURI ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtest Class ( className ) ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= ĠfileName Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġsource Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( type .` package `. name . replace (".", Ġ"/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolve ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to File (). to URI () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġfile Uri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Uri . scheme , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Uri . userInfo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Uri . host , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Uri . port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"// " Ġ+ Ġfile Uri . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" line =$ line Number ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Uri . fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġuri ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Class ( className : ĠString ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdollar Ġ= ĠclassName . indexOf ('$ ') ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( d ollar Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName ( className . substring ( 0 , Ġdollar )) ĊĠĠĠĠĠĠĠ Ġelse ĠClass . forName ( className ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ