// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 Ġ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 Ġtraining . dsl Ċ Ċ import Ġcom . intellij . ide . util . tree View . Node Renderer Ċ import Ġcom . intellij . openapi . action System . Action Manager Ċ import Ġcom . intellij . openapi . action System . impl . ActionButton Ċ import Ġcom . intellij . openapi . application . invoke And Wait IfNeeded Ċ import Ġcom . intellij . openapi . wm . impl . Ide Frame Impl Ċ import Ġcom . intellij . ui . KeyStroke Adapter Ċ import Ġcom . intellij . ui . Mult iline Tree Cell Renderer Ċ import Ġcom . intellij . ui . Simple Colo red Component Ċ import Ġorg . fest . swing . core . GenericType Matcher Ċ import Ġorg . fest . swing . core . Robot Ċ import Ġorg . fest . swing . driver . Basic J List Cell Reader Ċ import Ġorg . fest . swing . driver . Component Driver Ċ import Ġorg . fest . swing . exception . Component Lookup Exception Ċ import Ġorg . fest . swing . exception . Wait Timed Out Error Ċ import Ġorg . fest . swing . fixture . Abstract Component Fixture Ċ import Ġorg . fest . swing . fixture . Container Fixture Ċ import Ġorg . fest . swing . fixture . JButton Fixture Ċ import Ġorg . fest . swing . fixture . J List Fixture Ċ import Ġorg . fest . swing . timing . Condition Ċ import Ġorg . fest . swing . timing . Pause Ċ import Ġorg . fest . swing . timing . Timeout Ċ import Ġtraining . ui . Learning Ui Util Ċ import Ġtraining . ui . Learning Ui Util . find Component WithTimeout Ċ import Ġtraining . util . invoke Action For Focus Context Ċ import Ġjava . awt . Component Ċ import Ġjava . awt . Container Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . swing . JButton Ċ import Ġjavax . swing . J Dialog Ċ import Ġjavax . swing . JLabel Ċ import Ġjavax . swing . J List Ċ Ċ @ Learning Dsl Ċ class ĠTask TestContext ( rt : ĠTask Runtime Context ) Ġ: ĠTask Runtime Context ( rt ) Ġ{ ĊĠ Ġprivate Ġval Ġdefault Timeout Ġ= ĠTimeout . timeout ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠ Ġval Ġrobot : ĠRobot Ġget () Ġ= ĠLearning Ui Util . robot ĊĊĠ Ġdata Ġclass ĠTest Script Properties ( ĊĠĠĠ Ġval Ġduration : ĠInt Ġ= Ġ 1 5 , Ġ// seconds ĊĠĠĠ Ġval Ġskip Testing : ĠBoolean Ġ= Ġfalse ĊĠ Ġ) ĊĊĠ Ġfun Ġtype ( text : ĠString ) Ġ{ ĊĠĠĠ Ġrobot . waitFor Idle () ĊĠĠĠ Ġfor Ġ( element Ġin Ġtext ) Ġ{ ĊĠĠĠĠĠ Ġrobot . type ( element ) ĊĠĠĠĠĠ ĠPause . pause ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠPause . pause ( 3 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠ Ġ} ĊĊĠ Ġfun Ġactions ( var arg Ġaction Ids : ĠString ) Ġ{ ĊĠĠĠ Ġfor Ġ( action Id Ġin Ġaction Ids ) Ġ{ ĊĠĠĠĠĠ Ġval Ġaction Ġ= ĠAction Manager . getInstance (). getAction ( action Id ) Ġ?: Ġerror (" Action Ġ$ action Id Ġis Ġnon Ġfound ") ĊĠĠĠĠĠ Ġinvoke Action For Focus Context ( action ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġide Frame ( action : ĠContainer Fixture < Ide Frame Impl >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġwith ( find Ide Frame ( robot , Ġdefault Timeout )) Ġ{ ĊĠĠĠĠĠ Ġaction () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ< ComponentType Ġ: ĠComponent > Ġwait Component ( component Class : ĠClass < ComponentType >, Ġpart Of Name : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ ĠLearning Ui Util . wait Until Found ( robot , Ġnull , Ġtype Matcher ( component Class ) Ġ{ ĊĠĠĠĠĠ Ġ( if Ġ( part Of Name Ġ!= Ġnull ) Ġit . java Class . name . contains ( part Of Name ) ĊĠĠĠĠĠ Ġelse Ġtrue ) Ġ&& Ġit . is Showing ĊĠĠĠ Ġ}, Ġdefault Timeout ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFinds Ġa ĠJ List Ġcomponent Ġin Ġhierarchy Ġof Ġcontext Ġcomponent Ġwith Ġa Ġcontaining Item Ġand Ġreturns ĠJ List Fixture . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ throws ĠComponent Lookup Exception Ġif Ġcomponent Ġhas Ġnot Ġbeen Ġfound Ġor Ġtimeout Ġexceeded ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< C Ġ: ĠContainer > ĠContainer Fixture < C >. j List ( containing Item : ĠString ? Ġ= Ġnull , Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout ): ĠJ List Fixture Ġ{ ĊĠĠĠ Ġreturn Ġgeneral List Finder ( timeout , Ġcontaining Item ) Ġ{ Ġelement , Ġp Ġ-> Ġelement Ġ== Ġp Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFinds Ġa ĠJButton Ġcomponent Ġin Ġhierarchy Ġof Ġcontext Ġcomponent Ġwith Ġa Ġname Ġand Ġreturns ĠExtended Button Fixture . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ throws ĠComponent Lookup Exception Ġif Ġcomponent Ġhas Ġnot Ġbeen Ġfound Ġor Ġtimeout Ġexceeded ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< C Ġ: ĠContainer > ĠContainer Fixture < C >. button ( name : ĠString , Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout ): ĠJButton Fixture Ġ{ ĊĠĠĠ Ġval ĠjButton : ĠJButton Ġ= Ġfind Component WithTimeout ( timeout ) Ġ{ Ġit . is Showing Ġ&& Ġit . isVisible Ġ&& Ġit . text Ġ== Ġname Ġ} ĊĠĠĠ Ġreturn ĠJButton Fixture ( robot (), ĠjButton ) ĊĠ Ġ} ĊĊĠ Ġfun Ġ< C Ġ: ĠContainer > ĠContainer Fixture < C >. action Button ( action Name : ĠString , Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout ) ĊĠĠĠ Ġ: ĠAbstract Component Fixture < *, ĠAction Button , ĠComponent Driver <* >> Ġ{ ĊĠĠĠ Ġval Ġaction Button : ĠAction Button Ġ= Ġfind Component WithTimeout ( timeout ) Ġ{ ĊĠĠĠĠĠ Ġit . is Showing Ġ&& Ġit . isEnabled Ġ&& Ġaction Name Ġ== Ġit . action . template Presentation . text ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠAction Button Fixture ( robot (), Ġaction Button ) ĊĠ Ġ} ĊĊĠ Ġ// ĠModified Ġcopy - paste ĊĠ Ġfun Ġ< C Ġ: ĠContainer > ĠContainer Fixture < C >. j List Contains ( part Of Item : ĠString ? Ġ= Ġnull , Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout ): ĠJ List Fixture Ġ{ ĊĠĠĠ Ġreturn Ġgeneral List Finder ( timeout , Ġpart Of Item ) Ġ{ Ġelement , Ġp Ġ-> Ġelement . contains ( p ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFinds ĠJ Dialog Ġwith Ġa Ġspecific Ġtitle Ġ( if Ġtitle Ġis Ġnull Ġshowing Ġdialog Ġshould Ġbe Ġonly Ġone ) Ġand Ġreturns Ġcreated ĠJ Dialog Fixture ĊĠĠ Ġ*/ ĊĠ Ġfun Ġdialog ( title : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Case Title : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate : Ġ( String , ĠString ) Ġ-> ĠBoolean Ġ= Ġ{ Ġfound : ĠString , Ġwanted : ĠString Ġ-> Ġfound Ġ== Ġwanted Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc : ĠContainer Fixture < J Dialog >. () Ġ-> ĠUnit Ġ= Ġ{}) ĊĠĠĠ Ġ: ĠAbstract Component Fixture < *, ĠJ Dialog , ĠComponent Driver <* >> Ġ{ ĊĠĠĠ Ġval Ġj Dialog Fixture Ġ= Ġif Ġ( title Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġj Dialog Ġ= ĠLearning Ui Util . wait Until Found ( robot , Ġnull , Ġtype Matcher ( J Dialog :: class . java ) Ġ{ Ġtrue Ġ}, Ġtimeout ) ĊĠĠĠĠĠ ĠJ Dialog Fixture ( robot , Ġj Dialog ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġwith Pause When Null ( timeout Ġ= Ġtimeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġall Matched Dialog s Ġ= Ġrobot . finder (). findAll ( type Matcher ( J Dialog :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Focused Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore Case Title ) Ġpredicate ( it . title . toLowerCase (), Ġtitle . toLowerCase ()) Ġelse Ġpredicate ( it . title , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠ Ġ}). filter Ġ{ Ġit . is Showing Ġ&& Ġit . isEnabled Ġ&& Ġit . isVisible Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Matched Dialog s . size Ġ> Ġ 1 ) Ġthrow ĠException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġmore Ġthan Ġone Ġ(${ all Matched Dialog s . size }) Ġdialog s Ġmatched Ġtitle Ġ\"$ title \" ") ĊĠĠĠĠĠĠĠĠĠ Ġall Matched Dialog s . first OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠJ Dialog Fixture ( robot , Ġdialog ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( timeout Error : ĠWait Timed Out Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠComponent Lookup Exception (" Timeout Ġerror Ġfor Ġfinding ĠJ Dialog Ġby Ġtitle Ġ\"$ title \" Ġfor Ġ${ timeout . duration () }") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfunc ( j Dialog Fixture ) ĊĠĠĠ Ġreturn Ġj Dialog Fixture ĊĠ Ġ} ĊĊĠ Ġfun ĠContainer Fixture <* >. j Component ( target : ĠComponent ): ĠAbstract Component Fixture < *, ĠComponent , ĠComponent Driver <* >> Ġ{ ĊĠĠĠ Ġreturn ĠSimple Component Fixture ( robot (), Ġtarget ) ĊĠ Ġ} ĊĊĠ Ġfun Ġinvoke Action Via Shortcut ( shortcut : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġkey Stroke Ġ= ĠKey Stroke Adapter . getKey Stroke ( shortcut ) ĊĠĠĠ Ġrobot . press And Release Key ( key Stroke . keyCode , Ġkey Stroke . modifiers ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġin Test Mode : ĠBoolean Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġ// //////// // ------------------------------ ĊĠ Ġprivate Ġfun Ġ< C Ġ: ĠContainer > ĠContainer Fixture < C >. general List Finder ( timeout : ĠTimeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Item : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate : Ġ( String , ĠString ) Ġ-> ĠBoolean ): ĠJ List Fixture Ġ{ ĊĠĠĠ Ġval Ġext Cell Reader Ġ= ĠExtended J List Cell Reader () ĊĠĠĠ Ġval Ġmy J List : ĠJ List < *> Ġ= Ġfind Component WithTimeout ( timeout ) Ġ{ Ġj List : ĠJ List < *> Ġ-> ĊĠĠĠĠĠ Ġif Ġ( containing Item Ġ== Ġnull ) Ġtrue Ġ// if Ġwere Ġsearching Ġfor Ġany Ġj List () ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġ( 0 Ġuntil Ġj List . model . size ). map NotNull Ġ{ Ġext Cell Reader . value At ( j List , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġelements . any Ġ{ Ġpredicate ( it , Ġcontaining Item ) Ġ} Ġ&& Ġj List . is Showing ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġj List Fixture Ġ= ĠJ List Fixture ( robot (), Ġmy J List ) ĊĠĠĠ Ġj List Fixture . replace Cell Reader ( ext Cell Reader ) ĊĠĠĠ Ġreturn Ġj List Fixture ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġwaits Ġfor Ġ Ġ[ timeout ] Ġwhen Ġfunction Probe To Null () Ġnot Ġreturn Ġnull ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ throws ĠWait Timed Out Error Ġwith Ġthe Ġtext : Ġ" Timed Ġout Ġwaiting Ġfor Ġ$ timeout Ġsecond ( s ) Ġuntil Ġ{@ code Ġcondition Text } Ġwill Ġbe Ġnot Ġnull " ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġ< ReturnType > Ġwith Pause When Null ( condition Text : ĠString Ġ= Ġ" function Ġto Ġprobe ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Probe To Null : Ġ() Ġ-> ĠReturn Type ?): ĠReturn Type Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠReturn Type ? Ġ= Ġnull ĊĠĠĠ Ġwait Until ("$ condition Text Ġwill Ġbe Ġnot Ġnull ", Ġtimeout ) Ġ{ ĊĠĠĠĠĠ Ġresult Ġ= Ġfunction Probe To Null () ĊĠĠĠĠĠ Ġresult Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult !! ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwait Until ( condition : ĠString , Ġtimeout : ĠTimeout Ġ= Ġdefault Timeout , Ġconditional Function : Ġ() Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ ĠPause . pause ( object Ġ: ĠCondition ("${ timeout . duration ()} Ġuntil Ġ$ condition ") Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġtest () Ġ= Ġconditional Function () ĊĠĠĠ Ġ}, Ġtimeout ) ĊĠ Ġ} ĊĊĊĠ Ġprivate Ġclass ĠSimple Component Fixture ( robot : ĠRobot , Ġtarget : ĠComponent ) Ġ: ĊĠĠĠ ĠComponent Fixture < Simple Component Fixture , ĠComponent >( Simple Component Fixture :: class . java , Ġrobot , Ġtarget ) ĊĊĊĠ Ġprivate Ġfun Ġ< ComponentType Ġ: ĠComponent ?> Ġtype Matcher ( component Type Class : ĠClass < ComponentType >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher : Ġ( ComponentType ) Ġ-> ĠBoolean ): ĠGeneric Type Matcher < ComponentType > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠGeneric Type Matcher < ComponentType >( component Type Class ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġis Matching ( component : ĠComponent Type ): ĠBoolean Ġ= Ġmatcher ( component ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠgetValue With Cell Renderer ( cell Renderer Component : ĠComponent , Ġis Extended : ĠBoolean Ġ= Ġtrue ): ĠString ? Ġ{ ĊĠ Ġval Ġresult Ġ= Ġwhen Ġ( cell Renderer Component ) Ġ{ ĊĠĠĠ Ġis ĠJLabel Ġ-> Ġcell Renderer Component . text ĊĠĠĠ Ġis ĠNode Renderer Ġ-> Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Extended ) Ġcell Renderer Component . getFull Text () ĊĠĠĠĠĠ Ġelse Ġcell Renderer Component . getFirst Text () ĊĠĠĠ Ġ} Ġ// should Ġstand Ġbefore ĠSimple Colo red Component Ġbecause Ġit Ġis Ġmore Ġspecific ĊĠĠĠ Ġis ĠSimple Colo red Component Ġ-> Ġcell Renderer Component . getFull Text () ĊĠĠĠ Ġis ĠMult iline Tree Cell Renderer Ġ-> Ġcell Renderer Component . text ĊĠĠĠ Ġelse Ġ-> Ġcell Renderer Component . find Text () ĊĠ Ġ} ĊĠ Ġreturn Ġresult ?. trim End () Ċ } ĊĊ Ċ private Ġclass ĠExtended J List Cell Reader Ġ: ĠBasic J List Cell Reader () Ġ{ ĊĠ Ġoverride Ġfun Ġvalue At ( list : ĠJ List <* >, Ġindex : ĠInt ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġelement Ġ= Ġlist . model . getElement At ( index ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġval Ġcell Renderer Component Ġ= Ġ( list Ġas ĠJ List < Any >). cell Renderer ĊĠĠĠĠĠ Ġ. getList Cell Renderer Component ( list , Ġelement , Ġindex , Ġtrue , Ġtrue ) ĊĠĠĠ Ġreturn ĠgetValue With Cell Renderer ( cell Renderer Component ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠSimple Colo red Component . getFull Text (): ĠString Ġ{ ĊĠ Ġreturn Ġinvoke And Wait IfNeeded Ġ{ ĊĠĠĠ Ġthis . get CharSequence ( false ). toString () ĊĠ Ġ} Ċ } ĊĊ Ċ private Ġfun ĠSimple Colo red Component . getFirst Text (): ĠString Ġ{ ĊĠ Ġreturn Ġinvoke And Wait IfNeeded Ġ{ ĊĠĠĠ Ġthis . get CharSequence ( true ). toString () ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠComponent . find Text (): ĠString ? Ġ{ ĊĠ Ġtry Ġ{ ĊĠĠĠ Ġassert ( this Ġis ĠContainer ) ĊĠĠĠ Ġval Ġcontainer Ġ= Ġthis Ġas ĠContainer ĊĠĠĠ Ġval Ġresult List Ġ= ĠArrayList < String >() ĊĠĠĠ Ġresult List . addAll ( ĊĠĠĠĠĠ ĠfindAll With B FS ( container , ĠJLabel :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . text . isNull OrEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . text Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ) ĊĠĠĠ Ġresult List . addAll ( ĊĠĠĠĠĠ ĠfindAll With B FS ( container , ĠSimple Colo red Component :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . getFull Text (). isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . getFull Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġresult List . first OrNull Ġ{ Ġit . isNotEmpty () Ġ} ĊĠ Ġ} ĊĠ Ġcatch Ġ( ignored : ĠComponent Lookup Exception ) Ġ{ ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< ComponentType Ġ: ĠComponent > ĠfindAll With B FS ( container : ĠContainer , Ġclazz : ĠClass < ComponentType >): ĠList < ComponentType > Ġ{ ĊĠ Ġval Ġresult Ġ= ĠLinkedList < ComponentType >() ĊĠ Ġval Ġqueue : ĠQueue < Component > Ġ= ĠLinkedList () ĊĊĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠ Ġfun Ġcheck ( container : ĠComponent ) Ġ{ ĊĠĠĠ Ġif Ġ( clazz . is Instance ( container )) Ġresult . add ( container Ġas ĠComponent Type ) ĊĠ Ġ} ĊĊĠ Ġqueue . add ( container ) ĊĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠ Ġval Ġpol led Ġ= Ġqueue . poll () ĊĠĠĠ Ġcheck ( pol led ) ĊĠĠĠ Ġif Ġ( pol led Ġis ĠContainer ) ĊĠĠĠĠĠ Ġqueue . addAll ( pol led . components ) ĊĠ Ġ} ĊĊĠ Ġreturn Ġresult Ċ Ċ } Ċ Ċ private Ġopen Ġclass ĠComponent Fixture < S , ĠC Ġ: ĠComponent >( self Type : ĠClass < S >, Ġrobot : ĠRobot , Ġtarget : ĠC ) ĊĠ Ġ: ĠAbstract Component Fixture < S , ĠC , ĠComponent Driver < *> >( self Type , Ġrobot , Ġtarget ) Ġ{ ĊĊĠ Ġoverride Ġfun Ġcreate Driver ( robot : ĠRobot ): ĠComponent Driver < *> Ġ{ ĊĠĠĠ Ġreturn ĠComponent Driver < Component >( robot ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠAction Button Fixture ( robot : ĠRobot , Ġtarget : ĠAction Button ) Ġ: ĊĠ ĠComponent Fixture < ActionButton Fixture , ĠAction Button >( ActionButton Fixture :: class . java , Ġrobot , Ġtarget ), ĠContainer Fixture < ActionButton > Ċ Ċ private Ġclass ĠIde Frame Fixture ( robot : ĠRobot , Ġtarget : ĠIde Frame Impl ) ĊĠ Ġ: ĠComponent Fixture < Ide Frame Fixture , ĠIde Frame Impl >( Ide Frame Fixture :: class . java , Ġrobot , Ġtarget ), ĠContainer Fixture < Ide Frame Impl > Ċ Ċ private Ġclass ĠJ Dialog Fixture ( robot : ĠRobot , Ġj Dialog : ĠJ Dialog ) Ġ: ĊĠ ĠComponent Fixture < J Dialog Fixture , ĠJ Dialog >( J Dialog Fixture :: class . java , Ġrobot , Ġj Dialog ), ĠContainer Fixture < J Dialog > Ċ Ċ private Ġfun Ġfind Ide Frame ( robot : ĠRobot , Ġtimeout : ĠTimeout ): ĠIde Frame Fixture Ġ{ ĊĠ Ġval Ġmatcher : ĠGeneric Type Matcher < Ide Frame Impl > Ġ= Ġobject Ġ: ĠGeneric Type Matcher < Ide Frame Impl >( ĊĠĠĠ ĠIde Frame Impl :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis Matching ( frame : ĠIde Frame Impl ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġframe . is Showing ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġtry Ġ{ ĊĠĠĠ ĠPause . pause ( object Ġ: ĠCondition (" Ide Frame Ġto Ġshow Ġup ") Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġtest (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! robot . finder (). findAll ( matcher ). isEmpty () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, Ġtimeout ) ĊĠĠĠ Ġval Ġide Frame Ġ= Ġrobot . finder (). find ( matcher ) ĊĠĠĠ ĠIde Frame Fixture ( robot , Ġide Frame ) ĊĠ Ġ} ĊĠ Ġcatch Ġ( timed Out Error : ĠWait Timed Out Error ) Ġ{ ĊĠĠĠ Ġthrow ĠComponent Lookup Exception (" Unable Ġto Ġfind ĠIde Frame Ġin Ġ" Ġ+ Ġtimeout . duration ()) ĊĠ Ġ} Ċ } Ċ