package Ġcom . iy x an 2 3 . e pl k Ċ Ċ import Ġcom . iy x an 2 3 . e pl k . lexer . Lexer Ċ import Ġcom . iy x an 2 3 . e pl k . parser . Parser Ċ import Ġcom . iy x an 2 3 . e pl k . nodes . Node Ċ import Ġorg . junit . Test Ċ Ċ class ĠParser Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfilename Ġ= Ġ"< TEST >" ĊĊĠĠĠ Ġprivate Ġfun Ġexpect Nodes ( code : ĠString , Ġexpectation : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġ 6 / 1 6 / 2 1 ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġdon 't Ġput Ġthe Ġentire Ġnode Ġtree Ġas Ġthe Ġtruth Ġdata , Ġmake Ġa Ġnew Ġfunction Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġchecks Ġthe Ġimportant Ġpart Ġof Ġthe Ġnode ĊĠĠĠĠĠĠĠ Ġassert ( result . node Ġ== Ġexpectation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbin Op Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" 1 Ġ+ Ġ 2 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġunary Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"- 1 Ġ+ Ġ 2 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstring Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"\" Hello ĠWorld \ n \"" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparentheses Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"( 1 Ġ+ Ġ 2 ) Ġ* Ġ 3 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpow Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" 3 Ġ^ Ġ 3 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvariable Declaration Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" var Ġhello _ world Ġ= Ġ 1 Ġ+ Ġ 1 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvariable Access Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" 1 Ġ+ Ġhello _ world " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcomparison Expression Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" 5 Ġ+ Ġ 1 2 Ġ/ Ġvariable Ġ> Ġ 1 0 Ġ+ Ġ 5 Ġ* Ġvariable " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" var Ġhello _ world Ġ= Ġif Ġ( 1 Ġ== Ġ 1 ) Ġ 1 0 Ġelse Ġ 0 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif Test 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" var Ġhello _ world Ġ= Ġif Ġ( 1 Ġ== Ġ 1 ) Ġ 1 0 Ġelif Ġ( 2 Ġ== Ġ 2 ) Ġ 2 Ġelse Ġ 0 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġif Test 3 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" var Ġhello _ world Ġ= Ġif Ġ( 1 Ġ== Ġ 1 ) Ġ 1 0 Ġelif Ġ( 2 Ġ== Ġ 2 ) Ġ 2 Ġelif Ġ( 3 Ġ== Ġ 3 ) Ġ 3 Ġelse Ġ 0 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfor Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" for Ġ( var Ġb Ġ= Ġ 0 ; Ġb Ġ< Ġ 1 0 ; Ġvar Ġb Ġ= Ġb Ġ+ Ġ 1 ) Ġ 1 Ġ+ Ġ 1 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhile Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" while Ġ( variable Ġ> Ġ 1 0 ) Ġvar Ġsomething Ġ= Ġsomething Ġ* Ġ 2 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmultiline While Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" while Ġ( variable Ġ> Ġ 1 0 ) Ġ{\ n ĠĠĠ Ġvar Ġsomething Ġ= Ġsomething Ġ* Ġ 2 \ n ĠĠĠ Ġvar Ġhello Ġ= Ġsome _ function () Ġ* Ġ 1 0 \ n }" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfunc Def Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" fun Ġhello _ world ( hi , Ġworld , Ġtest ) Ġ-> Ġ 1 Ġ+ Ġ 1 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmultiline Func Def Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" fun Ġhello _ world ( hi , Ġworld , Ġtest ) Ġ{\ n ĠĠĠ Ġvar Ġa Ġ= Ġ 1 0 \ n ĠĠĠ Ġprintln (\" Hello ĠWorld \") \ n }" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfunc Call No Args Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" hello _ world ()" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfunc Call With Args Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" hello _ world ( 1 0 , Ġ 1 0 Ġ+ Ġ 1 0 , Ġ 1 0 0 Ġ* Ġ 2 )" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlist Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"[ 1 , Ġ\" Hi \", Ġ- 1 , Ġ 1 Ġ+ Ġ 1 ]" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġempty List Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" []" ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġincrement Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" a ++ " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdecrement Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" a -- " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstatements Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" 1 Ġ+ Ġ 1 \ n 5 Ġ* Ġ 2 \ n \ n 1 0 Ġ/ Ġ 5 0 \ n \ n \ n \ n ĠĠĠĠ Ġ\ n \ n \ n Ġ 1 0 Ġ* Ġ 1 0 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġequal Operators Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" a Ġ+= Ġ 1 \ nb Ġ-= Ġ 3 \ nc Ġ*= Ġ 1 0 \ nd Ġ/= Ġ 2 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert (! result . has Error ) Ġ{ Ġprintln ( result . error !!. toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Utils . pretty Print Node ( result . node !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsyntax Error Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ" 1 Ġ 2 Ġ 3 Ġ/ " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert ( result . has Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsyntax Error Test 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ"- (- 1 " ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= ĠLex er ( filename , Ġcode ). do Lex ical Analysis (). tokens !! ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠParser ( tokens ). parse () ĊĊĠĠĠĠĠĠĠ Ġassert ( result . has Error ) ĊĠĠĠ Ġ} Ċ }