package Ġio . kot lint est . provided Ċ Ċ import Ġio . kot est . core . config . Abstract Project Config Ċ import Ġio . kot est . core . listeners . Test Listener Ċ import Ġio . kot est . core . spec . Spec Ċ import Ġio . kot est . core . test . TestCase Ċ import Ġio . kot est . core . test . TestResult Ċ import Ġio . kot est . core . test . Test Type Ċ import Ġmu . Kotlin Logging Ċ import Ġkotlin . reflect . K Class Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ class ĠProject Config : ĠAbstract Project Config () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġall StartTime Ġ= Ġ 0 L ĊĠĠĠ Ġval Ġexecution Times Ġ= Ġmutable ListOf < Long >() ĊĠĠĠ Ġval Ġheap Sizes Ġ= Ġmutable ListOf < Long >() ĊĊĠĠĠ Ġoverride Ġval Ġparallel ism : ĠInt ? Ġ= Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun Ġbefore All () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Starting Ġtests , Ġmeas uring Ġtime " Ġ} ĊĠĠĠĠĠĠĠ Ġlog Memory Usage () ĊĠĠĠĠĠĠĠ Ġall StartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter All () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecution Time Ġ= ĠSystem . currentTimeMillis () Ġ- Ġall StartTime ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Tests Ġcomplete ! ĠExecution Ġtook Ġ$ execution Time Ġms " Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Average Ġtest Ġexecution Ġtime : Ġ${ execution Times . average ()} Ġms " Ġ} ĊĠĠĠĠĠĠĠ Ġlog Memory Usage () ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Maximum Ġmemory Ġusage Ġwas Ġ${ heap Sizes . max OrNull ()} ĠMB " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlisteners (): ĠList < Test Listener > Ġ= ĊĠĠĠĠĠĠĠ ĠlistOf ( object : ĠTest Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtest Started At Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġprepare Spec ( k class : ĠK Class < out ĠSpec >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Starting Ġtests Ġ${ k class . qualified Name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġfinalize Spec ( k class : ĠK Class < out ĠSpec >, Ġresults : ĠMap < TestCase , ĠTest Result >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Finished Ġtests Ġ${ k class . qualified Name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Memory Usage () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġbefore Test ( testCase : ĠTestCase ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Started At Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġafter Test ( testCase : ĠTestCase , Ġresult : ĠTest Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( testCase . type Ġ== ĠTest Type . Container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecution Time Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtest Started At ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Execution Ġof Ġ'${ testCase . description . names (). drop ( 1 ). join ToString (" Ġ") Ġ{ Ġit . displayName Ġ}} ' Ġtook Ġ$ execution Time Ġms " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- Ġ- " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Times . add ( execution Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheap Sizes . add ( heap Size ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġprivate Ġfun Ġlog Memory Usage () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheap Size Ġ= Ġheap Size () ĊĠĠĠĠĠĠĠ Ġval Ġmax Heap Size Ġ= ĠRuntime . get Runtime (). max Memory () Ġ/ Ġ 1 0 2 4 Ġ/ Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Current Ġmemory Ġusage : Ġ$ heap Size Ġ/ Ġ$ max Heap Size ĠMB " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġheap Size () Ġ= ĠRuntime . get Runtime (). total Memory () Ġ/ Ġ 1 0 2 4 Ġ/ Ġ 1 0 2 4 Ċ }