/* Ċ Ġ* ĠCopyright Ġ( c ) ĠMeta ĠPlatform s , ĠInc . Ġand Ġaffiliates . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . facebook . l ith o . testing Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . test . core . app . Application Provider . getApplicationContext Ċ import Ġcom . facebook . l ith o . Component Ċ import Ġcom . facebook . l ith o . Component Context Ċ import Ġcom . facebook . l ith o . Component Scope Ċ import Ġcom . facebook . l ith o . Component Tree Ċ import Ġcom . facebook . l ith o . Components Pools Ċ import Ġcom . facebook . l ith o . L ith o View Ċ import Ġcom . facebook . l ith o . Tree Props Ċ import Ġcom . facebook . l ith o . config . Components Configuration Ċ import Ġcom . facebook . render core . Mount Items Pool Ċ import Ġorg . junit . rules . Test Rule Ċ import Ġorg . junit . runner . Description Ċ import Ġorg . junit . runners . model . Statement Ċ import Ġorg . ro bo lectric . Ro bo lectric Ċ import Ġorg . ro bo lectric . Shadow s . shadow Of Ċ Ċ /** Ċ Ġ* ĠThis Ġtest Ġutility Ġallows Ġclients Ġto Ġcreate Ġa Ġ[ Test L ith o View ] Ġinstance Ġthat Ġallows Ġto Ġtest Ċ Ġ* Ġassertion Ġon Ġthe Ġview Ġhierarchy Ġrendered Ġby Ġa ĠL ith o Ġcomponents . Ċ Ġ* Ġ``` Ċ Ġ* Ġ Ġ@ RunWith ( Android JUnit 4 :: class ) Ċ Ġ* Ġ Ġclass ĠL ith o Sample Test Ġ{ Ċ Ġ* Ċ Ġ* Ġ Ġ@ Rule Ġ@ Jvm Field Ġval Ġl ith o View Rule Ġ= ĠL ith o View Rule () Ċ Ġ* Ġ Ġ@ Test Ċ Ġ* Ġ Ġfun Ġtest () Ġ{ Ċ Ġ* ĠĠ Ġval Ġtest L ith o View Ġ= Ġ Ġl ith o View Rule . render Ġ{ ĠTest Component () Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ// Ġor Ġyou Ġcan Ġuse Ġset Root / measure / layout Ġfor Ġmore Ġfine - gr ained Ġcontrol Ċ Ġ* ĠĠĠ Ġval Ġtest L ith o View Ġ= Ġl ith o View Rule . create Test L ith o View (). attach To Window (). set Root ( Test Component ()). measure (). layout () Ċ Ġ* ĠĠĠ Ġ// ĠTest Ġyour Ġassertions Ġon Ġthe ĠTest L ith o View Ġinstance . Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠL ith o View Rule Ċ @ Jvm Over loads Ċ constructor ( ĊĠĠĠ Ġval Ġcomponents Configuration : ĠComponents Configuration ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġtheme Res Id : ĠInt ? Ġ= Ġnull Ċ ) Ġ: ĠTest Rule Ġ{ ĊĠ Ġlateinit Ġvar Ġcontext : ĠComponent Context ĊĠ Ġprivate Ġval Ġthread Looper Controller : ĠThread Looper Controller Ġ= ĠThread Looper Controller () ĊĊĠ Ġoverride Ġfun Ġapply ( base : ĠStatement , Ġdescription : ĠDescription ): ĠStatement Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠStatement () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġevaluate () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( theme Res Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= ĠRo bo lectric . build Activity ( Activity :: class . java ). create (). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . set Theme ( theme Res Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠComponent Context ( activity ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠComponent Context ( getApplicationContext < Context >()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġcontext . setLayout State Context ForTesting () ĊĠĠĠĠĠĠĠĠĠ Ġthread Looper Controller . init () ĊĠĠĠĠĠĠĠĠĠ Ġbase . evaluate () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthread Looper Controller . clean () ĊĠĠĠĠĠĠĠĠĠ ĠComponents Pools . clear Mount Content Pools () ĊĠĠĠĠĠĠĠĠĠ ĠMount Items Pool . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠuseContext ( c : ĠComponent Context ): ĠL ith o View Rule Ġ{ ĊĠĠĠ Ġcontext Ġ= Ġc ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĠSets Ġa Ġnew Ġ[ Tree Prop ] Ġfor Ġthe Ġnext Ġlayout Ġpass . Ġ*/ ĊĠ Ġfun Ġset Tree Prop ( klass : ĠClass <* >, Ġinstance : ĠAny ?): ĠL ith o View Rule Ġ{ ĊĠĠĠ Ġval Ġprops Ġ= Ġcontext . tree Props Ġ?: ĠTree Props () ĊĠĠĠ Ġprops . put ( klass , Ġinstance ) ĊĠĠĠ Ġcontext . tree Props Ġ= Ġprops ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreates Ġnew ĠTest L ith o View Ġholder Ġresponsible Ġfor Ġkeeping Ġan Ġinstance Ġof ĠL ith o View , Ġallowing Ġto ĊĠĠ Ġ* Ġfind ĠViews / Components Ġor Ġperform Ġassertions Ġon Ġit . ĠFor Ġsimple ĠComponent Ġrendering Ġwithout ĊĠĠ Ġ* Ġfine - gr ained Ġcontrol , Ġuse Ġ[ render ] ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġcreate Test L ith o View ( ĊĠĠĠĠĠ Ġcomponent Function : Ġ( Component Scope . () Ġ-> ĠComponent )? Ġ= Ġnull ĊĠ Ġ): ĠTest L ith o View Ġ{ ĊĠĠĠ Ġval Ġtest L ith o View Ġ= ĠTest L ith o View ( context , Ġcomponents Configuration ) ĊĠĠĠ Ġcomponent Function ?. let Ġ{ ĊĠĠĠĠĠ Ġtest L ith o View . set Root ( with ( Component Scope ( context )) Ġ{ Ġcomponent Function () Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtest L ith o View ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreates Ġnew ĠTest L ith o View Ġholder Ġresponsible Ġfor Ġkeeping Ġan Ġinstance Ġof ĠL ith o View , Ġallowing Ġto ĊĠĠ Ġ* Ġfind ĠViews / Components Ġor Ġperform Ġassertions Ġon Ġit . ĠYou Ġcan Ġpass Ġadditional Ġparameters , Ġif Ġnull , ĊĠĠ Ġ* Ġthe Ġdefault Ġvalues Ġwill Ġbe Ġprovided . ĠFor Ġsimple ĠComponent Ġrendering Ġwithout Ġfine - gr ained ĊĠĠ Ġ* Ġcontrol , Ġuse Ġ[ render ] ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġcreate Test L ith o View With ( ĊĠĠĠĠĠ Ġl ith o View : ĠL ith o View ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġcomponent Tree : ĠComponent Tree ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġwidth Px : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġheight Px : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġcomponent Function : Ġ( Component Scope . () Ġ-> ĠComponent )? Ġ= Ġnull ĊĠ Ġ): ĠTest L ith o View Ġ{ ĊĠĠĠ Ġval Ġtest L ith o View Ġ= ĠTest L ith o View ( context , Ġcomponents Configuration ) ĊĠĠĠ Ġcomponent Tree ?. let Ġ{ Ġtest L ith o View . use Component Tree ( component Tree ) Ġ} ĊĠĠĠ Ġl ith o View ?. let Ġ{ Ġtest L ith o View . use L ith o View ( l ith o View ) Ġ} ĊĠĠĠ Ġwidth Px ?. let Ġ{ Ġheight Px ?. let Ġ{ Ġtest L ith o View . setSize Px ( width Px , Ġheight Px ) Ġ} Ġ} ĊĠĠĠ Ġcomponent Function ?. let Ġ{ ĊĠĠĠĠĠ Ġtest L ith o View . set Root ( with ( Component Scope ( context )) Ġ{ Ġcomponent Function () Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtest L ith o View ĊĠ Ġ} ĊĊĠ Ġ/** ĠSets Ġthe Ġnew Ġroot Ġto Ġrender . Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġrender ( ĊĠĠĠĠĠ Ġl ith o View : ĠL ith o View ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġcomponent Tree : ĠComponent Tree ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġwidth Px : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġheight Px : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġcomponent Function : ĠComponent Scope . () Ġ-> ĠComponent ĊĠ Ġ): ĠTest L ith o View Ġ{ ĊĠĠĠ Ġval Ġtest L ith o View Ġ= ĊĠĠĠĠĠĠĠ Ġcreate Test L ith o View With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl ith o View Ġ= Ġl ith o View , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Tree Ġ= Ġcomponent Tree , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Px Ġ= Ġwidth Px , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Px Ġ= Ġheight Px ) ĊĠĠĠ Ġreturn Ġtest L ith o View ĊĠĠĠĠĠĠĠ Ġ. attach To Window () ĊĠĠĠĠĠĠĠ Ġ. set Root ( with ( Component Scope ( context )) Ġ{ Ġcomponent Function () Ġ}) ĊĠĠĠĠĠĠĠ Ġ. measure () ĊĠĠĠĠĠĠĠ Ġ. layout () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPerform Ġany Ġinteractions Ġdefined Ġin Ġthe Ġ[ Interaction Scope ] Ġor Ġon Ġthe Ġ[ L ith o View Rule ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĠDuring Ġtests Ġwe Ġneed Ġto Ġmake Ġsure Ġthat Ġeverything Ġis Ġin Ġsync Ġin Ġthe ĠMain ĠThread Ġand Ġin Ġthe ĊĠĠ Ġ* ĠBackground ĠThread , Ġjust Ġlike Ġin Ġreal Ġlife Ġuse Ġcase . ĠThis Ġfunctions Ġtakes Ġoff Ġthe Ġresponsibility ĊĠĠ Ġ* Ġfrom Ġyou Ġto Ġuse Ġthe ĠL oo pers Ġand Ġmanage Ġthe Ġthread Ġsynchron isation . ĠYou Ġonly Ġneed Ġto Ġpass Ġhere ĊĠĠ Ġ* Ġone Ġof Ġthe Ġdefined Ġinteractions Ġfrom Ġ[ L ith o View Rule ] Ġor Ġ[ Interaction Scope ], Ġand Ġwe Ġwill Ġtake ĊĠĠ Ġ* Ġcare Ġof Ġall Ġof Ġthe Ġrest ĊĠĠ Ġ*/ ĊĠ Ġfun Ġact ( ĊĠĠĠĠĠ Ġtest L ith o View : ĠTest L ith o View , ĊĠĠĠĠĠ Ġaction : ĠTest L ith o View . Interactions Scope . () Ġ-> ĠUnit ĊĠ Ġ): ĠL ith o View Rule Ġ{ ĊĠĠĠ Ġtest L ith o View . Interactions Scope (). action () ĊĠĠĠ Ġidle () ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRuns Ġthrough Ġall Ġtasks Ġon Ġthe Ġbackground Ġthread Ġand Ġmain Ġlo p per , Ġblocking Ġuntil Ġit Ġcompletes . ĊĠĠ Ġ* ĠUse Ġif Ġthere Ġare Ġany Ġasync Ġevents Ġtriggered Ġby Ġlayout Ġ( Ġie Ġvisibility Ġevents ) Ġto Ġmanually Ġdrain ĊĠĠ Ġ* Ġthe Ġqueue ĊĠĠ Ġ*/ ĊĠ Ġfun Ġidle () Ġ{ ĊĠĠĠ Ġthread Looper Controller . run To EndOf Tasks Sync () ĊĠĠĠ Ġshadow Of ( Looper . get Main Looper ()). idle () ĊĠ Ġ} Ċ } Ċ