package Ġnl . j ste ge . ad vent of code . a oc common . utils Ċ Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġnl . j ste ge . ad vent of code . a oc common . days . Day Ċ import Ġorg . junit . Assert Ċ import Ġjava . io . File Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ /** Ċ Ġ* ĠExec utes Ġboth Ġthe Ġfirst Ġand Ġsecond Ġmethod Ġon Ġthe Ġgiven Ġ[ Day ] Ġand Ġchecks Ġwhether Ġthe Ġoutput Ċ Ġ* Ġis Ġequal Ġto Ġthe Ġexpected Ġoutput Ġ( Should Ġbe Ġin Ġa Ġfile Ġ" output /< Day Ġclassname Ġin Ġlowercase >. txt " Ċ Ġ* Ġon Ġthe Ġclasspath ). Ċ Ġ* Ġ@ author ĠJ elle ĠSte ge Ċ Ġ* Ġ@ property Ġday ĠThe Ġday Ġto Ġtest . Ċ Ġ* Ġ@ constructor ĠInitializes Ġthe Ġ[ Day Tester ] Ġwith Ġa Ġ[ Day ] Ġinstance . Ċ Ġ*/ Ċ abstract Ġclass ĠDay Tester ( val Ġday : ĠDay ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġinputs Ġbelong ing Ġto Ġ[ day ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġinputs Ġ= Ġday . load Input Files (). map Ġ{ Ġ( file , Ġinput ) Ġ-> ĊĠĠĠĠĠĠĠ ĠPair ( file . substring After Last ( File . separator ), Ġinput ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġoutputs Ġbelong ing Ġto Ġ[ day ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġoutput Ġ= Ġload Outputs ( day :: class . java ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġthe Ġfirst Ġassignment Ġof Ġ[ day ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest First () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinputs . forEach Ġ{ Ġ( file , Ġinput ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Output Ġ= Ġrun Blocking Ġ{ Ġday . first ( input ). toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Output Ġ= Ġoutput [ file ]?. get ( 0 ) Ġ?: ĠAssert . fail (" Output Ġnot Ġpresent .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Output , Ġactual Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNotImplementedError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// empty , Ġdon 't Ġfail Ġon Ġa Ġto - do . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġthe Ġsecond Ġassignment Ġof Ġ[ day ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Second () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinputs . forEach Ġ{ Ġ( file , Ġinput ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Output Ġ= Ġrun Blocking Ġ{ Ġday . second ( input ). toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Output Ġ= Ġoutput [ file ]?. get ( 1 ) Ġ?: ĠAssert . fail (" Output Ġnot Ġpresent .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Output , Ġactual Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNotImplementedError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// empty , Ġdon 't Ġfail Ġon Ġa Ġto - do ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoads Ġall Ġoutputs Ġfor Ġ[ day ]. ĠShould Ġbe Ġin Ġfiles Ġcorresponding Ġthe Ġinput Ġfiles ; Ġthus ĊĠĠĠĠĠĠĠĠ Ġ* Ġ" output /< Day Ġclassname , Ġwithout Ġ" Day " Ġpre pended >/< input Ġfile Ġname >. txt " Ġon Ġthe Ġclasspath , ĊĠĠĠĠĠĠĠĠ Ġ* Ġwhere ĠN Ġis Ġthe Ġname Ġof Ġthe Ġinput Ġfile . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġc ĠThe Ġ[ Class ] Ġbelong ing Ġto Ġthe Ġ[ day ]. ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġmap Ġof Ġfile Ġnames Ġto Ġoutputs , Ġhaving Ġthe Ġsolution Ġfor Ġthis Ġ[ day ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Outputs ( c : ĠClass < out ĠDay >) Ġ= ĠResource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getResource Files (" output /${ c . simple Name . substring After (" Day "). toLowerCase () }/ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . substring After Last ( File . separator ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . read Lines As Sequence ( it ). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ