package Ġcom . har old admin . vector Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . testing . launch Fragment In Container Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġcom . har old admin . vector . state . Count ing State Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġjava . util . Timer Ċ import Ġkotlin . concurrent . fixed Rate Timer Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ Config ( sdk Ġ= Ġ[ Build . VERSION _ CODES . P ]) Ċ internal Ġclass ĠVector Fragment Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` render State Ġshould Ġstop Ġcollecting Ġstate Ġupdates Ġafter Ġview Ġhas Ġbeen Ġdestroyed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġfragment Ġinstance Ġin Ġa Ġvariable Ġto Ġmake Ġassertions Ġafter Ġit Ġhas Ġdestroyed ĊĠĠĠĠĠĠĠ Ġvar Ġfragment Instance : ĠRenderer Test Fragment ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġscenario Ġ= Ġlaunch Fragment In Container < Renderer Test Fragment >() ĊĠĠĠĠĠĠĠ Ġscenario . on Fragment Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Instance Ġ= Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Renderer Test ViewModel . initial Delay ) Ġ// ĠWait Ġfor Ġfirst Ġstate Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( fragment . last Updated State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" State Ġupdates Ġare Ġnot Ġbeing Ġcollected Ġeven Ġafter Ġview Ġhas Ġbeen Ġcreated " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . DESTROY ED ) Ġ// ĠCancel Ġthe Ġview Lifecycle Ġcoroutine Ġscope ĊĊĠĠĠĠĠĠĠ Ġfragment Instance !!. let Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Count Ġ= Ġfragment . last Updated State !!. count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Renderer Test ViewModel . period ) Ġ// ĠWait Ġfor Ġnext Ġstate Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Count Ġ= Ġfragment . last Updated State !!. count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( next Count Ġ== Ġcurrent Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" State Ġupdates Ġare Ġbeing Ġcollected Ġeven Ġafter Ġthe Ġfragment 's Ġview Ġhas Ġbeen Ġdestroyed " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfragment Instance Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠRenderer Test Fragment Ġ: ĠVector Fragment () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠviewModel : ĠRenderer Test ViewModel Ġby Ġfragment ViewModel () ĊĠĠĠĠĠĠĠ Ġvar Ġlast Updated State : ĠCount ing State ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender State ( viewModel ) Ġ{ Ġstate Ġ-> Ġlast Updated State Ġ= Ġstate Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠView ( require Context ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠRenderer Test ViewModel Ġ: ĠVector ViewModel < Count ing State >( Count ing State ()) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval Ġinitial Delay Ġ= Ġ 1 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval Ġperiod Ġ= Ġ 1 0 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtimer : ĠTimer Ġ= Ġfixed Rate Timer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" countdown ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdaemon Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Delay Ġ= Ġinitial Delay , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ= Ġperiod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( count Ġ= Ġcount Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }