package Ġcom . example . android . architecture . blueprint s . todo app . data . source Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . map Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Result Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Task Ċ import Ġkotlinx . coroutines . run Blocking Ċ Ċ class ĠFake Android Test Repository Ġ: ĠTasks Repository Ġ{ ĊĊĠĠĠ Ġvar Ġtasks Service Data : ĠLinkedHashMap < String , ĠTask > Ġ= ĠLinkedHashMap () ĊĊĠĠĠ Ġprivate Ġvar Ġshould Return Error Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġobservable Tasks Ġ= ĠMutable LiveData < Result < List < Task >> >() ĊĊĠĠĠ Ġfun Ġset Return Error ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Return Error Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Tasks ( force Update : ĠBoolean ): ĠResult < List < Task >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( should Return Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Error ( Exception (" Test ĠException ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( tasks Service Data . values . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrefresh Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġobservable Tasks . value Ġ= Ġget Tasks () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Tasks (): ĠLive Data < Result < List < Task >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġrefresh Tasks () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġobservable Tasks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrefresh Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Tasks () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Task ( taskId : ĠString ): ĠLive Data < Result < Task >> Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġrefresh Tasks () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġobserve Tasks (). map Ġ{ Ġtasks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( tasks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Loading Ġ-> ĠResult . Loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error Ġ-> ĠResult . Error ( tasks . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġtasks . data . first OrNull () Ġ{ Ġit . id Ġ== ĠtaskId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ map ĠResult . Error ( Exception (" Not Ġfound ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Task ( taskId : ĠString , Ġforce Update : ĠBoolean ): ĠResult < Task > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( should Return Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Error ( Exception (" Test ĠException ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtasks Service Data [ taskId ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Success ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResult . Error ( Exception (" Couldn 't Ġfind ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave Task ( task : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Service Data [ task . id ] Ġ= Ġtask ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcomplete Task ( task : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Service Data [ task . id ] Ġ= Ġtask . copy ( is Completed Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcomplete Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġactivate Task ( task : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Service Data [ task . id ] Ġ= Ġtask . copy ( is Completed Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġactivate Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclear Completed Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Service Data Ġ= Ġtasks Service Data . filter Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . is Completed ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠLinkedHashMap < String , ĠTask > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete All Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Service Data . clear () ĊĠĠĠĠĠĠĠ Ġrefresh Tasks () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Service Data . remove ( taskId ) ĊĠĠĠĠĠĠĠ Ġrefresh Tasks () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Tasks ( var arg Ġtasks : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks Service Data [ it . id ] Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġrefresh Tasks () Ġ} ĊĠĠĠ Ġ} Ċ }