/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . fragment . app Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . fragment . app . test . Fragment Test Activity Ċ import Ġandroidx . fragment . app . test . Test ViewModel Ċ import Ġandroidx . fragment . test . R Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . test . core . app . Activity Scenario Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġandroidx . test utils . with Activity Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . google . common . truth . Truth . assert With Message Ċ import Ġorg . junit . Assert . fail Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ Large Test Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠSave Restore Back Stack Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Back Stack () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠViewModel Strict Fragment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġcommit () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . viewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġhave Ġtheir Ġstate Ġsaved ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Save InstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSaved ĠF rag ments Ġshould Ġbe Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġbe Ġdestroyed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Destroy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBut Ġany ĠView Models Ġshould Ġnot Ġbe Ġcleared Ġso Ġthat Ġthey 're Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġlater Ġrest or ation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġsave Back Stack () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . viewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove To State ( Lifecycle . State . DESTROY ED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġbe Ġcleared Ġafter Ġthe Ġactivity Ġis Ġfully Ġdestroyed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . viewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Previous ly Referenced Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠStrict Fragment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove ( fragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . execute Pending Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" execute Pending Transactions () Ġshould Ġfail Ġwith Ġan ĠIllegalArgumentException ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Message That () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. startsWith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" save Back Stack (\" replacement \") Ġmust Ġbe Ġself Ġcontained Ġand Ġnot Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" reference Ġfragments Ġfrom Ġnon - saved ĠFragment Transactions ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Non Re ordering Allowed Transaction () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠStrict Fragment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . execute Pending Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" execute Pending Transactions () Ġshould Ġfail Ġwith Ġan ĠIllegalArgumentException ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Message That () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. startsWith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" save Back Stack (\" replacement \") Ġincluded ĠFragment Transactions Ġmust Ġuse Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" set Re ordering Allowed ( true ) Ġto Ġensure Ġthat Ġthe Ġback Ġstack Ġcan Ġbe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" restore d Ġas Ġan Ġatomic Ġoperation ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Ret ained Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Replacement . retain Instance Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . execute Pending Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" execute Pending Transactions () Ġshould Ġfail Ġwith Ġan ĠIllegalArgumentException ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Message That () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. startsWith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" save Back Stack (\" replacement \") Ġmust Ġnot Ġcontain Ġretained Ġfragments . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġdirect Ġreference Ġto Ġretained Ġfragment Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Ret ained Child Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠStrict Fragment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Replacement . child FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Strict Fragment (). apply Ġ{ Ġretain Instance Ġ= Ġtrue Ġ}, Ġ" ret ained ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions ( fragment Replacement . child FragmentManager ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . execute Pending Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" execute Pending Transactions () Ġshould Ġfail Ġwith Ġan ĠIllegalArgumentException ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Message That () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. startsWith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" save Back Stack (\" replacement \") Ġmust Ġnot Ġcontain Ġretained Ġfragments . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġretained Ġchild Ġfragment Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrestore Back Stack () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠState Save Fragment (" saved ", Ġ" un saved ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ViewModel Ġ= Ġfragment Replacement . viewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġcommit () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( original ViewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġhave Ġtheir Ġstate Ġsaved ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Save InstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSaved ĠF rag ments Ġshould Ġbe Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġbe Ġdestroyed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Destroy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBut Ġany ĠView Models Ġshould Ġnot Ġbe Ġcleared Ġso Ġthat Ġthey 're Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġlater Ġrest or ation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġsave Back Stack () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( original ViewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . restore Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Fragment Replacement Ġ= Ġfm . find Fragment ById ( R . id . content ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( new Fragment Replacement ). isInstanceOf ( State Save Fragment :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Saved Replacement Ġ= Ġnew Fragment Replacement Ġas ĠState Save Fragment ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġrestored Ġfragment Ġhas Ġits Ġsaved Ġstate Ġrestored ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Saved Replacement . saved State ). isEqualTo (" saved ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Saved Replacement . un saved State ). isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Saved Replacement . viewModel ). is Same Instance As ( original ViewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrestore Back Stack After Re create () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠState Save Fragment (" saved ", Ġ" un saved ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ViewModel Ġ= Ġfragment Replacement . viewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġcommit () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( original ViewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġhave Ġtheir Ġstate Ġsaved ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Save InstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSaved ĠF rag ments Ġshould Ġbe Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġbe Ġdestroyed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Destroy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBut Ġany ĠView Models Ġshould Ġnot Ġbe Ġcleared Ġso Ġthat Ġthey 're Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġlater Ġrest or ation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġsave Back Stack () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( original ViewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġrecreate Ġthe Ġwhole Ġactivity Ġwhile Ġthe Ġstate Ġof Ġthe Ġback Ġstack Ġis Ġsaved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . restore Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Fragment Replacement Ġ= Ġfm . find Fragment ById ( R . id . content ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( new Fragment Replacement ). isInstanceOf ( State Save Fragment :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Saved Replacement Ġ= Ġnew Fragment Replacement Ġas ĠState Save Fragment ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġrestored Ġfragment Ġhas Ġits Ġsaved Ġstate Ġrestored ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Saved Replacement . saved State ). isEqualTo (" saved ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Saved Replacement . un saved State ). isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Saved Replacement . viewModel ). is Same Instance As ( original ViewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrestore Back Stack Without Execute Pending Transactions () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Activity Scenario . launch ( Fragment Test Activity :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Base Ġ= ĠStrict Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Replacement Ġ= ĠState Save Fragment (" saved ", Ġ" un saved ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . content , Ġfragment Base ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfm . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Re ordering Allowed ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . content , Ġfragment Replacement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ViewModel Ġ= Ġfragment Replacement . viewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġcommit () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( original ViewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . save Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIm mediate ly Ġrestore Ġthe Ġback Ġstack Ġwithout Ġcalling Ġexecute Pending Transactions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfm . restore Back Stack (" replacement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Transactions () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġnot Ġgo Ġthrough Ġon Save InstanceState ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Save InstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Saved ĠF rag ments Ġshould Ġnot Ġhave Ġbeen Ġdestroyed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fragment Replacement . called On Destroy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" ViewModel Ġshould Ġnot Ġbe Ġcleared Ġafter Ġsave Back Stack () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( original ViewModel . cleared ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Fragment Ġshould Ġstill Ġbe Ġreturned Ġby ĠFragment Manager ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( fm . find Fragment ById ( R . id . content )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Same Instance As ( fragment Replacement ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġrestored Ġfragment Ġhas Ġits Ġsaved Ġstate Ġrestored ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fragment Replacement . saved State ). isEqualTo (" saved ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fragment Replacement . un saved State ). isEqualTo (" un saved ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fragment Replacement . viewModel ). is Same Instance As ( original ViewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( fm . back Stack Entry Count ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġopen Ġclass ĠViewModel Strict Fragment Ġ: ĠStrict Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠviewModel : ĠTest ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Provider ( this ). get ( Test ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠState Save Fragment ( ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġsaved State : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġun saved State : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: ĠViewModel Strict Fragment () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Ġ= ĠsavedInstanceState . getString ( STATE _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout State . putString ( STATE _ KEY , Ġsaved State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ KEY Ġ= Ġ" state " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ