import Ġcom . so y wiz . kor io . async . run Blocking No Js Ċ import Ġcom . so y wiz . kor io . lang . assert Ċ import Ġscript .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠTest Compiler Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compile Function Variable () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"{ x Ġ= Ġ 1 }" ĊĊĠĠĠĠĠĠĠ Ġval Ġtokenizer Ġ= ĠToken izer ( code ) ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠParser ( tokenizer ). parse Block () ĊĊĠĠĠĠĠĠĠ Ġval Ġcompiler Ġ= ĠCompiler () ĊĊĠĠĠĠĠĠĠ Ġcompiler . compile Block ( block ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġcompiler . generate User Function () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġfunction . variable Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compile Two Statements () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"{ 1 + 2 ; 2 }" ĊĊĠĠĠĠĠĠĠ Ġval Ġtokenizer Ġ= ĠToken izer ( code ) ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠParser ( tokenizer ). parse Block () ĊĊĠĠĠĠĠĠĠ Ġval Ġcompiler Ġ= ĠCompiler () ĊĊĠĠĠĠĠĠĠ Ġcompiler . compile Block ( block ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġcompiler . generate User Function () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġblock . statements . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compile Program () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" a Ġ= Ġ 1 \ nb =' test '" ĊĊĠĠĠĠĠĠĠ Ġval Ġtokenizer Ġ= ĠToken izer ( code ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= ĠParser ( tokenizer ). parse Program () ĊĊĠĠĠĠĠĠĠ Ġval Ġcompiler Ġ= ĠCompiler () ĊĊĠĠĠĠĠĠĠ Ġcompiler . compile Program ( statements ) ĊĊĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= Ġcompiler . generate Runtime () ĊĊĠĠĠĠĠĠĠ Ġruntime . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠValue () ĊĊĠĠĠĠĠĠĠ Ġruntime . root . getProperty ByName (" a ", Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġassert ( value . isNumber ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 . 0 , Ġvalue . number ) ĊĊĠĠĠĠĠĠĠ Ġruntime . root . getProperty ByName (" b ", Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġassert ( value . isObject ) ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġvalue . obj !! ĊĠĠĠĠĠĠĠ Ġassert Is < String Object >( obj ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" test ", Ġobj . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compile Variables () Ġ= Ġrun Blocking No Js Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" a Ġ= Ġ 1 \ nb = 2 \ nc Ġ= Ġa Ġ+ Ġb " ĊĊĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= Ġcompile Program (" test Compile Variables ") ĊĠĠĠĠĠĠĠ Ġruntime . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠValue () ĊĊĠĠĠĠĠĠĠ Ġruntime . root . getProperty ByName (" c ", Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġassert ( value . isNumber ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 . 0 , Ġvalue . number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compile Object () Ġ= Ġrun Blocking No Js Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= Ġcompile Program (" test Compile Object ") ĊĠĠĠĠĠĠĠ Ġruntime . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠValue () ĊĊĠĠĠĠĠĠĠ Ġruntime . root . getProperty ByName (" c ", Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġassert ( value . isObject ) ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġvalue . obj ĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( obj ) ĊĊĠĠĠĠĠĠĠ Ġobj . getProperty ByName (" d ", Ġvalue ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 . 0 , Ġvalue . number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Compile Function () Ġ= Ġrun Blocking No Js Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= Ġcompile Program (" test Compile Function ") ĊĠĠĠĠĠĠĠ Ġruntime . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠValue () ĊĊĠĠĠĠĠĠĠ Ġruntime . root . getProperty ByName (" test 1 ", Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġassert ( value . isObject ) ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġvalue . obj ĊĊĠĠĠĠĠĠĠ Ġassert Is < User Function >( obj ) ĊĊĊĊĠĠĠĠĠĠĠ Ġobj . getProperty ByName (" d ", Ġvalue ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 . 0 , Ġvalue . number ) ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ