@ file : Suppress (" FunctionName ") Ċ Ċ package Ġcom . github . mv ys ny . k ari but esting . v 1 0 Ċ Ċ import Ġcom . vaadin . flow . component . Component Ċ import Ġcom . vaadin . flow . component . Has Style Ċ import Ġcom . vaadin . flow . component . HasValue Ċ import Ġcom . vaadin . flow . component . UI Ċ import Ġcom . vaadin . flow . component . grid . Grid Ċ import Ġcom . vaadin . flow . component . polymer template . Pol ymer Template Ċ import Ġcom . vaadin . flow . router . InternalServerError Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Predicate Ċ import Ġkotlin . streams . toList Ċ Ċ /** Ċ Ġ* ĠA Ġcriterion Ġfor Ġmatching Ġcomponents . ĠThe Ġcomponent Ġmust Ġmatch Ġall Ġof Ġnon - null Ġfields . Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġadd Ġmore Ġproperties , Ġsimply Ġby Ġcreating Ġa Ġwrite - only Ġproperty Ġwhich Ġwill Ġregister Ġa Ġnew Ġ[ predicate ] Ġon Ġwrite . ĠSee Ċ Ġ* Ġ[ Adding Ġsupport Ġfor Ġcustom Ġsearch Ġcriteria ]( https :// github . com / mv ys ny / k ari bu - testing / tree / master / k ari bu - testing - v 1 0 # adding - support - for - custom - search - criteria ) Ċ Ġ* Ġfor Ġmore Ġdetails . Ċ Ġ* Ġ@ property Ġclazz Ġthe Ġclass Ġof Ġthe Ġcomponent Ġwe Ġare Ġsearching Ġfor . Ċ Ġ* Ġ@ property Ġid Ġthe Ġrequired Ġ[ Component . getId ]; Ġif Ġnull , Ġno Ġparticular Ġid Ġis Ġmatched . Ċ Ġ* Ġ@ property Ġcaption Ġthe Ġrequired Ġ[ Component . caption ]; Ġif Ġnull , Ġno Ġparticular Ġcaption Ġis Ġmatched . Ċ Ġ* Ġ@ property Ġplaceholder Ġthe Ġrequired Ġ[ Component . placeholder ]; Ġif Ġnull , Ġno Ġparticular Ġplaceholder Ġis Ġmatched . Ċ Ġ* Ġ@ property Ġtext Ġthe Ġ[ com . vaadin . flow . dom . Element . getText ] Ċ Ġ* Ġ@ property Ġcount Ġexpected Ġcount Ġof Ġmatching Ġcomponents , Ġdefaults Ġto Ġ` 0 .. Int . MAX _ VALUE ` Ċ Ġ* Ġ@ property Ġvalue Ġexpected Ġ[ com . vaadin . flow . component . HasValue . getValue ]; Ġif Ġ` null `, Ġno Ġparticular Ġvalue Ġis Ġmatched . Ċ Ġ* Ġ@ property Ġclasses Ġif Ġnot Ġnull , Ġthe Ġcomponent Ġmust Ġmatch Ġall Ġof Ġthese Ġclass Ġnames . ĠSpace - separated . Ċ Ġ* Ġ@ property Ġwithout Classes Ġif Ġnot Ġnull , Ġthe Ġcomponent Ġmust ĠNOT Ġmatch Ġany Ġof Ġthese Ġclass Ġnames . ĠSpace - separated . Ċ Ġ* Ġ@ property Ġpredicates Ġthe Ġpredicates Ġthe Ġcomponent Ġneeds Ġto Ġmatch , Ġnot Ġnull . ĠMay Ġbe Ġempty Ġ- Ġin Ġsuch Ġcase Ġit Ġis Ġignored . ĠBy Ġdefault Ġempty . Ċ Ġ*/ Ċ class ĠSearch Spec < T Ġ: ĠComponent >( ĊĠĠĠ Ġval Ġclazz : ĠClass < T >, ĊĠĠĠ Ġvar Ġid : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġcaption : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġplaceholder : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġtext : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġcount : ĠInt Range Ġ= Ġ 0 .. Int . MAX _ VALUE , ĊĠĠĠ Ġvar Ġvalue : ĠAny ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġclasses : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġwithout Classes : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġpredicates : ĠMutable List < Predicate < T >> Ġ= Ġmutable ListOf () Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < String >( if Ġ( clazz . simple Name . isBlank ()) Ġclazz . name Ġelse Ġclazz . simple Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġlist . add (" id ='$ id '") ĊĠĠĠĠĠĠĠ Ġif Ġ( caption Ġ!= Ġnull ) Ġlist . add (" caption ='$ caption '") ĊĠĠĠĠĠĠĠ Ġif Ġ( placeholder Ġ!= Ġnull ) Ġlist . add (" placeholder ='$ placeholder '") ĊĠĠĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull ) Ġlist . add (" text ='$ text '") ĊĠĠĠĠĠĠĠ Ġif Ġ(! classes . isNull Or Blank ()) Ġlist . add (" classes ='$ classes '") ĊĠĠĠĠĠĠĠ Ġif Ġ(! without Classes . isNull Or Blank ()) Ġlist . add (" without Classes ='$ without Classes '") ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġlist . add (" value =$ value ") ĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ!= Ġ( 0 .. Int . MAX _ VALUE ) Ġ&& Ġcount Ġ!= Ġ 1 .. 1 ) Ġlist . add (" count =$ count ") ĊĠĠĠĠĠĠĠ Ġlist . addAll ( predicates . map Ġ{ Ġit . toString () Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . join ToString (" Ġand Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġpredicate Ġwhich Ġmatches Ġcomponents Ġbased Ġon Ġthis Ġspec . ĠAll Ġrules Ġare Ġmatched Ġexcept Ġthe Ġ[ count ] Ġrule . ĠThe ĊĠĠĠĠ Ġ* Ġrules Ġare Ġmatched Ġagainst Ġgiven Ġcomponent Ġonly Ġ( not Ġagainst Ġits Ġchildren ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġto Predicate (): Ġ( Component ) Ġ-> ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġmutable ListOf <( Component )-> Boolean >() ĊĠĠĠĠĠĠĠ Ġp . add Ġ{ Ġcomponent Ġ-> Ġclazz . is Instance ( component )} ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġp . add Ġ{ Ġcomponent Ġ-> Ġcomponent . id _ Ġ== Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( caption Ġ!= Ġnull ) Ġp . add Ġ{ Ġcomponent Ġ-> Ġcomponent . caption Ġ== Ġcaption Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( placeholder Ġ!= Ġnull ) Ġp . add Ġ{ Ġcomponent Ġ-> Ġcomponent . placeholder Ġ== Ġplaceholder Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! classes . isNull Or Blank ()) Ġp . add Ġ{ Ġcomponent Ġ-> Ġcomponent . has All Classes ( classes !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! without Classes . isNull Or Blank ()) Ġp . add Ġ{ Ġcomponent Ġ-> Ġcomponent . does nt Have Any Classes ( without Classes !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull ) Ġp . add Ġ{ Ġcomponent Ġ-> Ġcomponent . element . text Ġ== Ġtext Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġp . add Ġ{ Ġcomponent Ġ-> Ġ( component Ġas ? ĠHas Value < *, Ġ* >) ?. getValue () Ġ== Ġvalue Ġ} ĊĠĠĠĠĠĠĠ Ġp . addAll ( predicates . map Ġ{ Ġpredicate Ġ-> Ġ{ Ġcomponent : ĠComponent Ġ-> Ġclazz . is Instance ( component ) Ġ&& Ġpredicate . test ( component Ġas ĠT ) Ġ} Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġp . and () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠIterable < String ?> . filter NotBlank (): ĠList < String > Ġ= Ġfilter NotNull (). filter Ġ{ Ġit . isNotBlank () Ġ} Ċ Ċ private Ġfun ĠComponent . has All Classes ( classes : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( classes . contains (' Ġ')) Ġreturn Ġclasses . split (' Ġ'). filter NotBlank (). all Ġ{ Ġhas All Classes ( it ) Ġ} ĊĠĠĠ Ġif Ġ( this Ġ! is ĠHas Style ) Ġreturn Ġfalse ĊĠĠĠ Ġreturn ĠclassNames . contains ( classes ) Ċ } Ċ private Ġfun ĠComponent . does nt Have Any Classes ( classes : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( classes . contains (' Ġ')) Ġreturn Ġclasses . split (' Ġ'). filter NotBlank (). all Ġ{ Ġ! has All Classes ( it ) Ġ} ĊĠĠĠ Ġif Ġ( this Ġ! is ĠHas Style ) Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġ! class Names . contains ( classes ) Ċ } Ċ Ċ /** Ċ Ġ* ĠFinds Ġa ĠVIS IBLE Ġcomponent Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġgiven Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġsearch Ġspecification Ċ Ġ* Ġ@ return Ġthe Ġonly Ġmatching Ġcomponent , Ġnever Ġnull . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġcomponent Ġmatched , Ġor Ġif Ġmore Ġthan Ġone Ġcomponent Ġmatches . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT : ĠComponent > ĠComponent ._ get ( no inline Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠT Ġ= Ġthis ._ get ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠFinds Ġa ĠVIS IBLE Ġcomponent Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġgiven Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ param Ġclazz Ġthe Ġcomponent Ġmust Ġbe Ġof Ġthis Ġclass . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġsearch Ġspecification Ċ Ġ* Ġ@ return Ġthe Ġonly Ġmatching Ġcomponent , Ġnever Ġnull . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġcomponent Ġmatched , Ġor Ġif Ġmore Ġthan Ġone Ġcomponent Ġmatches . Ċ Ġ*/ Ċ fun Ġ< T : ĠComponent > ĠComponent ._ get ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠT Ġ{ ĊĠĠĠ Ġval Ġresult : ĠList < T > Ġ= Ġ_ find ( clazz ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 1 .. 1 ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġcheck ( count Ġ== Ġ 1 .. 1 ) Ġ{ Ġ" You 're Ġcalling Ġ_ get Ġwhich Ġis Ġsupposed Ġto Ġreturn Ġexactly Ġ 1 Ġcomponent , Ġyet Ġyou Ġtried Ġto Ġspecify Ġthe Ġcount Ġof Ġ$ count " Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġclazz . cast ( result . single ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠFinds Ġa ĠVIS IBLE Ġcomponent Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġgiven Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ return Ġthe Ġonly Ġmatching Ġcomponent , Ġnever Ġnull . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġcomponent Ġmatched , Ġor Ġif Ġmore Ġthan Ġone Ġcomponent Ġmatches . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT : ĠComponent > Ġ_ get ( no inline Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠT Ġ= ĊĠĠĠ Ġ_ get ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠFinds Ġa ĠVIS IBLE Ġcomponent Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġgiven Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ param Ġclazz Ġthe Ġcomponent Ġmust Ġbe Ġof Ġthis Ġclass . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġsearch Ġspecification Ċ Ġ* Ġ@ return Ġthe Ġonly Ġmatching Ġcomponent , Ġnever Ġnull . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġcomponent Ġmatched , Ġor Ġif Ġmore Ġthan Ġone Ġcomponent Ġmatches . Ċ Ġ*/ Ċ fun Ġ< T : ĠComponent > Ġ_ get ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠT Ġ= ĠUI . getCurrent (). _ get ( clazz , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠFinds Ġa Ġlist Ġof ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġmatching Ġcomponents , Ġmay Ġbe Ġempty . Ċ Ġ*/ Ċ fun Ġ< T : ĠComponent > ĠComponent ._ find ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġspec : ĠSearch Spec < T > Ġ= ĠSearch Spec ( clazz ) ĊĠĠĠ Ġspec . block () ĊĠĠĠ Ġval Ġresult : ĠList < Component > Ġ= Ġfind ( spec . to Predicate ()) ĊĠĠĠ Ġif Ġ( result . size Ġ! in Ġspec . count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġloc : ĠString Ġ= Ġcurrent Path Ġ?: Ġ" ?" ĊĠĠĠĠĠĠĠ Ġvar Ġmessage : ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . isEmpty () Ġ-> Ġ"/ $ loc : ĠNo Ġvisible Ġ${ clazz . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . size Ġ< Ġspec . count . first Ġ-> Ġ"/ $ loc : ĠToo Ġfew Ġ(${ result . size }) Ġvisible Ġ${ clazz . simple Name } s " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"/ $ loc : ĠToo Ġmany Ġvisible Ġ${ clazz . simple Name } s Ġ(${ result . size })" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"$ message Ġin Ġ${ to Pretty String ()} Ġmatching Ġ$ spec : Ġ[ ${ result . join ToString Ġ{ Ġit . to Pretty String () Ġ}} ]. ĠComponent Ġtree :\ n ${ to Pretty Tree () }" ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthere 's Ġa ĠPol ymer Template , Ġwarn Ġthat ĠK ari bu - Testing Ġcan 't Ġreally Ġlocate Ġcomponents Ġin Ġthere : ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / mv ys ny / k ari bu - testing / tree / master / k ari bu - testing - v 1 0 # polymer - templates ĊĠĠĠĠĠĠĠ Ġ// Ġfixes Ġhttps :// github . com / mv ys ny / k ari bu - testing / issues / 3 5 ĊĠĠĠĠĠĠĠ Ġval Ġhas Pol ymer Templates : ĠBoolean Ġ= Ġwalk (). any Ġ{ Ġit Ġis ĠPol ymer Template < *> Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Pol ymer Templates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"$ message \ n Warning : ĠK ari bu - Testing Ġis Ġnot Ġable Ġto Ġlook Ġup Ġcomponents Ġfrom Ġinside Ġof ĠPol ymer Template . ĠPlease Ġsee Ġhttps :// github . com / mv ys ny / k ari bu - testing / tree / master / k ari bu - testing - v 1 0 # polymer - templates Ġfor Ġmore Ġdetails ." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġfind () Ġused Ġto Ġfail Ġwith ĠIllegalArgumentException Ġwhich Ġmakes Ġsense Ġfor Ġa Ġgeneral - purpose Ġutility Ġmethod . ĠHowever , ĊĠĠĠĠĠĠĠ Ġ// Ġsince Ġfind () Ġis Ġused Ġin Ġtests Ġover w hel ming ly , Ġnot Ġfinding Ġthe Ġcorrect Ġset Ġof Ġcomponents Ġis Ġgenerally Ġtreated Ġas Ġan Ġassertion Ġerror . ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( message ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult . filter Is Instance ( clazz ) Ċ } Ċ Ċ /** Ċ Ġ* ĠFinds Ġa Ġlist Ġof ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġmatching Ġcomponents , Ġmay Ġbe Ġempty . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT : ĠComponent > ĠComponent ._ find ( no inline Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠList < T > Ġ= Ġthis ._ find ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠFinds Ġa Ġlist Ġof ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġgiven Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġsearch Ġspecification Ċ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġmatching Ġcomponents , Ġmay Ġbe Ġempty . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT : ĠComponent > Ġ_ find ( no inline Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠList < T > Ġ= ĊĠĠĠ Ġ_ find ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠFinds Ġa Ġlist Ġof ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġmatching Ġcomponents , Ġmay Ġbe Ġempty . Ċ Ġ*/ Ċ fun Ġ< T : ĠComponent > Ġ_ find ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ ĠUI . getCurrent (). _ find ( clazz , Ġblock ) Ċ Ċ private Ġfun ĠComponent . find ( predicate : Ġ( Component )-> Boolean ): ĠList < Component > Ġ{ ĊĠĠĠ Ġtesting Lifecycle Hook . await Before Lookup () ĊĠĠĠ Ġval Ġdesc endants : ĠList < Component > Ġ= Ġwalk (). toList () ĊĠĠĠ Ġtesting Lifecycle Hook . await After Lookup () ĊĠĠĠ Ġval Ġerror : ĠInternal ServerError ? Ġ= Ġdesc endants . filter Is Instance < InternalServerError >(). first OrNull () ĊĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" An Ġinternal Ġserver Ġerror Ġoccurred ; Ġplease Ġcheck Ġlog Ġfor Ġthe Ġactual Ġstack - trace . ĠError Ġtext : Ġ${ error . element . text }\ n ${ UI . getCurrent (). to Pretty Tree () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdesc endants . filter Ġ{ Ġit . is Effect ively Visible () Ġ&& Ġpredicate ( it ) Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T : ĠComponent > ĠIterable <( T )-> Boolean >. and (): Ġ( T )-> Boolean Ġ= Ġ{ Ġcomponent Ġ-> Ġall Ġ{ Ġit ( component ) Ġ} Ġ} Ċ Ċ /** Ċ Ġ* ĠWalk s Ġthe Ġchild Ġtree , Ġpre order Ġdepth - first : Ġfirst Ġthe Ġnode , Ġthen Ġits Ġdesc endants , Ċ Ġ* Ġthen Ġits Ġnext Ġsibling . Ċ Ġ*/ Ċ internal Ġclass ĠPre order Tree Iterator < out ĠT >( root : ĠT , Ġprivate Ġval Ġchildren : Ġ( T ) Ġ-> ĠList < T >) Ġ: ĠIterator < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġqueue : ĠDe que < T > Ġ= ĠLinkedList < T >( listOf ( root )) ĊĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġ! queue . isEmpty () ĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! hasNext ()) Ġthrow ĠNoSuch ElementException () ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠT Ġ= Ġqueue . pop () ĊĠĠĠĠĠĠĠ Ġchildren ( result ). reversed (). forEach Ġ{ Ġqueue . push ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠWalk s Ġthe Ġcomponent Ġchild Ġtree , Ġdepth - first : Ġfirst Ġthe Ġcomponent , Ġthen Ġits Ġdesc endants , Ċ Ġ* Ġthen Ġits Ġnext Ġsibling . Ċ Ġ*/ Ċ private Ġfun ĠComponent . walk (): ĠIterable < Component > Ġ= ĠIterable Ġ{ ĊĠĠĠ ĠPre order Tree Iterator ( this ) Ġ{ Ġcomponent : ĠComponent Ġ-> Ġtesting Lifecycle Hook . getAll Children ( component ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġno ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġone Ġor Ġmore Ġcomponents Ġmatched . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT : ĠComponent > ĠComponent ._ expect None ( no inline Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠUnit Ġ= Ġthis ._ expect None ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġno ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġone Ġor Ġmore Ġcomponents Ġmatched . Ċ Ġ*/ Ċ fun Ġ< T : ĠComponent > ĠComponent ._ expect None ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġval Ġresult : ĠList < T > Ġ= Ġ_ find ( clazz ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 .. 0 ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġcheck ( count Ġ== Ġ 0 .. 0 ) Ġ{ Ġ" You 're Ġcalling Ġ_ expect None Ġwhich Ġexpects Ġ 0 Ġcomponent , Ġyet Ġyou Ġtried Ġto Ġspecify Ġthe Ġcount Ġof Ġ$ count " Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcheck ( result . isEmpty ()) Ġ// Ġsafety Ġcheck Ġthat Ġ_ find Ġworks Ġas Ġexpected Ċ } Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġno ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġone Ġor Ġmore Ġcomponents Ġmatched . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT : ĠComponent > Ġ_ expect None ( no inline Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠUnit Ġ= ĊĠĠĠ Ġ_ expect None ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġno ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġone Ġor Ġmore Ġcomponents Ġmatched . Ċ Ġ*/ Ċ fun Ġ< T : ĠComponent > Ġ_ expect None ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. ()-> Unit Ġ= Ġ{} ): ĠUnit Ġ= ĠUI . getCurrent (). _ expect None ( clazz , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġis Ġexactly Ġone ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġnone , Ġor Ġmore Ġthan Ġone Ġcomponents Ġmatched . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠComponent > ĠComponent ._ expect One ( no inline Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{} ): ĠUnit Ġ= Ġthis ._ expect One ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġis Ġexactly Ġone ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġnone , Ġor Ġmore Ġthan Ġone Ġcomponents Ġmatched . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComponent > ĠComponent ._ expect One ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġ// Ġtechnically Ġ_ expect One Ġis Ġthe Ġsame Ġas Ġ_ get , Ġbut Ġthe Ġsemantics Ġdiffer Ġ- Ġwith Ġ_ get () Ġwe 're Ġ" just " Ġdoing Ġa Ġlookup Ġ( and Ġassert ing Ġon ĊĠĠĠ Ġ// Ġthe Ġcomponent Ġlater ). Ġ_ expect One () Ġexplicitly Ġdecl ares Ġin Ġthe Ġtest Ġsources Ġthat Ġwe Ġwant Ġto Ġcheck Ġthat Ġthere Ġis Ġexactly Ġone Ġsuch Ġcomponent . ĊĠĠĠ Ġ_ get ( clazz , Ġblock ) Ċ } Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġis Ġexactly Ġone ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġtype Ġwhich Ġmatches Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġnone , Ġor Ġmore Ġthan Ġone Ġcomponents Ġmatched . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠComponent > Ġ_ expect One ( no inline Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{} ): ĠUnit Ġ= Ġ_ expect One ( T :: class . java , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġis Ġexactly Ġone ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġof Ġgiven Ġ[ clazz ] Ġwhich Ġmatches Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġnone , Ġor Ġmore Ġthan Ġone Ġcomponents Ġmatched . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComponent > Ġ_ expect One ( clazz : ĠClass < T >, Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{} ): ĠUnit Ġ= ĠUI . getCurrent (). _ expect One ( clazz , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġexactly Ġ[ count ] ĠVIS IBLE Ġcomponents Ġmatching Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . ĠExamples : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġ 5 Ġbuttons Ġin Ġa Ġbutton Ġbar Ċ Ġ* Ġbutton Bar ._ expect < Button >( 5 .. 5 ) Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġeither Ġ 3 , Ġ 4 Ġor Ġ 5 Ġvertical Ġlayouts Ġin Ġthe ĠUI Ġwith Ġgiven Ġclass Ċ Ġ* Ġ_ expect < Vertical Layout >{ Ġcount Ġ= Ġ 3 .. 5 ; Ġstyles Ġ= Ġ" men ubar " Ġ} Ċ Ġ* Ġ``` Ċ Ġ* ĠSpecial Ġcases : Ġfor Ġassert ing Ġone Ġcomponent Ġuse Ġ[_ expect One ]. ĠFor Ġassert ing Ġno Ġcomponents Ġuse Ġ[_ expect None ]. Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġincorrect Ġcount Ġof Ġcomponent Ġmatched . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠComponent > ĠComponent ._ expect ( count : ĠInt Ġ= Ġ 1 , Ġno inline Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{} ): ĠUnit Ġ= Ġthis ._ expect ( T :: class . java , Ġcount , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġexactly Ġ[ count ] ĠVIS IBLE Ġcomponents Ġof Ġgiven Ġ[ clazz ] Ġmatch Ġ[ block ]. ĠThis Ġcomponent Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . ĠExamples : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġ 5 Ġbuttons Ġin Ġa Ġbutton Ġbar Ċ Ġ* Ġbutton Bar ._ expect < Button >( 5 ) Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġeither Ġ 3 , Ġ 4 Ġor Ġ 5 Ġvertical Ġlayouts Ġin Ġthe ĠUI Ġwith Ġgiven Ġclass Ċ Ġ* Ġ_ expect < Vertical Layout >{ Ġcount Ġ= Ġ 3 .. 5 ; Ġstyles Ġ= Ġ" men ubar " Ġ} Ċ Ġ* Ġ``` Ċ Ġ* ĠSpecial Ġcases : Ġfor Ġassert ing Ġone Ġcomponent Ġuse Ġ[_ expect One ]. ĠFor Ġassert ing Ġno Ġcomponents Ġuse Ġ[_ expect None ]. Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġincorrect Ġcount Ġof Ġcomponent Ġmatched . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComponent > ĠComponent ._ expect ( clazz : ĠClass < T >, Ġcount : ĠInt Ġ= Ġ 1 , Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġ// Ġtechnically Ġ_ expect Ġis Ġthe Ġsame Ġas Ġ_ find , Ġbut Ġthe Ġsemantics Ġdiffer Ġ- Ġwith Ġ_ find () Ġwe 're Ġ" just " Ġdoing Ġa Ġlookup Ġ( and Ġassert ing Ġon ĊĠĠĠ Ġ// Ġthe Ġcomponents Ġlater ). Ġ_ expect () Ġexplicitly Ġdecl ares Ġin Ġthe Ġtest Ġsources Ġthat Ġwe Ġwant Ġto Ġcheck Ġthat Ġthere Ġare Ġexactly Ġx Ġcomponents Ġthat Ġmatch Ġgiven Ġspec . ĊĠĠĠ Ġ_ find ( clazz ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . count Ġ= Ġcount .. count ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġexactly Ġ[ count ] ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġmatch Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . ĠExamples : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġ 5 Ġbuttons Ġin Ġa Ġbutton Ġbar Ċ Ġ* Ġbutton Bar ._ expect < Button >( 5 .. 5 ) Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġeither Ġ 3 , Ġ 4 Ġor Ġ 5 Ġvertical Ġlayouts Ġin Ġthe ĠUI Ġwith Ġgiven Ġclass Ċ Ġ* Ġ_ expect < Vertical Layout >{ Ġcount Ġ= Ġ 3 .. 5 ; Ġstyles Ġ= Ġ" men ubar " Ġ} Ċ Ġ* Ġ``` Ċ Ġ* ĠSpecial Ġcases : Ġfor Ġassert ing Ġone Ġcomponent Ġuse Ġ[_ expect One ]. ĠFor Ġassert ing Ġno Ġcomponents Ġuse Ġ[_ expect None ]. Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġincorrect Ġcount Ġof Ġcomponent Ġmatched . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠComponent > Ġ_ expect ( count : ĠInt Ġ= Ġ 1 , Ġno inline Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{} ): ĠUnit Ġ= Ġ_ expect ( T :: class . java , Ġcount , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠExpect s Ġthat Ġthere Ġare Ġexactly Ġ[ count ] ĠVIS IBLE Ġcomponents Ġin Ġthe Ġcurrent ĠUI Ġwith Ġgiven Ġ[ clazz ] Ġmatch Ġ[ block ]. ĠThe Ġ[ UI . getCurrent ] Ġand Ġall Ġof Ġits Ġdesc endants Ġare Ġsearched . ĠExamples : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġ 5 Ġbuttons Ġin Ġa Ġbutton Ġbar Ċ Ġ* Ġbutton Bar ._ expect < Button >( 5 .. 5 ) Ċ Ġ* Ġ// Ġcheck Ġthat Ġthere Ġare Ġeither Ġ 3 , Ġ 4 Ġor Ġ 5 Ġvertical Ġlayouts Ġin Ġthe ĠUI Ġwith Ġgiven Ġclass Ċ Ġ* Ġ_ expect < Vertical Layout >{ Ġcount Ġ= Ġ 3 .. 5 ; Ġstyles Ġ= Ġ" men ubar " Ġ} Ċ Ġ* Ġ``` Ċ Ġ* ĠSpecial Ġcases : Ġfor Ġassert ing Ġone Ġcomponent Ġuse Ġ[_ expect One ]. ĠFor Ġassert ing Ġno Ġcomponents Ġuse Ġ[_ expect None ]. Ċ Ġ* Ġ@ throws ĠAssertionError Ġif Ġincorrect Ġcount Ġof Ġcomponent Ġmatched . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComponent > Ġ_ expect ( clazz : ĠClass < T >, Ġcount : ĠInt Ġ= Ġ 1 , Ġblock : ĠSearch Spec < T >. () Ġ-> ĠUnit Ġ= Ġ{} ): ĠUnit Ġ= ĠUI . getCurrent (). _ expect ( clazz , Ġcount , Ġblock ) Ċ