package Ġnet . cord a . testing . node . internal Ċ Ċ import Ġio . github . class graph . Class Graph Ċ import Ġnet . cord a . core . internal . output Stream Ċ import Ġnet . cord a . node . internal . cord app . create Test Manifest Ċ import Ġnet . cord a . testing . node . Test C ord app Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . attribute . File Time Ċ import Ġjava . time . Instant Ċ import Ġjava . util . jar . Jar File Ċ import Ġjava . util . jar . Jar OutputStream Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Jvm Field Ċ val ĠFIN ANCE _ C ORD APP : ĠTest C ord app Impl Ġ= Ġc ord app For Packages (" net . cord a . finance ") Ċ Ċ /** ĠCreates Ġa Ġ[ Test C ord app Impl ] Ġfor Ġeach Ġpackage . Ġ*/ Ċ fun Ġc ord apps For Packages ( var arg Ġpackage Names : ĠString ): ĠList < Test C ord app Impl > Ġ= Ġc ord apps For Packages ( package Names . asList ()) Ċ Ċ fun Ġc ord apps For Packages ( package Names : ĠIterable < String >): ĠList < Test C ord app Impl > Ġ{ ĊĠĠĠ Ġreturn Ġsimplify Scan Packages ( package Names ). map Ġ{ Ġc ord app For Packages ( it ) Ġ} Ċ } Ċ Ċ /** ĠCreates Ġa Ġsingle Ġ[ Test C ord app Impl ] Ġcontaining Ġall Ġthe Ġgiven Ġpack ges . Ġ*/ Ċ fun Ġc ord app For Packages ( var arg Ġpackage Names : ĠString ): ĠTest C ord app Impl Ġ{ ĊĠĠĠ Ġreturn ĠTest C ord app . Factory . from Packages (* package Names ) Ġas ĠTest C ord app Impl Ċ } Ċ Ċ fun Ġc ord app For Classes ( var arg Ġclasses : ĠClass < *> ): ĠTest C ord app Impl Ġ= Ġc ord app For Packages (). with Classes (* classes ) Ċ Ċ fun Ġget Caller Class ( direct Caller Class : ĠK Class < *> ): ĠClass < *> ? Ġ{ ĊĠĠĠ Ġval Ġstack Trace Ġ= ĠThrowable (). stack Trace ĊĠĠĠ Ġval Ġindex Ġ= Ġstack Trace . indexOf Last Ġ{ Ġit . className Ġ== Ġdirect Caller Class . java . name Ġ} ĊĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠClass . forName ( stack Trace [ index Ġ+ Ġ 1 ]. className ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġget Caller Package ( direct Caller Class : ĠK Class < *> ): ĠString ? Ġ= Ġget Caller Class ( direct Caller Class )?. ` package ` ?. name Ċ Ċ /** Ċ Ġ* ĠS qu ashes Ġchild Ġpackages Ġif Ġthe Ġparent Ġis Ġpresent . ĠExample : Ġ[" com . foo ", Ġ" com . foo . bar "] Ġinto Ġjust Ġ[" com . foo "]. Ċ Ġ*/ Ċ fun Ġsimplify Scan Packages ( scan Packages : ĠIterable < String >): ĠSet < String > Ġ{ ĊĠĠĠ Ġreturn Ġscan Packages . sorted (). fold ( empty Set ()) Ġ{ Ġso Far , ĠpackageName Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġso Far . isEmpty () Ġ-> Ġset Of ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName . startsWith ("${ so Far . last ()}. ") Ġ-> Ġso Far ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġso Far Ġ+ ĠpackageName ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠTest C ord app Impl . package As Jar ( file : ĠPath ) Ġ{ ĊĠĠĠ Ġ// ĠDon 't Ġmention Ġ" classes " Ġin Ġthe Ġerror Ġmessage Ġas Ġthat Ġfeature Ġis Ġonly Ġavailable Ġinternally ĊĠĠĠ Ġrequire ( packages . isNotEmpty () Ġ|| Ġclasses . isNotEmpty ()) Ġ{ Ġ" At Ġleast Ġone Ġpackage Ġmust Ġbe Ġspecified " Ġ} ĊĊĠĠĠ Ġval Ġscan Result Ġ= ĠClass Graph () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. whitelist Packages (* packages . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. whitelist Classes (* classes . map Ġ{ Ġit . name Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan () ĊĊĠĠĠ Ġscan Result . use Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanifest Ġ= Ġcreate Test Manifest ( name , Ġtitle , Ġversion , Ġvendor , Ġtarget Version ) ĊĠĠĠĠĠĠĠ ĠJar OutputStream ( file . output Stream ()). use Ġ{ Ġj os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠFile Time . from ( Instant . EPOCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Entry Ġ= ĠZip Entry ( Jar File . MAN IFEST _ NAME ). set Creation Time ( time ). set Last Access Time ( time ). set LastModified Time ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj os . put Next Entry ( manifest Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest . write ( Buffered OutputStream ( jos )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj os . close Entry () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġsame Ġresource Ġmay Ġbe Ġfound Ġin Ġdifferent Ġlocations Ġ( this Ġwill Ġhappen Ġwhen Ġrunning Ġfrom Ġgradle ) Ġso Ġjust ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpick Ġthe Ġfirst Ġone Ġfound . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Result . all Resources . as Map (). forEach Ġ{ Ġpath , Ġresource List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Entry ( path ). set Creation Time ( time ). set Last Access Time ( time ). set LastModified Time ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj os . put Next Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource List [ 0 ]. open (). use Ġ{ Ġit . copy To ( jos ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj os . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ