/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠZ UP ĠIT ĠSER V IC OS ĠEM ĠT EC NO LOG IA ĠE ĠIN OV AC AO ĠSA Ċ Ġ* Ċ Ġ* Ġ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 Ġbr . com . z up . be agle . android . components Ċ Ċ import Ġandroid . view . View Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġbr . com . z up . be agle . android . action . Navigate Ċ import Ġbr . com . z up . be agle . android . components . layout . Container Ċ import Ġbr . com . z up . be agle . android . context . Context Action Executor Ċ import Ġbr . com . z up . be agle . android . testutil . get Private Field Ċ import Ġbr . com . z up . be agle . android . utils . generate ViewModel Instance Ċ import Ġbr . com . z up . be agle . android . utils . handle Event Ċ import Ġbr . com . z up . be agle . android . view . view model . OnInit ViewModel Ċ import Ġbr . com . z up . be agle . android . widget . Root View Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . mock k Constructor Ċ import Ġio . mock k . mock k Object Ċ import Ġio . mock k . mock k Static Ċ import Ġio . mock k . slot Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . un mock k All Ċ import Ġio . mock k . un mock k Constructor Ċ import Ġio . mock k . un mock k Object Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . jupiter . api . After Each Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ class ĠOnInit iable Component Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġroot View Ġ= Ġmock k < Root View >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġon Init ViewModel Ġ= Ġspy k ( OnInit ViewModel ()) ĊĠĠĠ Ġprivate Ġval Ġorigin Ġ= Ġmock k < View >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġlistener Slot Ġ= Ġslot < View . On Attach State ChangeListener >() ĊĠĠĠ Ġprivate Ġval Ġid Ġ= Ġ 1 0 ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock k Constructor ( ViewModel Provider :: class ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġany Construct ed < ViewModel Provider >(). get ( OnInit ViewModel :: class . java ) Ġ} Ġreturns Ġon Init ViewModel ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġorigin . id Ġ} Ġreturns Ġid ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġorigin . add On Attach State ChangeListener ( capture ( listener Slot )) Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Each ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġun mock k Constructor ( ViewModel Provider :: class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġinit iable Widget Ġwithout Ġon Init Ġactions ĠWHEN Ġhandle OnInit ĠTHEN Ġshouldn 't Ġcall Ġadd On Attach State ChangeListener `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġinit iable Widget Ġ= ĠContainer ( children Ġ= ĠlistOf ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġinit iable Widget . handle OnInit ( root View , Ġorigin ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġorigin . add On Attach State ChangeListener ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġinit iable Widget ĠWHEN Ġhandle OnInit ĠTHEN Ġshould Ġadd Ġlistener `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġinit iable Widget Ġ= ĠContainer ( children Ġ= ĠlistOf (), Ġon Init Ġ= ĠlistOf ( Navigate . Pop View ())) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġinit iable Widget . handle OnInit ( root View , Ġorigin ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġorigin . add On Attach State ChangeListener ( listener Slot . captured ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġinit iable Widget ĠWHEN Ġon View Attached To Window ĠTHEN Ġshould Ġset OnInit Action Status Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠNavigate . Pop View () ĊĠĠĠĠĠĠĠ Ġval Ġinit iable Widget Ġ= ĠContainer ( children Ġ= ĠlistOf (), Ġon Init Ġ= ĠlistOf ( action )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġinit iable Widget . handle OnInit ( root View , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġlistener Slot . captured . on View Attached To Window ( origin ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġon Init ViewModel . setOn Init Action Status ( id , Ġtrue ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġinit iable Widget ĠWHEN Ġon View Attached To Window ĠTHEN Ġshould Ġexecute Actions Ġonly Ġonce `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠNavigate . Pop View () ĊĠĠĠĠĠĠĠ Ġval Ġinit iable Widget Ġ= ĠContainer ( children Ġ= ĠlistOf (), Ġon Init Ġ= ĠlistOf ( action )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġinit iable Widget . handle OnInit ( root View , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġlistener Slot . captured . on View Attached To Window ( origin ) ĊĠĠĠĠĠĠĠ Ġlistener Slot . captured . on View Attached To Window ( origin ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġaction . handle Event ( root View , Ġorigin , Ġaction ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġinit iable Widget ĠWHEN Ġmark To R er un OnInit ĠTHEN Ġshould Ġset OnInit Action Status Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠNavigate . Pop View () ĊĠĠĠĠĠĠĠ Ġval Ġinit iable Widget Ġ= ĠContainer ( children Ġ= ĠlistOf (), Ġon Init Ġ= ĠlistOf ( action )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġinit iable Widget . handle OnInit ( root View , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġinit iable Widget . mark To R er un OnInit () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġon Init ViewModel . setOn Init Action Status ( id , Ġfalse ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġinit iable Widget Ġw itch Ġalready Ġcalled Ġon Init ĠWHEN Ġmark To R er un OnInit ĠTHEN Ġshould Ġbe Ġable Ġto Ġexecute Actions Ġagain `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠNavigate . Pop View () ĊĠĠĠĠĠĠĠ Ġval Ġinit iable Widget Ġ= ĠContainer ( children Ġ= ĠlistOf (), Ġon Init Ġ= ĠlistOf ( action )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġinit iable Widget . handle OnInit ( root View , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġlistener Slot . captured . on View Attached To Window ( origin ) ĊĠĠĠĠĠĠĠ Ġinit iable Widget . mark To R er un OnInit () ĊĠĠĠĠĠĠĠ Ġlistener Slot . captured . on View Attached To Window ( origin ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġaction . handle Event ( root View , Ġorigin , Ġaction ) Ġ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ