/* Ċ Ġ* ĠCopyright Ġ 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 Ġandroidx . paging Ċ Ċ import Ġandroidx . paging . Cont iguous Paged List Test . Companion . EXCEPTION Ċ import Ġandroidx . paging . Load Type . REFRESH Ċ import Ġandroidx . test utils . Test Dispatcher Ċ import Ġandroidx . test utils . Test Executor Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġjava . util . concurrent . Executor Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertTrue Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠP aged List Test Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠITE MS Ġ= ĠList ( 1 0 0 ) Ġ{ Ġ"$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconfig Ġ= ĠConfig ( 1 0 ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpaging Source Ġ= Ġobject Ġ: ĠP aging Source < Int , ĠString >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠString > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoad Params . Refresh Ġ-> ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠlistOf (" a "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotImplementedError (" Test Ġshould Ġfail Ġif Ġwe Ġget Ġhere ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠString >): ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtest Coroutine Scope Ġ= ĠCor outine Scope ( Empty Coroutine Context ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcreate Legacy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġslow Fetch Executor Ġ= ĠExecutor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġbe Ġslow Ġto Ġensure Ġ` build ()` Ġreally Ġwait ed Ġon Ġfetch Ġto Ġcomplete . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġstill Ġrun Ġit Ġon Ġanother Ġthread Ġto Ġensure Ġwe Ġare Ġnot Ġblocking Ġthe Ġtest Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġval Ġpage d List Ġ= ĠP aged List . Builder ( Test Position al DataSource ( ITEMS ), Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Notify Executor ( Test Executor ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Fetch Executor ( slow Fetch Executor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġbuild Ġsucceeds Ġwithout Ġflush ing Ġan Ġexecutor , Ġsuccess ! ĊĠĠĠĠĠĠĠ ĠassertEquals ( ITEMS , Ġpage d List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcreate No Initial Page Throw () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaging Source Ġ= Ġobject Ġ: ĠP aging Source < Int , ĠString >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠString > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠString >): ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP aged List . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaging Source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Coroutine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . Default , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . IO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig ( 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcreate No Initial Page Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaging Source Ġ= Ġobject Ġ: ĠP aging Source < Int , ĠString >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠString > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠString >): ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġdoesn 't Ġdifferent iate Ġbetween Ġthrow Ġvs Ġerror Ġrunnable , Ġwhich Ġis Ġwhy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP aged List . Builder Ġwithout Ġthe Ġinitial Ġpage Ġis Ġdeprecated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP aged List . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaging Source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Coroutine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . Default , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . IO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig ( 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdefaults () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Page Ġ= Ġpaging Source . load ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP aging Source . Load Params . Refresh ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Size Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Enabled Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠP aging Source . Load Result . Page ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġval Ġpage d List Ġ= ĠP aged List . Builder ( paging Source , Ġinitial Page , Ġconfig ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Notify Dispatcher ( Dispatch ers . Default ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Fetch Dispatcher ( Dispatch ers . IO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( paging Source , Ġpage d List . paging Source ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( config , Ġpage d List . config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠsetState _ Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġon StateChange Calls Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġval Ġload StateManager Ġ= Ġobject Ġ: ĠP aged List . Load StateManager () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( type : ĠLoad Type , Ġstate : ĠLoad State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon StateChange Calls ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload StateManager . setState ( REFRESH , ĠLoad State . Error ( EXCEPTION )) ĊĠĠĠĠĠĠĠ Ġload StateManager . setState ( REFRESH , ĠLoad State . Error ( EXCEPTION )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġon StateChange Calls ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdispatch StateChange _ dis patches On Notify Dispatcher () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotify Dispatcher Ġ= ĠTest Dispatcher () ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġval Ġpage d List Ġ= Ġobject Ġ: ĠP aged List < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging Source , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Coroutine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP aged Storage (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġlast Key : ĠAny ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Detached : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch Current Load State ( callback : Ġ( Load Type , ĠLoad State ) Ġ-> ĠUnit ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload Around Internal ( index : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdetach () Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġnotify Dispatcher . queue . isEmpty () Ġ} ĊĊĠĠĠĠĠĠĠ Ġpage d List . dispatch StateChange Async ( REFRESH , ĠLoad State . Loading ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġnotify Dispatcher . queue . size ) ĊĊĠĠĠĠĠĠĠ Ġpage d List . dispatch StateChange Async ( REFRESH , ĠLoad State . Not Loading . Incomplete ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġnotify Dispatcher . queue . size ) ĊĠĠĠ Ġ} Ċ } Ċ