package Ġcom . ep am . drill . plugins . test 2 code Ċ Ċ import Ġcom . ep am . drill . common .* Ċ import Ġcom . ep am . drill . plugins . test 2 code . api .* Ċ import Ġcom . ep am . drill . plugins . test 2 code . common . api .* Ċ import Ġcom . ep am . drill . plugins . test 2 code . coverage .* Ċ import Ġcom . ep am . drill . plugins . test 2 code . jvm .* Ċ import Ġkotlinx . collections . immutable .* Ċ import Ġmu .* Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ internal Ġfun ĠSequence < Session >. calc Bundle Counters ( ĊĠĠĠ Ġcontext : ĠCover Context Ċ ) Ġ= Ġrun Ġ{ ĊĠĠĠ Ġval Ġprob es By Test Type Ġ= Ġgroup By ( Session :: test Type ) ĊĠĠĠ Ġval Ġtest Type Overlap : ĠSequence < Exec Class Data > Ġ= Ġif Ġ( prob es By Test Type . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprob es By Test Type . values . as Sequence (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial : ĠPersistent Map < Long , ĠExec Class Data > Ġ= Ġfirst (). as Sequence (). flatten (). merge () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrop ( 1 ). fold ( initial ) Ġ{ Ġintersection , Ġsessions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintersection . intersect ( sessions . as Sequence (). flatten ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. values . as Sequence () ĊĠĠĠ Ġ} Ġelse Ġempty Sequence () ĊĠĠĠ ĠBundle Counters ( ĊĠĠĠĠĠĠĠ Ġall Ġ= Ġflatten (). bundle ( context ), ĊĠĠĠĠĠĠĠ Ġtest Type Overlap Ġ= Ġtest Type Overlap . bundle ( context ), ĊĠĠĠĠĠĠĠ Ġoverlap Ġ= Ġflatten (). over lapping Bundle ( context ), ĊĠĠĠĠĠĠĠ Ġby Test Type Ġ= Ġprob es By Test Type . map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . as Sequence (). flatten (). bundle ( context ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġby Test Ġ= Ġbundles By Tests ( context ), ĊĠĠĠĠĠĠĠ Ġstats By Test Ġ= Ġfold ( mutable Map Of ()) Ġ{ Ġmap , Ġsession Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . test Stats . forEach Ġ{ Ġ( test , Ġstats ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ test ] Ġ= Ġmap [ test ]?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( duration Ġ= Ġduration Ġ+ Ġstats . duration , Ġresult Ġ= Ġstats . result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġstats ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ internal Ġfun ĠBundle Counters . calculate Coverage Data ( ĊĠĠĠ Ġcontext : ĠCover Context , ĊĠĠĠ Ġscope : ĠScope ? Ġ= Ġnull Ċ ): ĠCoverage Info Set Ġ{ ĊĠĠĠ Ġval Ġbundle Ġ= Ġall ĊĠĠĠ Ġval Ġbundles By Test Types Ġ= Ġby Test Type ĊĠĠĠ Ġval Ġbundles By Tests Ġ= Ġby Test ĊĊĠĠĠ Ġval Ġassoc Tests Map Ġ= Ġbundles By Tests . associated Tests () ĊĠĠĠ Ġval Ġassociated Tests Ġ= Ġassoc Tests Map . get Associated Tests () ĊĊĠĠĠ Ġval Ġtotal Count Ġ= Ġcontext . package Tree . total Count ĊĠĠĠ Ġval Ġcoverage Count Ġ= Ġbundle . count . copy ( total Ġ= Ġtotal Count ) ĊĠĠĠ Ġval Ġtotal Coverage Percent Ġ= Ġcoverage Count . percentage () ĊĊĠĠĠ Ġval Ġcoverage By Tests Ġ= ĠCoverage By Tests ( ĊĠĠĠĠĠĠĠ Ġall Ġ= ĠTest Summary ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoverage Ġ= Ġbundle . to Cover Dto ( context . package Tree ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Count Ġ= Ġbundles By Tests . keys . count () ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġby Type Ġ= Ġby Test Type . cover ages By Test Type ( by Test , Ġcontext ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġlogger . info Ġ{ Ġcoverage By Tests . by Type Ġ} ĊĊĠĠĠ Ġval Ġmethod Count Ġ= Ġbundle . method Count . copy ( total Ġ= Ġcontext . package Tree . total Method Count ) ĊĠĠĠ Ġval Ġclass Count Ġ= Ġbundle . class Count . copy ( total Ġ= Ġcontext . package Tree . total Class Count ) ĊĠĠĠ Ġval Ġpackage Count Ġ= Ġbundle . package Count . copy ( total Ġ= Ġcontext . package Tree . packages . count ()) ĊĠĠĠ Ġval Ġcoverage Block : ĠCoverage Ġ= Ġwhen Ġ( scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Coverage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercentage Ġ= Ġtotal Coverage Percent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġcoverage Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Count Ġ= Ġmethod Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Count Ġ= Ġclass Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Count Ġ= Ġpackage Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Type Overlap Ġ= Ġtest Type Overlap . to Cover Dto ( context . package Tree ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġby Test Type Ġ= Ġcoverage By Tests . by Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFinished Scope Ġ-> Ġscope . summary . coverage ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠScope Coverage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpercentage Ġ= Ġtotal Coverage Percent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġcoverage Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlap Ġ= Ġoverlap . to Cover Dto ( context . package Tree ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Count Ġ= Ġmethod Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Count Ġ= Ġclass Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Count Ġ= Ġpackage Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Type Overlap Ġ= Ġtest Type Overlap . to Cover Dto ( context . package Tree ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġby Test Type Ġ= Ġcoverage By Tests . by Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġlogger . info Ġ{ Ġcoverage Block Ġ} ĊĊĠĠĠ Ġval Ġbuild Methods Ġ= Ġcontext . calculate Bundle Methods ( bundle ) ĊĊĠĠĠ Ġval Ġpackage Coverage Ġ= Ġcontext . package Tree . packages . tree Coverage ( bundle , Ġassoc Tests Map ) ĊĊĠĠĠ Ġval Ġcovered By Test Ġ= Ġbundles By Tests . methods Cover edBy Test ( context ) ĊĠĠĠ Ġval Ġcovered By Test Type Ġ= Ġbundles By Test Types . methods Cover ed ByType ( context , Ġbundles By Tests ) ĊĊĠĠĠ Ġval Ġtests Usage s Info ByType Ġ= Ġcoverage By Tests . by Type . map Ġ{ Ġ( test Type , Ġsummary ) Ġ-> ĊĠĠĠĠĠĠĠ ĠTests Usage s Info ByType ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Type Ġ= Ġtest Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoverage Ġ= Ġsummary . coverage . percentage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Count Ġ= Ġsummary . coverage . method Count . covered , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtests Ġ= Ġtest Usage s ( total Count , Ġtest Type ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}. sorted By Ġ{ Ġit . test Type Ġ} ĊĊĠĠĠ Ġreturn ĠCoverage Info Set ( ĊĠĠĠĠĠĠĠ Ġassociated Tests , ĊĠĠĠĠĠĠĠ Ġcoverage Block , ĊĠĠĠĠĠĠĠ Ġbuild Methods , ĊĠĠĠĠĠĠĠ Ġpackage Coverage , ĊĠĠĠĠĠĠĠ Ġtests Usage s Info ByType , ĊĠĠĠĠĠĠĠ Ġcoverage By Tests , ĊĠĠĠĠĠĠĠ Ġcovered By Test , ĊĠĠĠĠĠĠĠ Ġcovered By Test Type ĊĠĠĠ Ġ) Ċ } Ċ Ċ internal Ġfun ĠMap < String , ĠBundle Counter >. cover ages By Test Type ( ĊĠĠĠ Ġbundle Map : ĠMap < Typed Test , ĠBundle Counter >, ĊĠĠĠ Ġcontext : ĠCover Context Ċ ): ĠList < Test Type Summary > Ġ= Ġmap Ġ{ Ġ( test Type , Ġbundle ) Ġ-> ĊĠĠĠ ĠTest Type Summary ( ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtest Type , ĊĠĠĠĠĠĠĠ Ġsummary Ġ= ĠTest Summary ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoverage Ġ= Ġbundle . to Cover Dto ( context . package Tree ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Count Ġ= Ġbundle Map . keys . filter Ġ{ Ġit . type Ġ== Ġtest Type Ġ}. distinct (). count () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠSequence < Session >. bundles By Tests ( ĊĠĠĠ Ġcontext : ĠCover Context Ċ ): ĠMap < Typed Test , ĠBundle Counter > Ġ= Ġtake If Ġ{ Ġit . any () Ġ} ?. run Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġflat Map Ġ{ Ġit . tests . as Sequence () Ġ}. associate With To ( mutable Map Of ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠBundle Counter ("") ĊĠĠĠ Ġ} ĊĠĠĠ Ġgroup By ( Session :: test Type ). map Ġ{ Ġ( test Type , Ġsessions ) Ġ-> ĊĠĠĠĠĠĠĠ Ġsessions . as Sequence (). flatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ ĠTyped Test ( it . test Name , Ġtest Type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values To ( map ) Ġ{ Ġit . value . as Sequence (). bundle ( context ) Ġ} ĊĠĠĠ Ġ}. reduce Ġ{ Ġm 1 , Ġm 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġm 1 . apply Ġ{ Ġput All ( m 2 ) Ġ} ĊĠĠĠ Ġ} Ċ } Ġ?: Ġempty Map () Ċ Ċ internal Ġfun ĠSequence < Exec Class Data >. over lapping Bundle ( ĊĠĠĠ Ġcontext : ĠCover Context Ċ ): ĠBundle Counter Ġ= Ġcontext . build . prob es . intersect ( this ). run Ġ{ ĊĠĠĠ Ġvalues . as Sequence () Ċ }. bundle ( context ) Ċ Ċ internal Ġfun ĠSequence < Exec Class Data >. bundle ( ĊĠĠĠ Ġcontext : ĠCover Context Ċ ): ĠBundle Counter Ġ= Ġwhen Ġ( context . agent Type ) Ġ{ ĊĠĠĠ ĠAgent Type . JAVA Ġ-> Ġbundle ( ĊĠĠĠĠĠĠĠ Ġprobe Ids Ġ= Ġcontext . probe Ids , ĊĠĠĠĠĠĠĠ Ġclass Bytes Ġ= Ġcontext . class Bytes ĊĠĠĠ Ġ) ĊĠĠĠ Ġelse Ġ-> Ġbundle ( context . package Tree ) Ċ } Ċ Ċ private Ġfun ĠMap < Typed Test , ĠBundle Counter >. associated Tests (): ĠMap < Coverage Key , ĠList < Typed Test >> Ġ= Ġrun Ġ{ ĊĠĠĠ Ġentries . as Sequence () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( test , Ġbundle ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . coverage Keys (). map Ġ{ Ġit Ġto Ġtest Ġ} ĊĠĠĠĠĠĠĠ Ġ}. distinct () ĊĠĠĠĠĠĠĠ Ġ. groupBy ({ Ġit . first Ġ}) Ġ{ Ġit . second Ġ} Ċ } Ċ