package Ġcom . am ino graphy . data Ċ Ċ import Ġandroidx . paging . Paging Data Ċ import Ġcom . am ino graphy . data . city . City Repository Impl Ċ import Ġcom . am ino graphy . data . city . datasource . City DataSource Ċ import Ġcom . am ino graphy . data . city . paging . City Paging Factory Ċ import Ġcom . am ino graphy . domain . city . util . key Ċ import Ġcom . am ino graphy . model . city . City Ċ import Ġcom . am ino graphy . test . Coroutine Test Ċ import Ġcom . am ino graphy . test . test C ities Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Sequence Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ Ċ /** Ċ Ġ* Ġ@ author Ġa mino graphy Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠCity Repository Impl Test Ġ: ĠCor outine Test () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcity DataSource : ĠCity DataSource Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġpaging Factory : ĠCity Paging Factory Ġ= Ġmock k () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` loading Ġdistinct Ġcities Ġshould Ġinsert Ġall Ġof Ġthem Ġinto Ġtree `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġtest C ities ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcity DataSource . load City List Concurrent ly () Ġ} Ġreturns Ġtest C ities ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Repository Ġ= ĠCity Repository Impl ( city DataSource , Ġpaging Factory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcity Repository . load C ities () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcity Repository . cache ?. values . or Empty () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( result . size , Ġexpected . size ) ĊĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity DataSource . load City List Concurrent ly () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` loading Ġcities Ġshould Ġdrop Ġduplicated Ġelements Ġin Ġtree `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( test C ities [ 0 ]) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcity DataSource . load City List Concurrent ly () Ġ} Ġreturns ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest C ities [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest C ities [ 0 ]. copy () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Repository Ġ= ĠCity Repository Impl ( city DataSource , Ġpaging Factory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcity Repository . load C ities () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcity Repository . cache ?. values . or Empty () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( result , Ġexpected ) ĊĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity DataSource . load City List Concurrent ly () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` search Ġcities Ġshould Ġreturn Ġa Ġempty ĠP aging Data Ġif Ġcache Ġis Ġnull `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ" test " ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠP aging Data . empty < City >() ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Repository Ġ= ĠCity Repository Impl ( city DataSource , Ġpaging Factory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcity Repository . search C ities ( query ). toList () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( result . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertSame ( result [ 0 ], Ġexpected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` search Ġcities Ġshould Ġreturn Ġflow Ġof ĠP aging Data Ġwhen Ġcache Ġisn 't Ġnull `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġtest C ities [ 0 ]. key ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠP aging Data . from ( listOf ( test C ities [ 0 ])) ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcity DataSource . load City List Concurrent ly () Ġ} Ġreturns Ġtest C ities ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġpaging Factory . create Paging Data Flow ( any (), Ġquery ) Ġ} Ġreturns Ġflow Of ( expected ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Repository Ġ= ĠCity Repository Impl ( city DataSource , Ġpaging Factory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġcity Repository . load C ities () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcity Repository . search C ities ( query ). toList () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertEquals ( result . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertSame ( result [ 0 ], Ġexpected ) ĊĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcity DataSource . load City List Concurrent ly () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging Factory . create Paging Data Flow ( any (), Ġquery ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }