package Ġcom . el ih im as . mov ied atabase Ċ Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . paging . Paging Data Ċ import Ġcom . el ih im as . mov ied atabase . model . Genre Ċ import Ġcom . el ih im as . mov ied atabase . model . Movie Ċ import Ġcom . el ih im as . mov ied atabase . repository . Movies Repository Ċ import Ġcom . el ih im as . mov ied atabase . view models . Movies List ViewModel Ċ import Ġcom . el ih im as . mov ied atabase . view models . states . Movies List State Ċ import Ġio . mock k .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . test .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Test Watcher Ċ import Ġorg . junit . runner . Description Ċ Ċ @ Experimental Cor outines Api Ċ class ĠMain Dispatcher Rule ( private Ġval Ġdispatcher : ĠTest Dispatcher Ġ= ĠStandard Test Dispatcher ()) Ġ: ĊĠĠĠ ĠTest Watcher () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġstarting ( description : ĠDescription ?) Ġ= ĠDispatch ers . set Main ( dispatcher ) ĊĊĠĠĠ Ġoverride Ġfun Ġfinished ( description : ĠDescription ?) Ġ= ĠDispatch ers . reset Main () Ċ Ċ } Ċ Ċ class ĠMov ies List ViewModel Test Ġ: ĠBase ViewModel Test () Ġ{ ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġmain Dispatcher Rule Ġ= ĠMain Dispatcher Rule () ĊĊĠĠĠ Ġprivate Ġval Ġrepository Ġ= Ġmock k < Movies Repository >() ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġ= ĠMov ies List ViewModel ( repository ) ĊĊĠĠĠ Ġprivate Ġval Ġaction Movies Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠMovie ( 1 0 , Ġ" First ĠB lood ", Ġ" First ĠB lood Ġoverview ", Ġ"/ first Blood Post er "), ĊĠĠĠĠĠĠĠ ĠMovie ( 1 2 , Ġ" Die ĠHard ", Ġ" Die ĠHard Ġoverview ", Ġ"/ die Hard Post er "), ĊĠĠĠĠĠĠĠ ĠMovie ( 4 5 , Ġ" The ĠTermin ator ", Ġ" The ĠTermin ator Ġoverview ", Ġ"/ termin ator Post er "), ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġaction Paging Data Ġ= ĠP aging Data . from ( action Movies ) ĊĠĠĠ Ġprivate Ġval Ġempty Paging Data Ġ= ĠP aging Data . empty < Movie >() ĊĊĠĠĠ Ġprivate Ġval Ġnothing Found Query Ġ= Ġ" nothing Ġfound Ġquery " ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . load Genre Movies ( Genre . ACTION ) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( action Paging Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġrepository . search Movies ( nothing Found Query ) Ġ} Ġreturns Ġflow Ġ{ Ġemit ( empty Paging Data ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġload Ġby Ġgenre Ġshould Ġload Ġthe Ġmovies Ġof Ġthe Ġgenre `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġmock k < Observer < Movies List State >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠonChanged ( any ()) Ġ} Ġjust Ġruns ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . getCurrent State (). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . load Genre Movies ( Genre . ACTION ) ĊĊĠĠĠĠĠĠĠ Ġverify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( Movies List State . Loading State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( Movies List State . Movies Loaded State ( action Paging Data )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġsearching Ġfor Ġa Ġquery Ġwith Ġno Ġresult Ġshould Ġchange Ġto Ġnothing Ġfound `() Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġmock k < Observer < Movies List State >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠonChanged ( any ()) Ġ} Ġjust Ġruns ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . getCurrent State (). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . search Movies ( nothing Found Query ) ĊĊĠĠĠĠĠĠĠ Ġverify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( Movies List State . Loading State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( Movies List State . Nothing Found ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }