package Ġcom . ud acity . project 4 . location rem inders . rem inders list Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . fragment . app . testing . launch Fragment In Container Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Navigation Ċ import Ġandroidx . test . core . app . Application Provider . getApplicationContext Ċ import Ġandroidx . test . espress o . Esp ress o . on View Ċ import Ġandroidx . test . espress o . Id ling Registry Ċ import Ġandroidx . test . espress o . action . View Actions . click Ċ import Ġandroidx . test . espress o . assertion . View Assertions . matches Ċ import Ġandroidx . test . espress o . matcher . View Matchers .* Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Medium Test Ċ import Ġcom . ud acity . project 4 . R Ċ import Ġcom . ud acity . project 4 . location rem inders . data . Reminder DataSource Ċ import Ġcom . ud acity . project 4 . location rem inders . data . dto . Reminder DTO Ċ import Ġcom . ud acity . project 4 . location rem inders . data . local . Fake Android DataSource Ċ import Ġcom . ud acity . project 4 . location rem inders . data . local . Local DB Ċ import Ġcom . ud acity . project 4 . location rem inders . data . local . Rem inders Local Repository Ċ import Ġcom . ud acity . project 4 . location rem inders . sa ver em inder . Save Reminder ViewModel Ċ import Ġcom . ud acity . project 4 . util . Data Binding Id ling Resource Ċ import Ġcom . ud acity . project 4 . utils . Esp ress o Id ling Resource Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . k oin . android x . view model . dsl . viewModel Ċ import Ġorg . k oin . core . context . start K oin Ċ import Ġorg . k oin . core . context . stop K oin Ċ import Ġorg . k oin . dsl . module Ċ import Ġorg . mockito . Mockito . mock Ċ import Ġorg . mockito . Mockito . verify Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Experimental Cor outines Api Ċ // UI ĠTesting Ċ @ Medium Test Ċ class ĠRem inder List Fragment Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠRem inder DataSource ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Context : ĠApplication ĊĊĠĠĠ Ġ// ĠAn ĠId ling ĠResource Ġthat Ġwaits Ġfor ĠData ĠBinding Ġto Ġhave Ġno Ġpending Ġbindings ĊĠĠĠ Ġprivate Ġval Ġdata Binding Id ling Resource Ġ= ĠData Binding Id ling Resource () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop K oin () // stop Ġthe Ġoriginal Ġapp Ġk oin ĊĠĠĠĠĠĠĠ Ġapp Context Ġ= Ġget ApplicationContext () ĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠFake Android DataSource () // Get Ġour Ġfake Ġrepository ĊĠĠĠĠĠĠĠ Ġval Ġmy Module Ġ= Ġmodule Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRem inders List ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSave Reminder ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġas ĠRem inder DataSource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ ĠRem inders Local Repository ( get ()) Ġas ĠRem inder DataSource Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Ġ{ ĠLocal DB . create Rem inders Dao ( app Context ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// declare Ġa Ġnew Ġk oin Ġmodule ĊĠĠĠĠĠĠĠ Ġstart K oin Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules ( listOf ( my Module )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// clear Ġthe Ġdata Ġto Ġstart Ġfresh ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . delete All Rem inders () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠId ling Ġresources Ġtell ĠE sp ress o Ġthat Ġthe Ġapp Ġis Ġidle Ġor Ġbusy . ĠThis Ġis Ġneeded Ġwhen Ġoperations ĊĠĠĠĠ Ġ* Ġare Ġnot Ġscheduled Ġin Ġthe Ġmain ĠL ooper Ġ( for Ġexample Ġwhen Ġexecuted Ġon Ġa Ġdifferent Ġthread ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġregister Id ling Resource () Ġ{ ĊĠĠĠĠĠĠĠ ĠId ling Registry . getInstance (). register ( Esp ress o Id ling Resource . count ing Id ling Resource ) ĊĠĠĠĠĠĠĠ ĠId ling Registry . getInstance (). register ( data Binding Id ling Resource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn register Ġyour ĠId ling ĠResource Ġso Ġit Ġcan Ġbe Ġgarbage Ġcollected Ġand Ġdoes Ġnot Ġleak Ġany Ġmemory . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġunregister Id ling Resource () Ġ{ ĊĠĠĠĠĠĠĠ ĠId ling Registry . getInstance (). unregister ( Esp ress o Id ling Resource . count ing Id ling Resource ) ĊĠĠĠĠĠĠĠ ĠId ling Registry . getInstance (). unregister ( data Binding Id ling Resource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclick Add Reminder Button _ navigate To Save Reminder Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Scenario Ġ= Ġlaunch Fragment In Container < Reminder List Fragment >( Bundle (), ĠR . style . App Theme ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġmock ( Nav Controller :: class . java ) ĊĠĠĠĠĠĠĠ Ġfragment Scenario . on Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Binding Id ling Resource . activity Ġ= Ġit . activity !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . setView Nav Controller ( it . view !! , Ġnav Controller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . add Reminder FAB )). perform ( click ()) ĊĊĠĠĠĠĠĠĠ Ġverify ( nav Controller ). navigate ( Reminder List Fragment Directions . to Save Reminder ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshows Loaded Reminder () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreminder 1 Ġ= ĠRem inder DTO ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" title 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" description 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" location 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 5 . 5 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 4 . 4 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Reminder ( reminder 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Scenario Ġ= Ġlaunch Fragment In Container < Reminder List Fragment >( Bundle (), ĠR . style . App Theme ) ĊĠĠĠĠĠĠĠ Ġfragment Scenario . on Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Binding Id ling Resource . activity Ġ= Ġit . activity !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . reminder Card View )). check ( matches ( is Displayed ())) ĊĠĠĠĠĠĠĠ Ġon View ( with Text (" title 1 ")). check ( matches ( is Displayed ())) ĊĠĠĠĠĠĠĠ Ġon View ( with Text (" description 1 ")). check ( matches ( is Displayed ())) ĊĠĠĠĠĠĠĠ Ġon View ( with Text (" location 1 ")). check ( matches ( is Displayed ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshows Error In Snackbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( repository Ġas ĠFake Android DataSource ). set Return Error ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Scenario Ġ= Ġlaunch Fragment In Container < Reminder List Fragment >( Bundle (), ĠR . style . App Theme ) ĊĠĠĠĠĠĠĠ Ġfragment Scenario . on Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Binding Id ling Resource . activity Ġ= Ġit . activity !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . reminder ss RecyclerView )). check ( matches ( is Displayed ())) ĊĠĠĠĠĠĠĠ Ġon View ( with Id ( com . google . android . material . R . id . sn ackbar _ text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( matches ( with Text (" ERROR : Fake Android DataSource : get Rem inders () "))) ĊĠĠĠ Ġ} Ċ Ċ }