package Ġorg . lex em . ang mar . parser . 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 . errors .* Ċ import Ġorg . lex em . ang mar . io . readers .* Ċ import Ġorg . lex em . ang mar . parser .* Ċ import Ġorg . lex em . ang mar . parser . commons .* Ċ import Ġorg . lex em . ang mar . parser . literals .* Ċ import Ġorg . lex em . ang mar . utils .* Ċ import Ġjava . util . stream .* Ċ import Ġkotlin . streams .* Ċ Ċ internal Ġclass ĠFunction Stmt Node Test Ġ{ ĊĠĠĠ Ġ// ĠPARAMETER S Ġ------------------------------------------------ ------------- ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġtest Expression Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Function Stmt Node . keyword } Ġ${ Identifier Node Test . test Expression } Ġ${ Function Parameter ListNode Test . test Expression } Ġ${ Block Stmt Node Test . test Expression }" ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprovide Correct Function Stmt (): ĠStream < Arguments > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Arguments . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Function Stmt Node . keyword } Ġ${ Identifier Node Test . test Expression } Ġ${ Function Parameter ListNode Test . test Expression } Ġ${ Block Stmt Node Test . test Expression }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Arguments . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Function Stmt Node . keyword } Ġ${ Identifier Node Test . test Expression }${ Function Parameter ListNode Test . test Expression }${ Block Stmt Node Test . test Expression }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Arguments . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Function Stmt Node . keyword } Ġ${ Identifier Node Test . test Expression } Ġ${ Block Stmt Node Test . test Expression }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Arguments . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Function Stmt Node . keyword } Ġ${ Identifier Node Test . test Expression }${ Block Stmt Node Test . test Expression }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsequence . as Stream () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠA UX ĠMETHO DS Ġ-------------------------------------------------------- ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Test Expression ( node : ĠParser Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertTrue ( node Ġis ĠFunction Stmt Node , Ġ" The Ġnode Ġis Ġnot Ġa ĠFunction Stmt Node ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġas ĠFunction Stmt Node ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIdentifier Node Test . check Test Expression ( node . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Stmt Node Test . check Test Expression ( node . block ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( node . parameter List , Ġ" The Ġargument List Ġproperty Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Parameter ListNode Test . check Test Expression ( node . parameter List !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTEST S Ġ---------------------------------------------------------------- -- ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Method Source (" provide Correct Function Stmt ") ĊĠĠĠ Ġfun Ġ` parse Ġcorrect Ġfunction Ġstatement `( text : ĠString , Ġhas Arguments : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠLex em Parser ( IO String Reader . from ( text )) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠFunction Stmt Node . parse ( parser , ĠParser Node . Companion . Empty Parser Node , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( res , Ġ" The Ġinput Ġhas Ġnot Ġbeen Ġcorrectly Ġparsed ") ĊĠĠĠĠĠĠĠ Ġres Ġas ĠFunction Stmt Node ĊĊĠĠĠĠĠĠĠ ĠIdentifier Node Test . check Test Expression ( res . name ) ĊĠĠĠĠĠĠĠ ĠBlock Stmt Node Test . check Test Expression ( res . block ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertNotNull ( res . parameter List , Ġ" The Ġargument List Ġproperty Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Parameter ListNode Test . check Test Expression ( res . parameter List !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertNull ( res . parameter List , Ġ" The Ġargument List Ġproperty Ġmust Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( text . length , Ġparser . reader . current Position (), Ġ" The Ġparser Ġdid Ġnot Ġadvance Ġthe Ġcursor ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Incorrect ĊĠĠĠ Ġfun Ġ` parse Ġincorrect Ġfunction Ġstatement Ġwithout Ġblock `() Ġ{ ĊĠĠĠĠĠĠĠ ĠTestUtils . assert Parser Exception ( Ang mar Parser Exception Type . Function Statement Without Block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Function Stmt Node . keyword } Ġ${ Identifier Node Test . test Expression } Ġ${ Function Parameter ListNode Test . test Expression }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠLex em Parser ( IO String Reader . from ( text )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Stmt Node . parse ( parser , ĠParser Node . Companion . Empty Parser Node , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Value Source ( strings Ġ= Ġ[ "" ]) ĊĠĠĠ Ġfun Ġ` not Ġparse Ġthe Ġnode `( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠLex em Parser ( IO String Reader . from ( text )) ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠFunction Stmt Node . parse ( parser , ĠParser Node . Companion . Empty Parser Node , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertNull ( res , Ġ" The Ġinput Ġhas Ġincorrectly Ġparsed Ġanything ") ĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 0 , Ġparser . reader . current Position (), Ġ" The Ġparser Ġmust Ġnot Ġadvance Ġthe Ġcursor ") ĊĠĠĠ Ġ} Ċ } Ċ