package Ġfeatures . glue Ċ Ċ import Ġcom . intellij . code Insight . completion . Completion Type Ċ import Ġcom . intellij . code Insight . lookup . Lookup Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Presentation Ċ import Ġcom . intellij . code Insight . lookup . Lookup Manager Ċ import Ġcom . intellij . code Insight . lookup . impl . Lookup Impl Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . command . Command Processor Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Condition Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġcom . intellij . openapi . util . registry . Registry Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . test Framework . Use ful TestCase Ċ import Ġcom . intellij . test Framework . fixtures . Code Insight TestFixture Ċ import Ġcom . intellij . test Framework . fixtures . Test Lookup Element Presentation Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġcom . jetbrains . python . psi . Py StringLiteral Expression Ċ import Ġfeatures . glue . Sn ak em ake World . get Offset Under Caret Ċ import Ġio . cucumber . datatable . DataTable Ċ import Ġio . cucumber . java . en . Then Ċ import Ġio . cucumber . java . en . When Ċ import Ġjunit . framework . TestCase Ċ import Ġjava . lang . Integer . max Ċ import Ġkotlin . test .* Ċ Ċ /** Ċ Ġ* Ġ@ author ĠRoman . Ch ern y atch ik Ċ Ġ* Ġ@ date Ġ 2 0 1 9 - 0 5 - 0 9 Ċ Ġ*/ Ċ class ĠCompletion Resolve Steps Ġ{ ĊĠĠĠ Ġ@ Then ("^ there Ġshould Ġbe Ġno Ġreference $ ") ĊĠĠĠ Ġfun Ġreference ShouldBe Null () Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke And Wait ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġget Reference At Offset () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( ref ) ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġnot Ġresolve $ ") ĊĠĠĠ Ġfun Ġreference Should Not Resolve () Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke And Wait ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġget Reference At Offset () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Un resolved Reference ( ref ) ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Then ("^ reference Ġin Ġinjection Ġshould Ġnot Ġresolve $ ") ĊĠĠĠ Ġfun Ġreference In Injection Should Not Resolve () Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke And Wait ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġget Reference In Inject ed Language At Offset () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Un resolved Reference ( ref ) ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ When ("^ I Ġput Ġthe Ġcaret Ġat Ġ(. + )$ ") ĊĠĠĠ Ġfun Ġi Put Caret At ( marker : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= ĠApplication Manager . getApplication () ĊĠĠĠĠĠĠĠ Ġapplication . invoke And Wait ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . run Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= ĠSn ak em ake World . fixture (). editor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġget Position By Signature ( editor , Ġmarker , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . caret Model . moveTo Offset ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ When ("^ I Ġput Ġthe Ġcaret Ġafter Ġ(. + )$ ") ĊĠĠĠ Ġfun Ġi Put Caret After ( marker : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= ĠApplication Manager . getApplication () ĊĠĠĠĠĠĠĠ Ġapplication . invoke And Wait ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . run Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= ĠSn ak em ake World . fixture (). editor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġget Position By Signature ( editor , Ġmarker , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . caret Model . moveTo Offset ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġresolve Ġto Ġ\" (. +) \" Ġdirectory ") ĊĠĠĠ Ġfun Ġreference Should Resolve To Directory ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġget Reference At Offset () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġresolve ( ref ) Ġas ? ĠPsi Directory ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( result . name , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġin Ġinjection Ġshould Ġresolve Ġto Ġ\" (. +) \" Ġin Ġ\" (. +) \" $ ") ĊĠĠĠ Ġfun Ġreference In Injection Should Resolve To In ( target Prefix : ĠString , Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( Sn ak em ake World . fixture (). project ). waitFor Smart Mode () ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Resolve Ref ( target Prefix , Ġtarget Prefix , Ġfile , Ġget Reference In Inject ed Language At Offset ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġin Ġinjection Ġshould Ġresolve Ġto Ġ\" (. +) \" Ġin Ġcontext Ġ\" (. +) \" Ġin Ġfile Ġ\" (. +) \" $ ") ĊĠĠĠ Ġfun Ġreference In Injection Should Resolve To At In File ( target Prefix : ĠString , Ġcontext : ĠString , Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( Sn ak em ake World . fixture (). project ). waitFor Smart Mode () ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Resolve Ref ( target Prefix , Ġcontext , Ġfile , Ġget Reference In Inject ed Language At Offset ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġresolve Ġto Ġ\" (. +) \" Ġin Ġcontext Ġ\" (. +) \" Ġin Ġfile Ġ\" (. +) \" $ ") ĊĠĠĠ Ġfun Ġreference Should Resolve To At In File ( result Sub str : ĠString , Ġcontext : ĠString , Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( Sn ak em ake World . fixture (). project ). waitFor Smart Mode () ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Resolve Ref ( result Sub str , Ġcontext , Ġfile , Ġget Reference At Offset ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġresolve Ġto Ġ\" (. +) \" Ġin Ġ\" (. +) \" $ ") ĊĠĠĠ Ġfun Ġreference Should Resolve To In ( target Prefix : ĠString , Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( Sn ak em ake World . fixture (). project ). waitFor Smart Mode () ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Resolve Ref ( target Prefix , Ġtarget Prefix , Ġfile , Ġget Reference At Offset ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry To Resolve Ref ( target Prefix : ĠString , Ġcontext : ĠString , Ġfile : ĠString , Ġref : ĠPsi Reference ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġresolve ( ref ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinjection Host Ġ= ĠSn ak em ake World . injection Fixture (). inject ed Language Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Injection Host ( result ) ĊĠĠĠĠĠĠĠ Ġval Ġcontaining File Ġ= Ġ( injection Host Ġ?: Ġresult ). containing File ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Resolve Ġresult Ġtype : Ġ${ result :: class . java . simple Name }," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġfile : Ġ${ containing File . virtual File . path }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Psi Ġelement Ġtext : Ġ${ result . text }" ĊĠĠĠĠĠĠĠ Ġrequire ( context . isNotEmpty () Ġ&& Ġtarget Prefix . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire ( target Prefix . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Target Ġprefix Ġis Ġempty . Ġ$ msg " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire ( injection Host Ġ== Ġnull Ġ|| Ġinjection Host Ġis ĠPy StringLiteral Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Injection Ġonly Ġin Ġstrings Ġare Ġcurrently Ġby Ġthis Ġmethod , Ġbut Ġwas Ġinjection Ġin Ġ${ injection Host !! :: class . java . simple Name }\ n $ msg " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinjection Start Offset Ġ= Ġif Ġ( injection Host Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinjection Host . text Offset Ġ+ Ġ( injection Host Ġas ĠPy StringLiteral Expression ). stringValue Text Range . start Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( containing File ) ĊĠĠĠĠĠĠĠ Ġval Ġactual Path Ġ= Ġcontaining File . virtual File . path ĊĠĠĠĠĠĠĠ Ġval Ġactual Sub String Ġ= Ġactual Path . sub Sequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( 0 , Ġ Ġactual Path . length Ġ- Ġfile . length ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Path . length ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( file , Ġactual Sub String , Ġmsg ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Prefix . length Ġ<= Ġresult . text Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġresult Ġprefix Ġ<$ target Prefix > Ġis Ġlonger Ġthan Ġelement Ġ< ${ result . text }> \ n $ msg " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġelement Text Ġ= ĠText Range . from ( result . text Offset , Ġtarget Prefix . length ). substring ( result . containing File . text ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġelement Text Ġ= ĠText Range . from ( 0 , Ġtarget Prefix . length ). substring ( result . text ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( target Prefix , Ġelement Text , Ġmsg ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠText Range . from ( injection Start Offset Ġ+ Ġresult . text Offset , Ġ Ġcontext . length ). substring ( containing File . text ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( context , Ġtext , Ġmsg ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġin Ġinjection Ġshould Ġmulti Ġresolve Ġto Ġname , Ġfile Ġin Ġsame Ġorder $ ") ĊĠĠĠ Ġfun Ġreference In Injection Should Multi Resolve To In Order ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Multi Resolve In Same Order ( table ) Ġ{ Ġget Reference In Inject ed Language At Offset () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġmulti Ġresolve Ġto Ġname , Ġfile Ġin Ġsame Ġorder $ ") ĊĠĠĠ Ġfun Ġreference Should Multi Resolve To In Order ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Multi Resolve In Same Order ( table ) Ġ{ Ġget Reference At Offset () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Multi Resolve In Same Order ( table : ĠDataTable , Ġref Provider : Ġ() Ġ-> ĠPsi Reference ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġref Provider () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Results Ġ= Ġmulti Resolve ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġraw Results . filter Ġ{ Ġit Ġ== Ġnull Ġ}. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġraw Results . filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresults . filter Ġ{ Ġit . containing File Ġ== Ġnull Ġ}. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolve Results Ġ= Ġresults . map Indexed () Ġ{ Ġi , Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( item Text ( result ) Ġto Ġresult . containing File . name ) Ġto Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġtable . as Lists () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Refs Info Ġ= Ġresolve Results . entries . join ToString ( separator Ġ= Ġ"\ n ") Ġ{ Ġ( text And FileName , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| ${ text And FileName . first }| Ġ${ text And FileName . second } Ġ| " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev : ĠPair < Int , ĠPair < String , ĠString >> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows . forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġrow [ 0 ] Ġto Ġrow [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġresolve Results [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Variant Ġ[ ${ key . first }, Ġ${ key . second }] Ġis Ġmissing Ġin :\ n $ actual Refs Info " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Key Ġ= Ġprev !!. second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev !!. first Ġ< Ġidx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Variant Ġ[ ${ prev Key . first }, Ġ${ prev Key . second }] Ġshould Ġbe Ġbefore " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ[ ${ key . first }, Ġ${ key . second }] Ġin :\ n $ actual Refs Info " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġidx Ġto Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġin Ġinjection Ġshould Ġmulti Ġresolve Ġto Ġname , Ġfile , Ġtimes \\ [, Ġclass Ġname \\ ]$ ") ĊĠĠĠ Ġfun Ġreference In Injection Should Multi Resolve To ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Mult ire solve ( table ) Ġ{ Ġget Reference In Inject ed Language At Offset () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġmulti Ġresolve Ġto Ġname , Ġfile , Ġtimes \\ [, Ġclass Ġname \\ ]$ ") ĊĠĠĠ Ġfun Ġreference Should Multi Resolve To ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Mult ire solve ( table ) Ġ{ Ġget Reference At Offset () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Mult ire solve ( table : ĠDataTable , Ġref Provider : Ġ() Ġ-> ĠPsi Reference ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġref Provider () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Results Ġ= Ġmulti Resolve ( ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġraw Results . filter Ġ{ Ġit Ġ== Ġnull Ġ}. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġraw Results . filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresults . filter Ġ{ Ġit . containing File Ġ== Ġnull Ġ}. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion List Key 2 Ġ= Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Text ( result ) Ġto Ġresult . containing File . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġentry Ġ-> Ġentry . key Ġto Ġentry . value . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion List Key 3 Ġ= Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( item Text ( result ), Ġresult . java Class . simple Name , Ġresult . containing File . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġentry Ġ-> Ġentry . key Ġto Ġentry . value . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġtable . as Lists () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Refs Info Ġ= Ġcompletion List Key 3 . entries . join ToString ( separator Ġ= Ġ"\ n ") Ġ{ Ġ( name And File , Ġtimes ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| ${ name And File . first }| Ġ${ name And File . third } Ġ| Ġ$ times Ġ| Ġ${ name And File . second } Ġ| " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows . forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Times Ġ= Ġrow [ 2 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected ClassName Ġ= Ġif Ġ( row . size Ġ>= Ġ 4 ) Ġrow [ 3 ] Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( key , Ġactual Times ) Ġ= Ġif Ġ( expected ClassName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġrow [ 0 ] Ġto Ġrow [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto Ġcompletion List Key 2 . get OrDefault ( key , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠTrip le ( row [ 0 ], Ġexpected ClassName , Ġrow [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto Ġcompletion List Key 3 . get OrDefault ( key , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Times , Ġexpected Times , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ expected Times Ġbut Ġwas Ġ$ actual Times Ġoccurrences Ġof Ġ$ key ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠActual Ġrefs :\ n $ actual Refs Info \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġitem Text ( result : ĠPsi Element ): ĠString Ġ= Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPsi Named Element Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ result . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ"${ result . name } Ġ(${ result . text Range })" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult . text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ reference Ġshould Ġnot Ġmulti Ġresolve Ġto Ġfiles $ ") ĊĠĠĠ Ġfun Ġreference Should Not Multi Resolve To In ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġget Reference At Offset () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ref ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġmulti Resolve ( ref ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresults . filter Ġ{ Ġit Ġ== Ġnull Ġ}. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresults . filter Ġ{ Ġit !!. containing File Ġ== Ġnull Ġ}. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion List Ġ= Ġresults . map Ġ{ Ġit !!. containing File . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Refs Info Ġ= Ġresults . join ToString ( separator Ġ= Ġ"\ n ") Ġ{ el Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"| ${ el !!. containing File . name } Ġ| Ġ# Ġ${ Ġif Ġ( el Ġis ĠPsi Named Element ) Ġel . name Ġelse Ġel . text }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . asList (). forEach Ġ{ ĠfileName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ! in Ġcompletion List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġno Ġitems Ġfrom Ġ$ fileName Ġin Ġcompletion Ġlist ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠActual Ġrefs :\ n $ actual Refs Info \ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ When ("^ I Ġinvoke Ġauto completion Ġpopup $ ") ĊĠĠĠ Ġfun Ġi Invoke Auto completion Popup () Ġ{ ĊĠĠĠĠĠĠĠ ĠRegistry . get (" ide . completion . variant . limit "). setValue ( 1 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġdo Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ When ("^ I Ġinvoke Ġauto completion Ġpopup Ġ( \\ d +) Ġtimes $ ") ĊĠĠĠ Ġfun Ġi Invoke Auto completion Popup N Times ( invocation Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRegistry . get (" ide . completion . variant . limit "). setValue ( 1 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġdo Complete ( invocation Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshould Ġcontain :$ ") ĊĠĠĠ Ġfun Ġcompletion List Should Contain ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtable Ġformat : ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ| Ġitem Ġtext Ġ| Ġtail Ġtext Ġ| Ġtype Ġtext Ġ| ĊĠĠĠĠĠĠĠ Ġval Ġn Cols Ġ= Ġtable . width () ĊĠĠĠĠĠĠĠ Ġif Ġ( n Cols Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlookup Ġstrings : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Has Elements ( Sn ak em ake World . completion List (), Ġtable . column ( 0 ). toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġtable . as Lists (). map Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . join ToString ( separator Ġ= Ġ"| ", Ġprefix Ġ= Ġ"| ", Ġpostfix Ġ= Ġ"| ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠSn ak em ake World . completion List (). zip ( Sn ak em ake World . completion List Present ations ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( lookup String , Ġp ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ('| ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ( lookup String ) Ġ// XXX : Ġ' p . item Text ' Ġcould Ġbe Ġwrapped Ġin Ġextra Ġquotes Ġfor Ġsome Ġreason ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Cols Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ('| ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ( p . tail Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Cols Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ('| ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ( p . type Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . append ('| ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuff . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert Has Elements ( actual , Ġexpected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshould Ġbe Ġempty ") ĊĠĠĠ Ġfun Ġcompletion List ShouldBe Empty () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĠSn ak em ake World . completion List (). size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġitems : Ġ${ Sn ak em ake World . completion List (). take ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator ="\ n ") }\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshould Ġonly Ġcontain :$ ") ĊĠĠĠ Ġfun Ġcompletion List Should Only Contain ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompletion List Should Only Contain Methods ( table . asList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshould Ġonly Ġcontain Ġitems Ġ(. + )$ ") ĊĠĠĠ Ġfun Ġcompletion List Should Only Contain Methods ( lookup Items : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Has Only Elements ( Sn ak em ake World . completion List (), Ġlookup Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshould Ġcontain Ġthese Ġitems Ġwith Ġtype Ġtext :$ ") ĊĠĠĠ Ġfun Ġcompletion List Should Contain WithType Text ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Lookup Items Ġ= Ġget Completion List WithType Text () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Lookup Items Ġ= Ġtable . as Lists (). filter Ġ{ Ġit . size Ġ>= Ġ 2 Ġ}. map Ġ{ Ġit [ 0 ] Ġto Ġit [ 1 ] Ġ} ĊĠĠĠĠĠĠĠ Ġassert Has Elements ( actual Lookup Items , Ġexpected Lookup Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshould Ġcontain Ġitems Ġ(. + )$ ") ĊĠĠĠ Ġfun Ġcompletion List Should Contain Methods ( str : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlookup Items : ĠList < String > Ġ= Ġstr . split ("," ). map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠ Ġassert Has Elements ( Sn ak em ake World . completion List (), Ġlookup Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ completion Ġlist Ġshouldn 't Ġcontain :$ ") ĊĠĠĠ Ġfun Ġcompletion List Should Not Contain ( table : ĠDataTable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlookup Strings Ġ= Ġtable . asList () ĊĠĠĠĠĠĠĠ Ġassert NotIn Completion List ( Sn ak em ake World . completion List (), Ġlookup Strings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ I Ġinvoke Ġauto completion Ġpopup , Ġselect Ġ\" ([ ^\ "] +) \" Ġlookup Ġitem Ġand Ġsee Ġa Ġtext :") ĊĠĠĠ Ġfun Ġi Invoke Auto completion Popup And Select Item ( lookup Text : ĠString , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Complete And Check ( lookup Text , Ġtext , ĠLookup . NORMAL _ SELECT _ CHAR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ I Ġinvoke Ġauto completion Ġpopup Ġand Ġsee Ġa Ġtext :") ĊĠĠĠ Ġfun Ġi Invoke Auto completion Popup And Select No Item ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Complete And Check ( null , Ġtext , ĠLookup . NORMAL _ SELECT _ CHAR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Then ("^ I Ġinvoke Ġauto completion Ġpopup , Ġselect Ġ\" ([ ^\ "] +) \" Ġlookup Ġitem Ġin Ġ( normal | replace | statement | auto ) Ġmode Ġand Ġsee Ġa Ġtext :$ ") ĊĠĠĠ Ġfun Ġi Invoke Auto completion Popup And Select Item With Char ( lookup Text : ĠString , Ġmode : ĠString , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" normal " Ġ-> ĠLookup . NORMAL _ SELECT _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" replace " Ġ-> ĠLookup . REPLACE _ SELECT _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" statement " Ġ-> ĠLookup . COMPLETE _ STATE MENT _ SELECT _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto " Ġ-> ĠLookup . AUTO _ INSERT _ SELECT _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġmode : Ġ$ mode ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġauto Complete And Check ( lookup Text , Ġtext , Ġch ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauto Complete And Check ( lookup Text : ĠString ?, Ġtext : ĠString , Ġch : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi Invoke Auto completion Popup () ĊĊĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠSn ak em ake World . fixture () ĊĠĠĠĠĠĠĠ Ġval Ġlookup Elements Ġ= Ġfixture . lookup Elements ?. filter NotNull ()?. to Typed Array () ĊĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke And Wait ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lookup Text Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lookup Elements Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Auto completion Ġto Ġa Ġsingle Ġpossible Ġvariant Ġdidn 't Ġhappen Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" because Ġeither Ġthe Ġcompletion Ġlist Ġwas Ġnot Ġempty , Ġor Ġgiven Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" prefix Ġdidn 't Ġmatch Ġany Ġvariants . ĠLookup Ġelements : Ġ< ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Elements . join ToString Ġ{ Ġle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ le . lookup String } Ġ[ ${ le . psi Element ?. java Class ?. simple Name }] " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} >\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Elements , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Completion Ġresulted Ġin Ġa Ġsingle Ġpossible Ġvariant , Ġso Ġit Ġwas Ġimpossible Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġcheck Ġwhether Ġ\"$ lookup Text \" Ġwas Ġin Ġthe Ġcompletion Ġlist . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Try Ġusing Ġthis Ġstep : ĠThen ĠI Ġinvoke Ġauto completion Ġpopup Ġand Ġsee Ġa Ġtext " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( lookup Elements . isNotEmpty (), Ġmessage Ġ= Ġ" Completion Ġlist Ġwas Ġempty ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Item ( Lookup Filter . create ( lookup Text ). findElement ( lookup Elements ), Ġch , Ġfixture . project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclean Text Ġ= ĠString Util . convert Line Separ ators ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . replace ("\ ${ TEST _ DATA }", ĠFile Util . to System In dependent Name ( fixture . testData Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Completion Result ( fixture , Ġfalse , Ġclean Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/* ĊĠĠĠ Ġ@ When ("^ I Ġpress ĠEnter $ ") ĊĠĠĠ Ġfun Ġi Press Enter () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSn ak em ake World . fixture (). type ("") Ġ? ĊĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠSn ak em ake World . fixture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġfixture . project ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . perform Editor Action (" Editor Enter ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). execute Command ( project , Ġaction , Ġ" Snake Char m Test Cmd ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ When ("^ I Ġpress ĠSpace $ ") ĊĠĠĠ Ġfun Ġi Press Space () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSn ak em ake World . fixture (). type ("") Ġ? Ġ+ ĠApplication Manager . getApplication (). invoke And Wait ( Ġ.. ) ĊĠĠĠĠĠĠĠ ĠSw ing Utilities . invoke And Wait () Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠSw ing Utilities . invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ak em ake World . fixture (). type (' Ġ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġresolve ( ref : ĠPsi Reference ) Ġ= Ġwhen Ġ( ref ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPsi Poly Variant Reference Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġref . multi Resolve ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresults . size . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults [ 0 ]. element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġref . resolve () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmulti Resolve ( ref : ĠPsi Reference ) Ġ= Ġwhen Ġ( ref ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPsi Poly Variant Reference Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġref . multi Resolve ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( results . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . map Ġ{ Ġit . element } ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( ref . resolve ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Complete ( invocation Count : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠSn ak em ake World . fixture () ĊĠĠĠĠĠĠĠ Ġfixture . complete ( Completion Type . BASIC , Ġinvocation Count ) ĊĠĠĠĠĠĠĠ ĠSn ak em ake World . my Completion List Ġ= Ġfixture . lookup Element Strings ĊĠĠĠĠĠĠĠ ĠSn ak em ake World . my Completion List Present ations Ġ= Ġfixture . lookup Elements ?. map Ġ{ ĠTest Lookup Element Presentation . render Real ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Completion Items Presentation (): ĠList < Lookup Element Presentation > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠSn ak em ake World . fixture () ĊĠĠĠĠĠĠĠ Ġfixture . complete ( Completion Type . BASIC ) ĊĠĠĠĠĠĠĠ Ġval Ġcompletion List Ġ= Ġfixture . lookup Elements ĊĠĠĠĠĠĠĠ Ġreturn Ġcompletion List ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresentation Ġ= ĠLookup Element Presentation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit !!. render Element ( presentation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresentation ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Completion List WithType Text () Ġ= Ġget Completion Items Presentation (). map Ġ{ Ġit . item Text Ġto Ġit . type Text Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġassert Un resolved Reference ( ref : ĠPsi Reference ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPsi Poly Variant Reference Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġref . multi Resolve ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġresults . size . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġresults : Ġ${ results . join ToString ( separator = Ġ"\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . element ?. java Class ?. simple Name }: Ġ[ ${ it . element ?. text }] " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTestCase . assertNull ( ref . resolve ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert NotIn Completion List ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Lookup Items : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Missing Variants : ĠList < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlookup Elements Set Ġ= ĠHashSet ( actual Lookup Items ) ĊĠĠĠĠĠĠĠ Ġval Ġunexpected Variants Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( variant Ġin Ġexpected Missing Variants ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lookup Elements Set . contains ( variant )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunexpected Variants . add ( variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( unexpected Variants . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġorg . junit . Assert . fail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġfollowing Ġvariants Ġaren 't Ġexpected Ġin Ġcompletion Ġlist . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnexpected Ġvariants : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Use ful TestCase . toString ( unexpected Variants )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletion Ġlist : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Use ful TestCase . toString ( actual Lookup Items )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Completion Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture : ĠCode Insight TestFixture , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck By FilePath : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Result Text Or File RelativePath : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check By FilePath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . check Result By File ( completion Result Text Or File RelativePath ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . check Result ( completion Result Text Or File RelativePath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* private Ġfun Ġcheck Completion Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Filter : ĠLookup Filter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Elements : ĠArray < Lookup Element > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture : ĠCode Insight TestFixture , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck By FilePath : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Result Text Or File RelativePath : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Select Char : ĠChar ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġcompletion Ġlist Ġcontained Ġonly Ġone Ġvariant Ġcompletion Ġlist Ġwill Ġbe Ġclosed Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġvariant Ġwill Ġbe Ġautomatically Ġinserted ĊĠĠĠĠĠĠĠ Ġif Ġ( lookup Elements Ġ== Ġnull Ġ&& ĠLookup Manager . getInstance ( fixture . project ). active Lookup Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check By FilePath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . check Result By File ( completion Result Text Or File RelativePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . check Result ( completion Result Text Or File RelativePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġzero Ġor Ġseveral Ġvariants ĊĠĠĠĠĠĠĠ ĠassertNotNull ( lookup Elements , Ġmessage = Ġ" Well , Ġthis Ġassertion Ġhappened ") ĊĊĠĠĠĠĠĠĠ Ġselect Item ( lookup Filter . findElement ( lookup Elements ), Ġcompletion Select Char , Ġfixture . project ) ĊĠĠĠĠĠĠĠ Ġif Ġ( check By FilePath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . check Result By File ( completion Result Text Or File RelativePath ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixture . check Result ( completion Result Text Or File RelativePath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġprivate Ġfun Ġselect Item ( item : ĠLookup Element , Ġch : ĠChar , Ġproject : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlookup Ġ= ĠLookup Manager . getInstance ( project ). active Lookup Ġas ĠLookup Impl ? ĊĠĠĠĠĠĠĠ ĠassertNotNull ( lookup , Ġmessage Ġ= Ġ" Lookup Ġdidn 't Ġshow ") ĊĠĠĠĠĠĠĠ Ġlookup . currentItem Ġ= Ġitem ĊĠĠĠĠĠĠĠ ĠUI Util . invoke Later IfNeeded Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). execute Command ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , Ġ{ Ġlookup . finish Lookup ( ch ) Ġ}, Ġ"", Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Reference At Offset () Ġ= ĠSn ak em ake World . fixture () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. file . find Reference At ( get Offset Under Caret ()) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Reference In Inject ed Language At Offset (): ĠPsi Reference ? Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠSn ak em ake World . injection Fixture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġfixture . inject ed Element Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġfixture . inject ed Language Manager . get Injection Host ( element ) Ġas ĠPy StringLiteral Expression ? Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġget Offset Under Caret () Ġ- Ġ( host . stringValue Text Range . start Offset Ġ+ Ġhost . text Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . containing File ?. find Reference At ( offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Position By Signature ( editor : ĠEditor , Ġmarker : ĠString , Ġafter : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġeditor . document . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġtext . indexOf ( marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( pos Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Marker Ġ<$ marker > Ġnot Ġfound Ġin Ġ<$ text >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( pos Ġ== Ġtext . lastIndexOf ( marker )) Ġ{ Ġ" Multiple Ġmarker Ġentries " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( after ) Ġpos Ġ+ Ġmarker . length Ġelse Ġpos ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLookup Filter Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Lookup String : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy TypeString : ĠString ? Ċ ) Ġ: ĠCondition < Lookup Element > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġvalue ( lookup Element : ĠLookup Element ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaccept ( lookup Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaccept ( lookup Element : ĠLookup Element ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lookup Element Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpresentation Ġ= ĠLookup Element Presentation () ĊĠĠĠĠĠĠĠ Ġlookup Element . render Element ( presentation ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( my Lookup String Ġ!= Ġpresentation . item Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠString Util . isEmpty ( my TypeString ) Ġ|| Ġmy TypeString Ġ== Ġpresentation . type Text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Text : Ġ< " Ġ+ Ġmy Lookup String Ġ+ Ġ" >; ĠType Ġtext : Ġ< " Ġ+ Ġ( my TypeString Ġ?: Ġ" any ") Ġ+ Ġ" >" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Element ( lookup Elements : ĠArray < Lookup Element >): ĠLookup Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Elements Ġ= ĠContainer Util . filter ( lookup Elements , Ġthis ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Elements . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Dump Ġ= Ġdump Lookup Item ( lookup Elements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorg . junit . Assert . fail ( toString () Ġ+ Ġ" Ġ- Ġisn 't Ġin Ġauto completion Ġpopup , Ġall Ġelements :$ items Dump \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Elements . size Ġ> Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġgenerated Detailed Msg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Se veral Ġelements Ġwith Ġthe Ġsame Ġconditions : Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorg . junit . Assert . fail ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfiltered Elements [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerated Detailed Msg ( prefix : ĠString , Ġfiltered Elements : ĠList < Lookup Element >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠStringBuilder ("$ prefix \ n ĠFilter :${ toString () }\ n ") ĊĠĠĠĠĠĠĠ Ġfiltered Elements . forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror . append ("\ n Ġ- Ġ"). append ( dump Element ( element )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġerror . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdump Lookup Item ( lookup Elements : ĠArray < Lookup Element >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Dump Ġ= Ġlookup Elements . join ToString Ġ{ Ġlookup Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Present able Text Ġ= ĠLookup Element Presentation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlookup Element . render Element ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. item Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ lookup Element . lookup String } Ġ[$ item Present able Text ]" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġitems Dump ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( lookup String : ĠString ): ĠLookup Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLookup Filter ( lookup String , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( lookup String : ĠString , Ġtype String : ĠString ): ĠLookup Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLookup Filter ( lookup String , Ġtype String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdump Element ( element : ĠLookup Element ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" null Ġelement " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Presentation Ġ= ĠLookup Element Presentation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . render Element ( element Presentation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Text : Ġ\"" ). append ( element Presentation . item Text ). append ("\ "; Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Tail : Ġ\"" ). append ( element Presentation . tail Text ). append ("\ "; Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" Type : Ġ\"" ). append ( element Presentation . type Text ). append ("\ "; Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > Ġassert Has Elements ( ĊĠĠĠĠĠĠĠ Ġactual Lookup Items : ĠList < T >, ĊĠĠĠĠĠĠĠ Ġexpected Variants : ĠList < T > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġun met Elements Ġ= ĠArrayList < T >() ĊĊĠĠĠ Ġfor Ġ( variant Ġin Ġexpected Variants ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! actual Lookup Items . contains ( variant )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun met Elements . add ( variant ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( un met Elements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġorg . junit . Assert . fail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Not Ġall Ġelements Ġwere Ġfound Ġin Ġreal Ġcollection . ĠFollowing Ġelements Ġwere Ġmissed Ġ: [ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Use ful TestCase . toString ( un met Elements )} ] Ġin Ġcollection :[ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Use ful TestCase . toString ( actual Lookup Items )} ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġassert Has Only Elements ( ĊĠĠĠĠĠĠĠ Ġactual Lookup Items : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġexpected Variants : ĠList < String > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġextra Elements Ġ= ĠArrayList < String >() ĊĊĠĠĠ Ġfor Ġ( item Ġin Ġactual Lookup Items ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! expected Variants . contains ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Elements . add ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( extra Elements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġorg . junit . Assert . fail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Real Ġcollection Ġcontains Ġun wanted Ġelements . ĠFollowing Ġelements Ġwere Ġextra Ġ: [ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Use ful TestCase . toString ( extra Elements )} ] Ġin Ġcollection :[ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ Use ful TestCase . toString ( actual Lookup Items )} ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }