@ file : Suppress (" Constant Condition If ") Ċ Ċ import ĠTest Programs . Companion . ignore Keyword Ċ import ĠTest Programs . Companion . testing Keyword Ċ import Ġarrow . core . getOrElse Ċ import Ġic . org . ARM Ċ import Ġic . org . Compile Result Ċ import Ġic . org . JVM Ċ import Ġic . org . Target Ċ import Ġic . org . W ACC Compiler Ċ import Ġic . org . util . contains All Ċ import Ġjava . io . File Ċ import Ġkotlin . time . Experimental Time Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Ass umptions . assume False Ċ import Ġorg . junit . jupiter . api . Ass umptions . assume True Ċ import Ġorg . junit . jupiter . api . Ass umptions . ass uming That Ċ import Ġorg . junit . jupiter . api . Dynamic Test Ċ import Ġorg . junit . jupiter . api . Test Factory Ċ import Ġorg . junit . jupiter . api . fail Ċ import Ġreference . J as min API Ċ import Ġreference . Reference Compiler API Ġas ĠRef Ċ Ċ /** Ċ Ġ* ĠThis Ġtest Ġclass Ġwill Ġscan Ġthe Ġw acc _ examples Ġdirectory , Ġand Ġattempt Ġto Ġcompile Ġall Ġfiles , Ġone Ċ Ġ* Ġby Ġone . ĠIf Ġthe Ġcompiler Ġcrashes Ġwith Ġ Ġa Ġ[ NotImplemented Error ] Ġexception Ġ( due Ġto Ġa Ġ[ TODO ] Ġcall ) Ċ Ġ* Ġthen Ġthat Ġcompile Ġis Ġignored . Ċ Ġ* ĠOtherwise , Ġwe Ġcreate Ġa Ġtest Ġand Ġcheck Ġwhat Ġthe Ġreturn Ġcode Ġand Ġcompiler Ġoutput Ġwas . ĠIf Ġit Ġas Ċ Ġ* Ġexpected Ġ( read Ġfrom Ġthe Ġcomments Ġof Ġthe Ġfile Ġitself ) Ġthat Ġtest Ġpasses . ĠFor Ġany Ġother Ġoutcome Ċ Ġ* Ġ( a Ġcrash , Ġor Ġunexpected Ġcompiler Ġoutput Ġor Ġerror Ġcode ) Ġthe Ġtest Ġfails . Ċ Ġ* Ċ Ġ* ĠAdditionally , Ġa Ġfile Ġthat Ġdoes Ġnot Ġhave Ġthe Ġstring Ġ[ testing Keyword ] Ġor Ġ[ ignore Keyword ] Ġin Ġits Ċ Ġ* Ġpath Ġinside Ġthe Ġproject Ġwill Ġbe Ġignored , Ġthis Ġallowing Ġus Ġto Ġselect Ġwhich Ġfiles Ġtesting Ġshould Ċ Ġ* Ġbe Ġenabled Ġfor . Ċ Ġ* Ċ Ġ* Ġ[ ignore Keyword ] Ġtakes Ġprecedence . ĠI e , Ġif Ġa Ġdirectory Ġhas Ġ[ testing Keyword ] Ġbut Ġa Ġsubdirectory Ġhas Ċ Ġ* Ġ[ ignore Keyword ], Ġthe Ġdirectory Ġwill Ġbe Ġtested Ġexcept Ġfor Ġthe Ġsubdirectory / Ċ Ġ* Ċ Ġ*/ Ċ @ Experimental Time Ċ class ĠTest Programs Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġ// ĠTesting Ġconstants ĊĠĠĠ Ġprivate Ġconst Ġval Ġw acc Examples Path Ġ= Ġ"./ w acc _ examples /" ĊĠĠĠ Ġprivate Ġconst Ġval Ġtest Output Keywords Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġconst Ġval Ġtesting Keyword Ġ= Ġ" TEST " ĊĠĠĠ Ġprivate Ġconst Ġval Ġignore Keyword Ġ= Ġ" IGNORE " ĊĠĠĠ Ġprivate Ġconst Ġval Ġtest Semantics Only Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġconst Ġval Ġtest JVM Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġconst Ġval Ġtest ARM Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġconst Ġval Ġdefault Input Ġ= Ġ" Hello " ĊĠĠĠ Ġprivate Ġconst Ġval Ġignore JVM Keyword Ġ= Ġ" NO _ JVM " ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġskip If Ignored ( prog : ĠW ACC Program ) Ġ{ ĊĠĠĠ Ġassume True ( ignore Keyword Ġ! in Ġprog . file . absolute Path ) Ġ{ Ġ" File Ġpath Ġcontains Ġ'$ ignore Keyword ', Ġskipping Ġtest " Ġ} ĊĠĠĠ Ġassume True ( ignore JVM Keyword Ġ! in Ġprog . file . absolute Path Ġ&& Ġtest JVM ) Ġ{ ĊĠĠĠĠĠ Ġ" File Ġpath Ġcontains Ġ$ ignore JVM Keyword , Ġskipping Ġtest " ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġw acc Files Ġ= ĊĠĠĠ ĠFile ( w acc Examples Path ). walk () ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isFile Ġ&& Ġ". w acc " Ġin Ġit . path Ġ} ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġtesting Keyword Ġin Ġit . canonical Path Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . as Program () Ġ} ĊĠĠĠĠĠ Ġ. toList () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTests Ġwhether Ġ[ W ACC Compiler ] Ġcan Ġcompile Ġ Ġ[ program ] Ġwith Ġthe Ġexpected Ġcompile Ġoutput Ġ( so Ġno ĊĠĠ Ġ* Ġruntime Ġexecution Ġtests ) Ġaccording Ġto Ġ[ test Output Keywords ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIf Ġ[ do Check Only ] Ġis Ġfalse , Ġit Ġwill Ġalso Ġcheck Ġthe Ġassembly Ġoutput Ġof Ġthe Ġprogram Ġis Ġthe Ġsame Ġas Ġthe ĊĠĠ Ġ* Ġreference Ġcompiler 's . ĊĠĠ Ġ*/ ĊĠ Ġ@ Experimental Time ĊĠ Ġprivate Ġfun Ġtest ( program : ĠW ACC Program , Ġdo Check Only : ĠBoolean , Ġtarget : ĠTarget ) Ġ{ ĊĠĠĠ Ġskip If Ignored ( program ) ĊĠĠĠ Ġval ĠfilePath Ġ= Ġprogram . file . absolute Path ĊĠĠĠ Ġval Ġcanonical Path Ġ= Ġprogram . file . canonical Path ĊĠĠĠ Ġval Ġinput Ġ= Ġprogram . special Input (). getOrElse Ġ{ Ġdefault Input Ġ} ĊĠĠĠ Ġval Ġexp Ref Ġ= Ġif Ġ(! do Check Only ) ĊĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). async Ġ{ ĠRef . ask ( program . file , Ġinput ) Ġ} ĊĠĠĠ Ġelse Ġnull ĊĠĠĠ Ġval Ġres : ĠCompile Result Ġ= Ġtry Ġ{ ĊĠĠĠĠĠ ĠW ACC Compiler ( filePath ). compile ( do Check Only , Ġtarget Ġ= Ġtarget ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġexp Ref ?. cancel () ĊĠĠĠĠĠ Ġassume False ( e Ġis ĠNotImplementedError ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Hit Ġa ĠTODO () Ġstatement Ġtrying Ġto Ġcompile Ġ${ program . file . name } :\ n ${ program . file . read Text () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠTODO Ġstatement Ġwas Ġfound Ġat :\ n ${ e . stack Trace . first () }" ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhit Ġan Ġunimplemented Ġcase , Ġignore Ġthis Ġtest . ĠOtherwise , Ġwe Ġmust Ġhave Ġcr ashed ĊĠĠĠĠĠ Ġ// Ġfor Ġsome Ġother Ġreason . ĠSo Ġfail Ġthe Ġtest Ġcase . ĊĠĠĠĠĠ ĠSystem . err . println (" Failed Ġto Ġcompile Ġ$ canonical Path Ġwith Ġexception .") ĊĠĠĠĠĠ Ġprintln (" Program :\ n ${ program . file . read Text () }") ĊĠĠĠĠĠ Ġfail ( e ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠassertEquals ( program . expected Return , Ġres . exit Code ) Ġ{ ĊĠĠĠĠĠ Ġ" Bad Ġexit Ġcode Ġwhile Ġcompiling \ n Ġ$ canonical Path ,\ n Ġcompiler Ġoutput : Ġ\ n ${ res . msg }" ĊĠĠĠ Ġ} ĊĠĠĠ Ġassuming That ( test Output Keywords ) Ġ{ ĊĠĠĠĠĠ ĠassertTrue ( res . msg . contains All ( program . expected Key Words )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠIf Ġwe Ġare Ġnot Ġdoing Ġonly Ġchecks , Ġalso Ġcheck Ġwith Ġthe Ġreference Ġcompiler Ġassembly Ġoutput ĊĠĠĠ Ġif Ġ(! do Check Only ) Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġval Ġ( expected Ass , Ġexpected Out , Ġexpected Code , Ġj vm Out , Ġarm Out ) Ġ= Ġexp Ref !!. await () ĊĠĠĠĠĠ Ġval Ġactual Ass Ġ= Ġres . out . getOrElse Ġ{ Ġfail (" Compilation Ġun successful ") Ġ} ĊĠĠĠĠĠ Ġif Ġ( target Ġis ĠARM ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( actual Out , Ġactual Code ) Ġ= ĠRef . em ulate ( actual Ass , ĠfilePath , Ġinput ) ĊĠĠĠĠĠĠĠ Ġprintln (" Program Ġruntime Ġoutput :\ n ${ actual Out . if Blank Ġ{ Ġ"( no Ġoutput )" Ġ}} \ n ") ĊĠĠĠĠĠĠĠ Ġprintln ("\ n Compiled ĠW ACC :\ n ${ program . file . read Text () }") ĊĠĠĠĠĠĠĠ Ġif Ġ( arm Out Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( arm Out Ġ! in Ġactual Out ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Not Ġmatching Ġspecific ĠARM Ġprogram Ġoutputs Ġfor Ġ$ canonical Path .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Expected Ġin " Ġ+ Ġ" Actual :\ n ". pad Start ( 5 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( arm Out . side To Side With ( actual Out , Ġpad Ġ= Ġ 5 0 ) Ġ+ Ġ'\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Ass , Ġactual Ass ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Out Ġ!= Ġactual Out ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Not Ġmatching Ġprogram Ġoutputs Ġfor Ġ$ canonical Path .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Expected " Ġ+ Ġ" Actual :\ n ". pad Start ( 5 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( expected Out . side To Side With ( actual Out , Ġpad Ġ= Ġ 5 0 ) Ġ+ Ġ'\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Ass , Ġactual Ass ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Code Ġ!= Ġactual Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Not Ġmatching Ġprogram Ġoutput Ġcodes Ġfor Ġ$ canonical Path .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Expected Ġ$ expected Code Ġand Ġactual : Ġ$ actual Code \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Ass , Ġactual Ass ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( target Ġis ĠJVM ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( actual Out , Ġactual Code ) Ġ= ĠJ as min API . em ulate ( actual Ass , ĠfilePath , Ġinput ) ĊĠĠĠĠĠĠĠ Ġprintln (" Program Ġruntime Ġoutput :\ n ${ actual Out . if Blank Ġ{ Ġ"( no Ġoutput )" Ġ}} \ n ") ĊĠĠĠĠĠĠĠ Ġprintln ("\ n Compiled ĠW ACC :\ n ${ program . file . read Text () }") ĊĠĠĠĠĠĠĠ Ġif Ġ( jvm Out Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( jvm Out Ġ! in Ġactual Out ) ĠassertEquals ( jvm Out , Ġactual Out ) Ġ{ Ġ" Byte code :\ n $ actual Ass " Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Out , Ġactual Out ) Ġ{ Ġ" Not Ġmatching Ġprogram Ġoutputs Ġfor Ġ$ canonical Path .\ n Byte code :\ n ${ actual Ass . with Line Numbers () }" Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Code , Ġactual Code ) Ġ{ Ġ" Not Ġmatching Ġexit Ġcodes Ġfor Ġ$ canonical Path \ n . Byte code :\ n $ actual Ass " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġprintln (" Suc ces ful Ġassembly :\ n $ actual Ass \ n ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" Test Ġsuccessful Ġ( compiler Ġexit Ġcode Ġ${ res . exit Code }). ĠCompiler Ġoutput :\ n ${ res . msg }\ n ") ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTakes Ġevery Ġ[ W ACC Program ] Ġin Ġ[ w acc Files ] Ġand Ġcreates Ġa Ġ[ Dynamic Test ] Ġwith Ġ[ test ] ĊĠĠ Ġ* ĠEvery Ġone Ġof Ġthese Ġ[ Dynamic Test ] s Ġare Ġthe Ġunit Ġtests Ġthat Ġshow Ġup Ġin Ġthe Ġreport . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIt Ġonly Ġchecks Ġa Ġprogram Ġsynt act ically Ġand Ġsemantic ally . ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Factory ĊĠ Ġfun Ġsemantic ally Check Programs () Ġ= Ġw acc Files . map Ġ{ Ġprog Ġ-> ĊĠĠĠ ĠDynamic Test . dynamic Test ( prog . file . canonical Path ) Ġ{ Ġtest ( prog , Ġdo Check Only Ġ= Ġtrue , Ġtarget Ġ= ĠJVM ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTakes Ġevery Ġ[ W ACC Program ] Ġin Ġ[ w acc Files ] Ġand Ġcreates Ġa Ġ[ Dynamic Test ] Ġwith Ġ[ test ] ĊĠĠ Ġ* ĠEvery Ġone Ġof Ġthese Ġ[ Dynamic Test ] s Ġare Ġthe Ġunit Ġtests Ġthat Ġshow Ġup Ġin Ġthe Ġreport . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIt Ġdoes Ġonly Ġcheck Ġtests Ġthat Ġare Ġsupposed Ġto Ġpre od uce Ġassembly , Ġie , Ġare Ġvalid . ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Factory ĊĠ Ġfun Ġcompile Check Programs ARM () Ġ= Ġw acc Files ĊĠĠĠ Ġ. filter Not Ġ{ Ġtest Semantics Only Ġ} ĊĠĠĠ Ġ. filter Not Ġ{ Ġ" invalid " Ġin Ġit . file . path Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġprog Ġ-> ĊĠĠĠĠĠ ĠDynamic Test . dynamic Test ( prog . file . canonical Path ) Ġ{ Ġtest ( prog , Ġdo Check Only Ġ= Ġfalse , Ġtarget Ġ= ĠARM ) Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġ@ Test Factory ĊĠ Ġfun Ġcompile Check Programs JVM () Ġ= Ġw acc Files ĊĠĠĠ Ġ. filter Not Ġ{ Ġtest Semantics Only Ġ} ĊĠĠĠ Ġ. filter Not Ġ{ Ġ" invalid " Ġin Ġit . file . path Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġprog Ġ-> ĊĠĠĠĠĠ ĠDynamic Test . dynamic Test ( prog . file . canonical Path ) Ġ{ Ġtest ( prog , Ġdo Check Only Ġ= Ġfalse , Ġtarget Ġ= ĠJVM ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ