/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġ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 Ġcom . example . android . architecture . blueprint s . todo app . task detail Ċ Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġcom . example . android . architecture . blueprint s . todo app . Main Coroutine Rule Ċ import Ġcom . example . android . architecture . blueprint s . todo app . R Ċ import Ġcom . example . android . architecture . blueprint s . todo app . Todo Dest inations Args Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Result . Success Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Task Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . source . Fake Repository Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . test . Standard Test Dispatcher Ċ import Ġkotlinx . coroutines . test . advance Until Idle Ċ import Ġkotlinx . coroutines . test . run Test Ċ import Ġkotlinx . coroutines . test . set Main Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ Ċ /** Ċ Ġ* ĠUnit Ġtests Ġfor Ġthe Ġimplementation Ġof Ġ[ Task Detail ViewModel ] Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ class ĠTask Detail ViewModel Test Ġ{ ĊĊĠĠĠ Ġ// ĠSet Ġthe Ġmain Ġcor outines Ġdispatcher Ġfor Ġunit Ġtesting . ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġmain Coroutine Rule Ġ= ĠMain Coroutine Rule () ĊĊĠĠĠ Ġ// ĠSubject Ġunder Ġtest ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtask Detail ViewModel : ĠTask Detail ViewModel ĊĊĠĠĠ Ġ// ĠUse Ġa Ġfake Ġrepository Ġto Ġbe Ġinjected Ġinto Ġthe Ġview model ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtasks Repository : ĠFake Repository ĊĠĠĠ Ġprivate Ġval Ġtask Ġ= ĠTask ( title Ġ= Ġ" Title 1 ", Ġdescription Ġ= Ġ" Description 1 ", Ġid Ġ= Ġ" 0 ") ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Repository Ġ= ĠFake Repository () ĊĠĠĠĠĠĠĠ Ġtasks Repository . add Tasks ( task ) ĊĊĠĠĠĠĠĠĠ Ġtask Detail ViewModel Ġ= ĠTask Detail ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSaved State Handle ( map Of ( Todo Dest inations Args . TASK _ ID _ ARG Ġto Ġ" 0 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Active Task From Repository And Load Into View () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġui State Ġ= Ġtask Detail ViewModel . ui State . first () ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġverify Ġthat Ġthe Ġview Ġwas Ġnotified ĊĠĠĠĠĠĠĠ ĠassertThat ( ui State . task ?. title ). isEqualTo ( task . title ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ui State . task ?. description ). isEqualTo ( task . description ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcomplete Task () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthe Ġtask Ġwas Ġactive Ġinitially ĊĠĠĠĠĠĠĠ ĠassertThat ( tasks Repository . saved Tasks . value [ task . id ]?. is Completed ). isFalse () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe ĠViewModel Ġis Ġasked Ġto Ġcomplete Ġthe Ġtask ĊĠĠĠĠĠĠĠ ĠassertThat ( task Detail ViewModel . ui State . first (). task ?. id ). isEqualTo (" 0 ") ĊĠĠĠĠĠĠĠ Ġtask Detail ViewModel . set Completed ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġtask Ġis Ġcompleted Ġand Ġthe Ġsn ackbar Ġshows Ġthe Ġcorrect Ġmessage ĊĠĠĠĠĠĠĠ ĠassertThat ( tasks Repository . saved Tasks . value [ task . id ]?. is Completed ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat ( task Detail ViewModel . ui State . first (). user Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( R . string . task _ marked _ complete ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġactivate Task () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġtask . is Completed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthe Ġtask Ġwas Ġcompleted Ġinitially ĊĠĠĠĠĠĠĠ ĠassertThat ( tasks Repository . saved Tasks . value [ task . id ]?. is Completed ). isTrue () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe ĠViewModel Ġis Ġasked Ġto Ġcomplete Ġthe Ġtask ĊĠĠĠĠĠĠĠ ĠassertThat ( task Detail ViewModel . ui State . first (). task ?. id ). isEqualTo (" 0 ") ĊĠĠĠĠĠĠĠ Ġtask Detail ViewModel . set Completed ( false ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġtask Ġis Ġnot Ġcompleted Ġand Ġthe Ġsn ackbar Ġshows Ġthe Ġcorrect Ġmessage ĊĠĠĠĠĠĠĠ Ġval Ġnew Task Ġ= Ġ( tasks Repository . get Task ( task . id ) Ġas ĠSuccess ). data ĊĠĠĠĠĠĠĠ ĠassertTrue ( new Task . isActive ) ĊĠĠĠĠĠĠĠ ĠassertThat ( task Detail ViewModel . ui State . first (). user Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( R . string . task _ marked _ active ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Detail ViewModel _ repository Error () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġrepository Ġthat Ġreturns Ġerrors ĊĠĠĠĠĠĠĠ Ġtasks Repository . set Return Error ( true ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( task Detail ViewModel . ui State . value . task ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete Task () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( tasks Repository . saved Tasks . value . contains Value ( task )). isTrue () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġdeletion Ġof Ġa Ġtask Ġis Ġrequested ĊĠĠĠĠĠĠĠ Ġtask Detail ViewModel . delete Task () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( tasks Repository . saved Tasks . value . contains Value ( task )). isFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload Task _ loading () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet ĠMain Ġdispatcher Ġto Ġnot Ġrun Ġcor outines Ġeager ly , Ġfor Ġjust Ġthis Ġone Ġtest ĊĠĠĠĠĠĠĠ ĠDispatch ers . set Main ( Standard Test Dispatcher ()) ĊĊĠĠĠĠĠĠĠ Ġvar ĠisLoading : ĠBoolean ? Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Detail ViewModel . ui State . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġit . isLoading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġprogress Ġindicator Ġis Ġshown ĊĠĠĠĠĠĠĠ ĠassertThat ( isLoading ). isTrue () ĊĊĠĠĠĠĠĠĠ Ġ// ĠExecute Ġpending Ġcor outines Ġactions ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġprogress Ġindicator Ġis Ġhidden ĊĠĠĠĠĠĠĠ ĠassertThat ( isLoading ). isFalse () ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} Ċ } Ċ