package Ġorg . lex em . ang mar . analyzer . nodes . functional . statements Ċ Ċ import Ġorg . junit . jupiter . api .* Ċ import Ġorg . junit . jupiter . params .* Ċ import Ġorg . junit . jupiter . params . provider .* Ċ import Ġorg . lex em . ang mar .* Ċ import Ġorg . lex em . ang mar . analyzer .* Ċ import Ġorg . lex em . ang mar . analyzer . data . primitives .* Ċ import Ġorg . lex em . ang mar . parser . functional . expressions .* Ċ import Ġorg . lex em . ang mar . parser . functional . statements .* Ċ import Ġorg . lex em . ang mar . parser . functional . statements . controls .* Ċ import Ġorg . lex em . ang mar . utils .* Ċ Ċ internal Ġclass ĠBlock Stmt Analyzer Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġempty Ġblock Ġwithout Ġtag `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ"${ Block Stmt Node . start Token } Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġempty Ġblock Ġwith Ġtag `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠtagName Ġ= Ġ" tag " ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ"${ Block Stmt Node . start Token }${ Block Stmt Node . tag Prefix }$ tagName Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Name Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getProperty Value ( analyzer . memory , ĠAnalyzer Common s . Identifiers . Hidden Context Tag ) Ġas ĠL xm String ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( tagName , Ġcontext Name . primitive , Ġ" The Ġcontext Name Ġis Ġincorrect ") ĊĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer , ĠlistOf ( Analyzer Common s . Identifiers . Hidden Context Tag )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġblock Ġwithout Ġtag `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvar Name Ġ= Ġ" test " ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠL xm Integer . Num 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Block Stmt Node . start Token } Ġ$ varName Ġ${ Assign Operator Node . assign Operator } Ġ$ value Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġcontext . ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠ Ġcontext . setProperty ( analyzer . memory , Ġvar Name , ĠL xm Nil ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠAnalyzer Common s . getCurrent Context Element < L xm Integer >( analyzer . memory , Ġvar Name ) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( value , Ġresult , Ġ" The Ġresult Ġis Ġincorrect ") ĊĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer , ĠlistOf ( varName )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġblock Ġwith Ġtag `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠtagName Ġ= Ġ" tag " ĊĠĠĠĠĠĠĠ Ġval Ġvar Name Ġ= Ġ" test " ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠL xm Integer . Num 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Block Stmt Node . start Token }${ Block Stmt Node . tag Prefix }$ tagName Ġ$ varName Ġ${ Assign Operator Node . assign Operator } Ġ$ value Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġcontext . ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠ Ġcontext . setProperty ( analyzer . memory , Ġvar Name , ĠL xm Nil ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠAnalyzer Common s . getCurrent Context Element < L xm Integer >( analyzer . memory , Ġvar Name ) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( value , Ġresult , Ġ" The Ġresult Ġis Ġincorrect ") ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Final Ġ= ĠAnalyzer Common s . getCurrent Context ( analyzer . memory ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Name Ġ= Ġcontext Final . getProperty Value ( analyzer . memory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalyzer Common s . Identifiers . Hidden Context Tag ) Ġas ĠL xm String ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( tagName , Ġcontext Name . primitive , Ġ" The Ġcontext Name Ġis Ġincorrect ") ĊĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer , ĠlistOf ( varName , ĠAnalyzer Common s . Identifiers . Hidden Context Tag )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġreturn Ġcontrol Ġsignals `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeyword Ġ= ĠControl With Expression Stmt Node . return Keyword ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠL xm Integer . Num 1 ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġ"$ keyword Ġ$ value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Block Stmt Node . start Token } Ġ$ control Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . assert Control Signal Raised Checking Stack ( analyzer , Ġkeyword , Ġnull , Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Incorrect ĊĠĠĠ Ġ@ Value Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstrings Ġ= Ġ[ Control Without Expression Stmt Node . exit Keyword , ĠControl Without Expression Stmt Node . next Keyword , ĠControl Without Expression Stmt Node . redo Keyword , ĠControl Without Expression Stmt Node . restart Keyword ]) ĊĠĠĠ Ġfun Ġ` test Ġcontrol Ġsignals Ġwithout Ġexpression `( keyword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġkeyword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Block Stmt Node . start Token } Ġ$ control Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . assert Control Signal Raised Checking Stack ( analyzer , Ġkeyword , Ġnull , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Incorrect ĊĠĠĠ Ġ@ Value Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstrings Ġ= Ġ[ Control Without Expression Stmt Node . exit Keyword , ĠControl Without Expression Stmt Node . next Keyword , ĠControl Without Expression Stmt Node . redo Keyword , ĠControl Without Expression Stmt Node . restart Keyword ]) ĊĠĠĠ Ġfun Ġ` test Ġcontrol Ġsignals Ġwith Ġtag Ġand Ġwithout Ġexpression `( keyword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠtagName Ġ= Ġ" tag " ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġ"$ keyword ${ Block Stmt Node . tag Prefix }$ tagName " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Block Stmt Node . start Token }${ Block Stmt Node . tag Prefix }$ tagName Ġ$ control Ġ${ Block Stmt Node . end Token }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠTestUtils . create Analyzer From ( text , Ġparser Function Ġ= ĠBlock Stmt Node . Companion :: parse ) ĊĊĠĠĠĠĠĠĠ ĠTestUtils . assert Control Signal Raised Checking Stack ( analyzer , Ġkeyword , ĠtagName , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTestUtils . process And Check Empty ( analyzer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTestUtils . check Empty Stack And Context ( analyzer , ĠlistOf ( Analyzer Common s . Identifiers . Hidden Context Tag )) ĊĠĠĠ Ġ} Ċ } Ċ