package Ġat . fl or ians ch uster . lo co Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertNull Ċ import Ġkotlin . test . assertTrue Ċ Ċ internal Ġclass ĠView Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġattach _ detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Fragment With < Test Fragment >( Test Type . Create Destroy ). on Fragment Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠTest View ( fragment . require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( view . job ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . view Layout . addView ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( assertNotNull ( view . job ). isActive ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . view Layout . removeAll Views () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( assertNotNull ( view . job ). isActive ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . view Layout . addView ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( assertNotNull ( view . job ). isActive ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġview . call Counter . get ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTest View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcall Counter Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch On View Attach Cancel On View Detach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= ĠIn defin ite Test Flow . launch In ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Counter . get And Increment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlifecycle _ create _ destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscenario Ġ= Ġlaunch Fragment With < Test Fragment >( Test Type . Create Destroy ) ĊĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . CREATED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . RE SU MED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . STARTED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertEquals ( 1 , Ġfragment . call Counter . get ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlifecycle _ start _ stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscenario Ġ= Ġlaunch Fragment With < Test Fragment >( Test Type . Start Stop ) ĊĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . CREATED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertFalse ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . STARTED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . CREATED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertFalse ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . STARTED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertEquals ( 3 , Ġfragment . call Counter . get ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlifecycle _ resume _ pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscenario Ġ= Ġlaunch Fragment With < Test Fragment >( Test Type . Resume Pause ) ĊĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . CREATED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertFalse ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . RE SU MED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . CREATED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertFalse ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . RE SU MED ) ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertTrue ( assertNotNull ( fragment . job ). isActive ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĠassertEquals ( 3 , Ġfragment . call Counter . get ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTest Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġview Layout : ĠFrame Layout ĊĊĠĠĠĠĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcall Counter Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠĠĠĠĠ Ġ): ĠView ? Ġ= ĠFrame Layout ( require Context ()). also (:: view Layout :: set ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= ĠIn defin ite Test Flow . launch In ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Counter . get And Increment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( require Test Type In Bundle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Type . Create Destroy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). launch On Lifecycle Create Cancel On Lifecycle Destroy ( block Ġ= Ġblock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Type . Start Stop Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). launch On Lifecycle Start Cancel On Lifecycle Stop ( block Ġ= Ġblock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Type . Resume Pause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). launch On Lifecycle Resume Cancel On Lifecycle Pause ( block Ġ= Ġblock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }