package Ġcom . github . em ill und strm . al der lang . interpreter Ċ Ċ import Ġcom . github . em ill und strm . al der lang . ast .* Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assert Throws Ċ import Ġjava . io . FileNotFoundException Ċ import Ġkotlin . test . Test Ċ Ċ internal Ġclass ĠInterpreter Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Interpreter () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( Integer Literal ( 1 ), ĠInterpreter . eval ("( a Ġ-> Ġ 1 ) Ġ 2 ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Integer Literal ( 1 ), ĠInterpreter . eval ("( a Ġ-> Ġa ) Ġ 1 ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Integer Literal ( 1 ), ĠInterpreter . eval ("( a Ġ-> Ġb Ġ-> Ġa ) Ġ 1 Ġ( foo Ġbar Ġbaz ) ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Global Funcs () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( Integer Literal ( 3 ), ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġf Ġa Ġb Ġ= Ġa Ġ+ Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġf Ġ 1 Ġ 2 """. trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun File ( filename : ĠString ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInterpreter . run ( this . java Class . class Loader . getResource AsStream ( filename ) Ġ?: Ġthrow ĠFileNotFoundException ( filename )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Chain Let () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Literal (" test "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . eval (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġa Ġ= Ġ" test " Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġb Ġ= Ġa Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġc Ġ= Ġb Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc """. trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Func With Internal Let () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . eval (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġf Ġa Ġ= ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġx Ġ= Ġa Ġin Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġf Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Flip () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġflip Ġf Ġx Ġy Ġ= Ġf Ġy Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġf Ġa Ġb Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġflip Ġf Ġ 1 Ġ 2 """. trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Two Args () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . eval (" let Ġf Ġx Ġy Ġ= Ġx Ġin Ġf Ġ 1 Ġ 2 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Two Args 2 () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . eval ("( x Ġ-> Ġy Ġ-> Ġx ) Ġ 1 Ġ 2 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Invalid Function () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThrows ( NoSuch ElementException :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠInterpreter . eval (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġf Ġa Ġ= Ġx Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġx Ġ= Ġ 1 Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ 1 """. trim Indent ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Y Com b () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠInterpreter . eval (" let Ġfix Ġ= Ġf Ġ-> Ġ( x Ġ-> Ġf Ġ( x Ġx )) Ġ( x Ġ-> Ġf Ġ( x Ġx )) Ġin Ġfix Ġ( x Ġ-> Ġ 1 )") ĊĠĠĠĠĠĠĠ ĠassertEquals ( Integer Literal ( 1 ), Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Lex ical Closure () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġf Ġx Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġg Ġx Ġ= Ġf Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġlet Ġf Ġx Ġ= Ġ 1 Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg Ġx """. trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Type () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value (" True "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠBool Ġ= ĠTrue Ġ| ĠFalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= ĠTrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cons () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value (" Cons ", ĠInteger Literal ( 1 ), ĠId . named (" Nil ")), Ġ// ĠNote Ġthat ĠNil Ġis Ġnot Ġevaluated Ġto ĠTyped Value (" Nil ") Ġyet ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠList Ġa Ġ= ĠCons Ġa Ġ( List Ġa ) Ġ| ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= ĠCons Ġ 1 ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cons Literal () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value (" Cons ", ĠInteger Literal ( 1 ), ĠId . named (" Nil ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠList Ġa Ġ= ĠCons Ġa Ġ( List Ġa ) Ġ| ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġ[ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Pattern Match () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠList Ġa Ġ= ĠCons Ġa Ġ( List Ġa ) Ġ| ĠNil ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġfst Ġ( Cons Ġa Ġb ) Ġ= Ġa ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġfst Ġ[ 3 , 2 , 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Complex Pattern Match () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠList Ġa Ġ= ĠCons Ġa Ġ( List Ġa ) Ġ| ĠNil ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġlast Ġlist Ġ= Ġcase Ġlist Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ( Cons Ġx ĠNil ) Ġ-> Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ( Cons Ġx Ġy ) Ġ-> Ġlast Ġy ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġlast Ġ[ 1 , 2 , 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Std Lib () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġhead Ġ( map Ġhead Ġ[[ 1 ],[ 2 ],[ 3 ]]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Std Lib Fold () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġfold Ġplus Ġ 0 Ġ[ 1 , 2 , 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Lazy List () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġhead Ġ[ 1 , Ġbottom ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Range () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value ( Id . named (" True ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġeq Ġ[ 5 , 6 , 7 , 8 , 9 ] Ġ( range Ġ 5 Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Reverse () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value ( Id . named (" True ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġeq Ġ[ 1 , 2 , 3 , 4 , 5 ] Ġ( reverse Ġ[ 5 , 4 , 3 , 2 , 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Concat () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value ( Id . named (" True ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġeq Ġ[ 1 , 2 , 3 , 4 ] Ġ( concat Ġ[ 1 , 2 ] Ġ[ 3 , 4 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Partition () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value ( Id . named (" True ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġis Even Ġx Ġ= Ġeq Ġ 0 Ġ( x Ġ% Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġeq Ġ( partition Ġis Even Ġ[ 1 , 2 , 3 , 4 ]) Ġ( Pair Ġ[ 2 , 4 ] Ġ[ 1 , 3 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fold r () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal ( 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterpreter . run (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġstdlib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmain Ġ= Ġfold Strict Ġplus Ġ 0 Ġ[ 1 , 2 , 3 , 4 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest F izz Bu zz () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun File (" f izz buzz . al ") ĊĠĠĠ Ġ} Ċ }