/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠI ce Rock ĠMAG ĠInc . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġdev . icer ock . mo ko . paging Ċ Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . request . get Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠIntegration Tests Ġ: ĠBase Tests Class () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠhttpClient Ġ= ĠHttpClient () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparallel Requests () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpagination Ġ= ĠPagination < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Scope Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= ĠLambda Paged List DataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" start Ġload Ġnew Ġpage Ġwith Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Jo ke : ĠString Ġ= ĠhttpClient . get (" http :// api . ic n db . com / j okes / random ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" respond Ġnew Ġitem Ġ$ random Jo ke ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( random Jo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomparator Ġ= ĠComparator Ġ{ Ġa , Ġb Ġ-> Ġa . compareTo ( b ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Listener Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Listener Ġ= Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --- ĠI TER ATION Ġ$ i ĠSTART Ġ--- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" start Ġload Ġfirst Ġpage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . load First Page Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" end Ġload Ġfirst Ġpage ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 3 ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --> Ġ$ it Ġrefresh Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . refresh Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("< -- Ġ$ it Ġrefresh Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --> Ġ$ it Ġload Ġnext Ġpage Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . load Next Page Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("< -- Ġ$ it Ġload Ġnext Ġpage Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġit . await () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparallel Requests AndSet Data () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpagination Ġ= ĠPagination < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Scope Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= ĠLambda Paged List DataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" start Ġload Ġnew Ġpage Ġwith Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Jo ke : ĠString Ġ= ĠhttpClient . get (" http :// api . ic n db . com / j okes / random ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" respond Ġnew Ġitem Ġ$ random Jo ke ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( random Jo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomparator Ġ= ĠComparator Ġ{ Ġa , Ġb Ġ-> Ġa . compareTo ( b ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Listener Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Listener Ġ= Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --- ĠI TER ATION Ġ$ i ĠSTART Ġ--- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" start Ġload Ġfirst Ġpage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . load First Page Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" end Ġload Ġfirst Ġpage ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 1 ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --> Ġ$ it Ġrefresh Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . refresh Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("< -- Ġ$ it Ġrefresh Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --> Ġ$ it Ġload Ġnext Ġpage Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . load Next Page Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("< -- Ġ$ it Ġload Ġnext Ġpage Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --> Ġ$ it Ġset Ġdata Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġpagination . state . value . data Value (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= Ġdata . plus (" new Ġitem ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . setData Suspend ( new Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" --> Ġ$ it Ġset Ġdata Ġend ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġit . await () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclosing Scope () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexc Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpagination Ġ= ĠPagination < String >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Scope Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Ġ= ĠLambda Paged List DataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" start Ġload Ġnew Ġpage Ġwith Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Jo ke : ĠString Ġ= ĠhttpClient . get (" http :// api . ic n db . com / j okes / random ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" respond Ġnew Ġitem Ġ$ random Jo ke ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( random Jo ke ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomparator Ġ= ĠComparator Ġ{ Ġa , Ġb Ġ-> Ġa . compareTo ( b ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Listener Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Listener Ġ= Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" start Ġload ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpagination . load First Page Suspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" end Ġload ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" cancel Ġscope ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( exc ) ĊĠĠĠ Ġ} Ċ }