package Ġu y . ko hes ive . ke pl in . kotlin . script . js r 2 2 3 Ċ Ċ import Ġorg . junit . Test Ċ import Ġjava . io . String Writer Ċ import Ġjavax . script . Inv oc able Ċ import Ġjavax . script . Script Engine Manager Ċ import Ġkotlin . test . assertEquals ĊĊ Ċ class ĠTest Inv oc able Ġ{ ĊĠĠĠ Ġval Ġengine Names Ġ= ĠlistOf ( Eval Only J sr 2 2 3 Repl Engine Factory . js r 2 2 3 Engine Name , ĠComp il able J sr 2 2 3 Repl Engine Factory . js r 2 2 3 Engine Name ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest J sr 2 2 3 Inv oc able Function And Method () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠScript Engine Manager () ĊĠĠĠĠĠĠĠ Ġengine Names . forEach Ġ{ Ġengine Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= Ġfactory . get Engine ByName ( engine Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvok er Ġ= Ġengine Ġas ĠInv oc able ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapture Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . context . writer Ġ= Ġcapture ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . eval (""" fun Ġfoo ( x : ĠInt ) Ġ= Ġx Ġ+ Ġ 2 0 """) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 , Ġinvok er . invoke Function (" foo ", Ġ 3 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . eval (""" class ĠBar ( val Ġbase : ĠInt ) Ġ{ Ġfun Ġfoo ( x : ĠInt ) Ġ= Ġx Ġ+ Ġbase ; Ġ} """) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbar Instance Ġ= Ġengine . eval (""" Bar ( 5 0 ) """) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 7 5 , Ġengine . invoke Method ( bar Instance , Ġ" foo ", Ġ 2 5 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġcall Ġold Ġthing Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 , Ġinvok er . invoke Function (" foo ", Ġ 3 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest J sr 2 2 3 Inv oc able Interface () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠScript Engine Manager () ĊĠĠĠĠĠĠĠ Ġengine Names . forEach Ġ{ Ġengine Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= Ġfactory . get Engine ByName ( engine Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvok er Ġ= Ġengine Ġas ĠInv oc able ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapture Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . context . writer Ġ= Ġcapture ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . eval (""" fun Ġrun () Ġ{ Ġprintln (" running ") Ġ} """) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvok er . get Interface ( Runnable :: class . java ). run () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" running \ n ", Ġcapture . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdo Ġthis Ġin Ġthree Ġparts Ġto Ġmake Ġsure Ġinterface Ġcan Ġspan Ġmultiple Ġe vals ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . eval (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġone ( x : ĠInt , Ġy : ĠInt ) Ġ= Ġx Ġ+ Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . eval (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtwo ( something : ĠString ) Ġ= Ġ" two es Ġ"+ something ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . eval (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġthree (): ĠInt Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo fy Ġ= Ġinvok er . get Interface ( Foo fy :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 3 , Ġfoo fy . one ( 2 1 , Ġ 1 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" two es Ġa Ġc rowd ", Ġfoo fy . two (" a Ġc rowd ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġfoo fy . three ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgo Ġback Ġand Ġdo Ġrunnable Ġagain ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvok er . get Interface ( Runnable :: class . java ). run () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" running \ n running \ n ", Ġcapture . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠFoo fy Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġone ( x : ĠInt , Ġy : ĠInt ): ĠInt ĊĠĠĠĠĠĠĠ Ġfun Ġtwo ( s : ĠString ): ĠString ĊĠĠĠĠĠĠĠ Ġfun Ġthree (): ĠInt ĊĠĠĠ Ġ} Ċ }