// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . u ast . test . common Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Recursive Element Visitor Ċ import Ġorg . jetbrains . u ast .* Ċ import Ġorg . jetbrains . u ast . test . env . assertEquals ToFile Ċ import Ġorg . jetbrains . u ast . visitor . U ast Visitor Ċ import Ġorg . junit . Assert Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ interface ĠRender Log TestBase Ġ{ ĊĠ Ġfun Ġget TestData Path (): ĠString ĊĊĠ Ġprivate Ġfun Ġget Test File ( test Name : ĠString , Ġext : ĠString ) Ġ= ĊĠĠĠ ĠFile ( get TestData Path (), Ġtest Name . substring Before Last ('.') Ġ+ Ġ'.' Ġ+ Ġext ) ĊĊĠ Ġfun Ġcheck ( test Name : ĠString , Ġfile : ĠU File ) Ġ= Ġcheck ( test Name , Ġfile , Ġtrue ) ĊĊĠ Ġfun Ġcheck ( test Name : ĠString , Ġfile : ĠU File , Ġcheck Parent Consistency : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġrender File Ġ= Ġget Test File ( test Name , Ġ" render . txt ") ĊĠĠĠ Ġval Ġlog File Ġ= Ġget Test File ( test Name , Ġ" log . txt ") ĊĊĠĠĠ ĠassertEquals ToFile (" Render Ġstring ", Ġrender File , Ġfile . as Render String ()) ĊĠĠĠ ĠassertEquals ToFile (" Log Ġstring ", Ġlog File , Ġfile . as Recursive Log String ()) ĊĊĠĠĠ Ġif Ġ( check Parent Consistency ) Ġ{ ĊĠĠĠĠĠ Ġcheck Parent Consistency ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfile . check Containing File ForAll Elements () ĊĠ Ġ} ĊĊĠ Ġfun Ġcheck Parent Consistency ( file : ĠU File ) Ġ{ ĊĠĠĠ Ġval Ġparent Map Ġ= Ġmutable Map Of < Psi Element , ĠString >() ĊĊĠĠĠ Ġfile . accept ( object Ġ: ĠU ast Visitor Ġ{ ĊĠĠĠĠĠ Ġprivate Ġval Ġparent Stack Ġ= ĠStack < U Element >() ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( node : ĠU Element ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnode . u ast Parent ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue (" Wrong Ġnull - parent Ġof Ġ${ node . java Class } Ġ'${ node . source Psi ?. text ?. line Sequence ()?. first OrNull () }' ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Stack . empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" Wrong Ġparent Ġof Ġ${ node . java Class } Ġ'${ node . source Psi ?. text ?. line Sequence ()?. first OrNull () }' ", Ġparent Stack . peek (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode . source Psi ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ! in Ġparent Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Map [ it ] Ġ= Ġparent Stack . reversed (). join ToString Ġ{ Ġit . as Log String () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparent Stack . push ( node ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġafter Visit Element ( node : ĠU Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . after Visit Element ( node ) ĊĠĠĠĠĠĠĠ Ġparent Stack . pop () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĊĠĠĠ Ġfile . source Psi . accept ( object Ġ: ĠPsi Recursive Element Visitor () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġu Element Ġ= Ġelement . to U Element () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Parents Ġ= Ġparent Map [ element ] ĊĠĠĠĠĠĠĠ Ġif Ġ( expected Parents Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull (" Expected Ġto Ġbe Ġable Ġto Ġconvert ĠP SI Ġelement Ġ$ element ", Ġu Element ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġparents Ġ= Ġgenerate Sequence ( u Element !!. u ast Parent ) Ġ{ Ġit . u ast Parent Ġ}. join ToString Ġ{ Ġit . as Log String () Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" In consistent Ġparents Ġfor Ġ$ u Element Ġ( converted Ġfrom Ġ$ element ) Ġparent : Ġ-> Ġ${ u Element . u ast Parent }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Parents , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparents ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit Element ( element ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġfun ĠU File . check Containing File ForAll Elements () Ġ{ ĊĠĠĠ Ġaccept ( object Ġ: ĠU ast Visitor Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( node : ĠU Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġnode . source Psi ?. let Ġ{ Ġsource Psi Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġu Element Ġ= Ġsource Psi . to U Element () !! ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" get Containing U File Ġshould Ġbe Ġequal Ġto Ġsource Ġfor Ġ${ u Element . java Class } Ġfor Ġ${ source Psi . text }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ check Containing File ForAll Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu Element . get Containing U File ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġu ast Anchor Ġ= Ġ( node Ġas ? ĠU Declaration )?. u ast Anchor ĊĠĠĠĠĠĠĠ Ġif Ġ( u ast Anchor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" should Ġbe Ġappropriate Ġsource Psi Ġfor Ġu ast Anchor Ġfor Ġ${ node . java Class } Ġ[ ${ node . source Psi ?. text }] Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . source Psi Element !!. containing File !! , Ġu ast Anchor . source Psi ?. containing File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġanchor Psi Ġ= Ġu ast Anchor ?. source Psi ĊĠĠĠĠĠĠĠ Ġif Ġ( anchor Psi Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( anchor Psi . containing File , Ġnode . source Psi Element !!. containing File !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} Ċ }