// package Ġcom . notes ync . notes . bu is ness . inter actors . splash Ċ // Ċ // import Ġcom . notes ync . notes . business . data . cache . ab straction . Note Cache DataSource Ċ // import Ġcom . notes ync . notes . business . data . network . ab straction . Note Network DataSource Ċ // import Ġcom . notes ync . notes . business . domain . model . Note Ċ // import Ġcom . notes ync . notes . business . domain . model . Note Factory Ċ // import Ġcom . notes ync . notes . business . domain . util . Date Util Ċ // import Ġcom . notes ync . notes . business . inter actors . splash . Sync Notes Ċ // import Ġcom . notes ync . notes . di . Dependency Injector Ċ // import Ġcom . notes ync . notes . framework . dataSource . cache . database . ORDER _ BY _ ASC _ DATE _ UPDATED Ċ // import Ġkotlinx . coroutines . Internal Cor outines Api Ċ // import Ġkotlinx . coroutines . delay Ċ // import Ġkotlinx . coroutines . run Blocking Ċ // import Ġorg . junit . jupiter . api . Assertions .* Ċ // import Ġorg . junit . jupiter . api . Test Ċ // import Ġjava . util .* Ċ // import Ġkotlin . collections . ArrayList Ċ // Ċ // Ċ // /* Ċ // Test Ġcases : Ċ // 1 . Ġinsert Network Notes Into Cache () Ċ // ĠĠĠ Ġa ) Ġinsert Ġa Ġbunch Ġof Ġnew Ġnotes Ġinto Ġthe Ġcache Ċ // ĠĠĠ Ġb ) Ġperform Ġthe Ġsync Ċ // ĠĠĠ Ġc ) Ġcheck Ġto Ġsee Ġthat Ġthose Ġnotes Ġwere Ġinserted Ġinto Ġthe Ġnetwork Ċ // 2 . Ġinsert Cached Notes Into Network () Ċ // ĠĠĠ Ġa ) Ġinsert Ġa Ġbunch Ġof Ġnew Ġnotes Ġinto Ġthe Ġnetwork Ċ // ĠĠĠ Ġb ) Ġperform Ġthe Ġsync Ċ // ĠĠĠ Ġc ) Ġcheck Ġto Ġsee Ġthat Ġthose Ġnotes Ġwere Ġinserted Ġinto Ġthe Ġcache Ċ // 3 . Ġcheck Cache Update Logic Sync () Ċ // ĠĠĠ Ġa ) Ġselect Ġsome Ġnotes Ġfrom Ġthe Ġcache Ġand Ġupdate Ġthem Ċ // ĠĠĠ Ġb ) Ġperform Ġsync Ċ // ĠĠĠ Ġc ) Ġconfirm Ġnetwork Ġreflect s Ġthe Ġupdates Ċ // 4 . Ġcheck Network Update Logic Sync () Ċ // ĠĠĠ Ġa ) Ġselect Ġsome Ġnotes Ġfrom Ġthe Ġnetwork Ġand Ġupdate Ġthem Ċ // ĠĠĠ Ġb ) Ġperform Ġsync Ċ // ĠĠĠ Ġc ) Ġconfirm Ġcache Ġreflect s Ġthe Ġupdates Ċ // Ġ*/ Ċ // Ċ //@ Internal Cor outines Api Ċ // class ĠSync Notes Test Ġ{ Ċ // Ċ // ĠĠĠ Ġ// Ġsystem Ġin Ġtest Ċ // ĠĠĠ Ġprivate Ġval Ġsync Notes : ĠSync Notes Ċ // Ċ // ĠĠĠ Ġ// Ġdependencies Ċ // ĠĠĠ Ġprivate Ġval Ġdependency Container : ĠDependency Injector Ċ // ĠĠĠ Ġprivate Ġval Ġnote Cache DataSource : ĠNote Cache DataSource Ċ // ĠĠĠ Ġprivate Ġval Ġnote Network DataSource : ĠNote Network DataSource Ċ // ĠĠĠ Ġprivate Ġval Ġnote Factory : ĠNote Factory Ċ // ĠĠĠ Ġprivate Ġval Ġdate Util : Date Util Ċ // Ċ // ĠĠĠ Ġinit Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġdependency Container Ġ= ĠDependency Injector () Ċ // ĠĠĠĠĠĠĠ Ġdependency Container . build () Ċ // ĠĠĠĠĠĠĠ Ġnote Cache DataSource Ġ= Ġdependency Container . note Cache DataSource Ċ // ĠĠĠĠĠĠĠ Ġnote Network DataSource Ġ= Ġdependency Container . note Network DataSource Ċ // ĠĠĠĠĠĠĠ Ġnote Factory Ġ= Ġdependency Container . note Factory Ċ // ĠĠĠĠĠĠĠ Ġdate Util Ġ= Ġdependency Container . date Util Ċ // ĠĠĠĠĠĠĠ Ġsync Notes Ġ= ĠSync Notes ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnote Cache DataSource Ġ= Ġnote Cache DataSource , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnote Network DataSource Ġ= Ġnote Network DataSource , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Container . date Util Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġdo Success ive Updates Occ ur () Ġ= Ġrun Blocking Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġupdate Ġa Ġsingle Ġnote Ġwith Ġnew Ġtimestamp Ċ // ĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= Ġdate Util . getCurrent Timestamp () Ċ // ĠĠĠĠĠĠĠ Ġval Ġupdated Note Ġ= ĠNote ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). id , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). title , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). body , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcreated _ at Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). created _ at , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġupdated _ at Ġ= Ġnew Date Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġnote Network DataSource . insert OrUpdate Note ( updated Note ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 1 ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġsimulate Ġlaunch Ġapp Ġagain Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconfirm Ġthe Ġdate Ġwas Ġnot Ġupdated Ġa Ġsecond Ġtime Ċ // ĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġnote Network DataSource . getAll Notes () Ċ // ĠĠĠĠĠĠĠ Ġfor ( note Ġin Ġnotes ){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif ( note . id . equals ( updated Note . id )){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġnote . updated _ at . equals ( new Date ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġcheck UpdatedAt Dates () Ġ= Ġrun Blocking Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġupdate Ġa Ġsingle Ġnote Ġwith Ġnew Ġtimestamp Ċ // ĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= Ġdate Util . getCurrent Timestamp () Ċ // ĠĠĠĠĠĠĠ Ġval Ġupdated Note Ġ= ĠNote ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). id , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). title , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). body , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcreated _ at Ġ= Ġnote Network DataSource . getAll Notes (). get ( 0 ). created _ at , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġupdated _ at Ġ= Ġnew Date Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġnote Network DataSource . insert OrUpdate Note ( updated Note ) Ċ // Ċ //// ĠĠĠĠĠĠĠ Ġfor ( note Ġin Ġnote Network DataSource . getAll Notes ()){ Ċ //// ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" date : Ġ${ note . updated _ at }") Ċ //// ĠĠĠĠĠĠĠ Ġ} Ċ //// ĠĠĠĠĠĠĠ Ġprintln (" BREAK ") Ċ // Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconfirm Ġonly Ġa Ġsingle Ġ' updated _ at ' Ġdate Ġwas Ġupdated Ċ // ĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġnote Network DataSource . getAll Notes () Ċ // ĠĠĠĠĠĠĠ Ġfor ( note Ġin Ġnotes ){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnote Cache DataSource . search Note ById ( note . id )?. let Ġ{ Ġn Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" date : Ġ${ n . updated _ at }") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( n . id . equals ( updated Note . id )){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġn . updated _ at . equals ( new Date ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse { Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse Ġ{ Ġn . updated _ at . equals ( new Date ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġinsert Network Notes Into Cache () Ġ= Ġrun Blocking Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġprepare Ġthe Ġscenario Ċ // ĠĠĠĠĠĠĠ Ġ// Ġ-> ĠNotes Ġin Ġnetwork Ġare Ġnewer Ġso Ġthey Ġmust Ġbe Ġinserted Ġinto Ġcache Ċ // ĠĠĠĠĠĠĠ Ġval Ġnew Notes Ġ= Ġnote Factory . create Note List ( 5 0 ) Ċ // ĠĠĠĠĠĠĠ Ġnote Network DataSource . insert OrUpdate Notes ( new Notes ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġperform Ġthe Ġsync Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconfirm Ġthe Ġnew Ġnotes Ġwere Ġinserted Ġinto Ġcache Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( note Ġin Ġnew Notes ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Note Ġ= Ġnote Cache DataSource . search Note ById ( note . id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġcached Note Ġ!= Ġnull Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġinsert Cached Notes Into Network () Ġ= Ġrun Blocking Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġprepare Ġthe Ġscenario Ċ // ĠĠĠĠĠĠĠ Ġ// Ġ-> ĠNotes Ġin Ġcache Ġare Ġnewer Ġso Ġthey Ġmust Ġbe Ġinserted Ġinto Ġnetwork Ċ // ĠĠĠĠĠĠĠ Ġval Ġnew Notes Ġ= Ġnote Factory . create Note List ( 5 0 ) Ċ // ĠĠĠĠĠĠĠ Ġnote Cache DataSource . insert Notes ( new Notes ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġperform Ġthe Ġsync Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconfirm Ġthe Ġnew Ġnotes Ġwere Ġinserted Ġinto Ġnetwork Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( note Ġin Ġnew Notes ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Note Ġ= Ġnote Network DataSource . search Note ( note ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġnetwork Note Ġ!= Ġnull Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġcheck Cache Update Logic Sync () Ġ= Ġrun Blocking Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġselect Ġa Ġfew Ġnotes Ġfrom Ġcache Ġand Ġupdate Ġthe Ġtitle Ġand Ġbody Ċ // ĠĠĠĠĠĠĠ Ġval Ġcached Notes Ġ= Ġnote Cache DataSource . search Notes ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ= Ġ"", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfilter And Order Ġ= ĠORDER _ BY _ ASC _ DATE _ UPDATED , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġpage Ġ= Ġ 1 Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġnotes ToUpdate : ĠArrayList < Note > Ġ= ĠArrayList () Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( note Ġin Ġcached Notes ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Note Ġ= Ġnote Factory . create Single Note ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġnote . id , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠUUID . randomUUID (). toString (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠUUID . randomUUID (). toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnotes ToUpdate . add ( updated Note ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notes ToUpdate . size Ġ> Ġ 3 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġnote Cache DataSource . insert Notes ( notes ToUpdate ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġperform Ġsync Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconfirm Ġthe Ġupdated Ġnotes Ġwere Ġupdated Ġin Ġthe Ġnetwork Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( note Ġin Ġnotes ToUpdate ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Note Ġ= Ġnote Network DataSource . search Note ( note ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . id , Ġnetwork Note ?. id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . title , Ġnetwork Note ?. title ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . body , Ġnetwork Note ?. body ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . updated _ at , Ġnetwork Note ?. updated _ at ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġcheck Network Update Logic Sync () Ġ= Ġrun Blocking Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġselect Ġa Ġfew Ġnotes Ġfrom Ġnetwork Ġand Ġupdate Ġthe Ġtitle Ġand Ġbody Ċ // ĠĠĠĠĠĠĠ Ġval Ġnetwork Notes Ġ= Ġnote Network DataSource . getAll Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġnotes ToUpdate : ĠArrayList < Note > Ġ= ĠArrayList () Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( note Ġin Ġnetwork Notes ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Note Ġ= Ġnote Factory . create Single Note ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġnote . id , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠUUID . randomUUID (). toString (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠUUID . randomUUID (). toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnotes ToUpdate . add ( updated Note ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notes ToUpdate . size Ġ> Ġ 3 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġnote Network DataSource . insert OrUpdate Notes ( notes ToUpdate ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġperform Ġsync Ċ // ĠĠĠĠĠĠĠ Ġsync Notes . sync Notes () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconfirm Ġthe Ġupdated Ġnotes Ġwere Ġupdated Ġin Ġthe Ġcache Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( note Ġin Ġnotes ToUpdate ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Note Ġ= Ġnote Cache DataSource . search Note ById ( note . id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . id , Ġcache Note ?. id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . title , Ġcache Note ?. title ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . body , Ġcache Note ?. body ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( note . updated _ at , Ġcache Note ?. updated _ at ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ //}