package Ġcom . g ch rist ov . news feed . k mm feed Ċ Ċ import Ġcom . g ch rist ov . news feed . k mm common mv vm test . Common ViewModel TestClass Ċ import Ġcom . g ch rist ov . news feed . k mm comm ont est . Fake Clock Ċ import Ġcom . g ch rist ov . news feed . k mm comm ont est . Fake Coroutine Dispatcher Ċ import Ġcom . g ch rist ov . news feed . k mm comm ont est . Fake Response Ċ import Ġcom . g ch rist ov . news feed . k mm feed data . model . Decorated Feed Page Ċ import Ġcom . g ch rist ov . news feed . k mm feed data . model . Section ed Feed Ċ import Ġcom . g ch rist ov . news feed . k mm feed data . use case .* Ċ import Ġcom . g ch rist ov . news feed . k mm feed test fixtures . Fake Feed Repository Ċ import Ġcom . g ch rist ov . news feed . k mm feed test fixtures . Feed Creator Ċ import Ġcom . g ch rist ov . news feed . km mp ost test fixtures . Fake Post Repository Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . datetime . Instant Ċ import Ġkotlin . test .* Ċ Ċ @ Experimental Cor outines Api Ċ class ĠFeed ViewModel Test Ġ: ĠCommon ViewModel TestClass () Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsearch Query Is De bounc ed On Expected Interval () Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Test Ġ{ ĠviewModel , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Search TextChanged (" te ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . search Query Ġ== Ġnull Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Search TextChanged (" text ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . search Query Ġ== Ġnull Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 3 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . search Query Ġ== Ġ" text " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinitial Loading Sets State () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠFake Response . Load s Fore ver ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Response Ġ= Ġresponse ) Ġ{ ĠviewModel , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . re ached End Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . blocking Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġre decor ating Sets Content () Ġ= Ġrun Test Ġ{ ĠviewModel , Ġ_, Ġpost Repository Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġvar Ġpost Ġ= ĠviewModel . state . value . section ed Feed !!. sections . first (). feed Items . first () ĊĠĠĠĠĠĠĠ Ġval Ġprev Timestamp Ġ= Ġpost . fav our ite Timestamp ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġpost Repository . toggle F avour ite ( post . raw . itemId ) ĊĠĠĠĠĠĠĠ ĠviewModel . re decorate Content () ĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġpost Ġ= ĠviewModel . state . value . section ed Feed !!. sections . first (). feed Items . first () ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġpost . fav our ite Timestamp Ġ!= Ġprev Timestamp Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrefresh ing Content Clear s Cache And Re loads () Ġ= Ġrun Test Ġ{ ĠviewModel , Ġfeed Repository , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfeed Repository . reset Current Page () ĊĠĠĠĠĠĠĠ Ġfeed Repository . feed Response Ġ= ĠFake Response . Load s Fore ver ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ ĠviewModel . refresh Content () ĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġfeed Repository . assert Cache Cle ared () ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . re ached End Ġ} ĊĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . blocking Error ) ĊĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload Next Page Re aches End () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠFeed Creator . single Page Feed () ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Pages Ġ= Ġfeed ) Ġ{ ĠviewModel , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Next Page ( start From First Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . re ached End Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload Next Page Load s More () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠFeed Creator . multi Page Feed () ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Pages Ġ= Ġfeed ) Ġ{ ĠviewModel , Ġfeed Repository , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository . feed Load More Response Ġ= ĠFake Response . Load s Fore ver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Next Page ( start From First Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . re ached End Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . blocking Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonLoad Success Sets Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠFeed Creator . single Page Feed (). first () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠFake Response . Load s Fore ver ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠSection ed Feed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsections Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . This Week , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġcache . items . sub List ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . Last Week , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġcache . items . sub List ( 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . This Month , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġcache . items . sub List ( 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . Ol der ( Instant . parse ( Feed Creator . Date Other Month )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġcache . items . sub List ( 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġrun Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Page Cache Ġ= Ġcache , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Response Ġ= Ġresponse ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĠviewModel , Ġfeed Repository , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository . assert Cache Cle ared () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġexpected , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= ĠviewModel . state . value . section ed Feed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . blocking Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonLoad Success Sets Correct State () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠFeed Creator . single Page Feed () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠSection ed Feed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsections Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . This Week , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġfeed . first (). items . sub List ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . Last Week , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġfeed . first (). items . sub List ( 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . This Month , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġfeed . first (). items . sub List ( 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSection ed Feed . Section ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSection ed Feed . Section Type . Ol der ( Instant . parse ( Feed Creator . Date Other Month )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Items Ġ= Ġfeed . first (). items . sub List ( 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Pages Ġ= Ġfeed ) Ġ{ ĠviewModel , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġexpected , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= ĠviewModel . state . value . section ed Feed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . blocking Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonLoad Error Sets Correct State () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" Error Ġmessage " ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠFake Response . Error ( errorMessage ) ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Response Ġ= Ġresponse ) Ġ{ ĠviewModel , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= ĠerrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= ĠviewModel . state . value . blocking Error ?. message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonLoad More Error Sets Correct State () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠFeed Creator . multi Page Feed () ĊĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" Error Ġmessage " ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠFake Response . Error ( errorMessage ) ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Pages Ġ= Ġfeed ) Ġ{ ĠviewModel , Ġfeed Repository , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository . feed Load More Response Ġ= Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Next Page ( start From First Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ ĠviewModel . state . value . loading More Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . blocking Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= ĠerrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= ĠviewModel . state . value . non Blocking Error ?. message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdis missing Non Blocking Error H ides It () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠFeed Creator . multi Page Feed () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠFake Response . Error (" Error Ġmessage ") ĊĠĠĠĠĠĠĠ Ġrun Test ( feed Pages Ġ= Ġfeed ) Ġ{ ĠviewModel , Ġfeed Repository , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository . feed Load More Response Ġ= Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Next Page ( start From First Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . dismiss Non Blocking Error () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( viewModel . state . value . non Blocking Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Test ( ĊĠĠĠĠĠĠĠ Ġfeed Pages : ĠList < Decorated Feed Page > Ġ= ĠFeed Creator . single Page Feed (), ĊĠĠĠĠĠĠĠ Ġfeed Page Cache : ĠDecor ated Feed Page ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġfeed Response : ĠFake Response Ġ= ĠFake Response . Comp letes Norm ally , ĊĠĠĠĠĠĠĠ Ġfeed Load More Response : ĠFake Response Ġ= ĠFake Response . Comp letes Norm ally , ĊĠĠĠĠĠĠĠ Ġtest Block : Ġsuspend ĠCor outine Scope .( Feed ViewModel , ĠFake Feed Repository , ĠFake Post Repository ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġtest Ġenvironment ĊĠĠĠĠĠĠĠ Ġval Ġpost Repository Ġ= ĠFake Post Repository () ĊĠĠĠĠĠĠĠ Ġval Ġfeed Repository Ġ= ĠFake Feed Repository ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Repository Ġ= Ġpost Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Pages Ġ= Ġfeed Pages , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Page Cache Ġ= Ġfeed Page Cache , ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . feed Response Ġ= Ġfeed Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . feed Load More Response Ġ= Ġfeed Load More Response ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġget Section ed Feed UseCase Ġ= ĠGet Section ed Feed UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository Ġ= Ġfeed Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Section ed Feed UseCase Ġ= ĠBuild Section ed Feed UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher Ġ= ĠFake Coroutine Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclock Ġ= ĠFake Clock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Section ed Feed UseCase Ġ= ĠMerge Section ed Feed UseCase ( dispatcher Ġ= ĠFake Coroutine Dispatcher ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġre decorate Section ed Feed UseCase Ġ= ĠRe decorate Section ed Feed UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository Ġ= Ġfeed Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflatten Section ed Feed UseCase Ġ= ĠFlat ten Section ed Feed UseCase ( dispatcher Ġ= ĠFake Coroutine Dispatcher ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Section ed Feed UseCase Ġ= ĠBuild Section ed Feed UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher Ġ= ĠFake Coroutine Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclock Ġ= ĠFake Clock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĠFeed ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher Ġ= ĠFake Coroutine Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeed Repository Ġ= Ġfeed Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Section ed Feed UseCase Ġ= Ġget Section ed Feed UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre decorate Section ed Feed UseCase Ġ= Ġre decorate Section ed Feed UseCase ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Block ( viewModel , Ġfeed Repository , Ġpost Repository ) ĊĠĠĠ Ġ} Ċ } Ċ