/* Ċ Ġ* Ġ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 . Load Type . APPEND Ċ import Ġandroidx . paging . Load Type . PRE PEND Ċ import Ġandroidx . paging . Load Type . REFRESH Ċ import Ġandroidx . paging . Paging Source . Load Result . Page . Companion . COUNT _ UNDEFINED Ċ import Ġandroidx . paging . Remote Mediator . Initialize Action . LA UNCH _ INITIAL _ REFRESH Ċ import Ġandroidx . paging . Remote Mediator . Initialize Action . SKIP _ INITIAL _ REFRESH Ċ import Ġandroidx . paging . Remote Mediator Mock . Load Event Ċ import Ġandroidx . paging . Test Paging Source . Companion . LOAD _ ERROR Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . test . Standard Test Dispatcher Ċ import Ġkotlinx . coroutines . test . Test Scope Ċ import Ġkotlinx . coroutines . test . run Test Ċ import Ġkotlinx . coroutines . test . Un conf ined Test Dispatcher Ċ import Ġkotlinx . coroutines . test . advance Time By Ċ import Ġkotlinx . coroutines . test . advance Until Idle Ċ import Ġkotlinx . coroutines . test . run Current Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . fail Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class , ĠExperimental Paging Api :: class ) Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠRemote Mediator Accessor Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtest Scope Ġ= ĠTest Scope ( Un conf ined Test Dispatcher ()) ĊĠĠĠ Ġprivate Ġvar Ġmock State Id Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġcreates Ġa Ġunique Ġstate Ġusing Ġthe Ġanchor Ġposition Ġto Ġbe Ġable Ġto Ġdo Ġequals Ġcheck Ġin Ġassertions ĊĠĠĠ Ġprivate Ġfun Ġcreate Mock State ( ĊĠĠĠĠĠĠĠ Ġanchor Position : ĠInt ? Ġ= Ġmock State Id ++ ĊĠĠĠ Ġ): ĠP aging State < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠP aging State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Position Ġ= Ġanchor Position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= ĠP aging Config ( 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleading Placeholder Count Ġ= ĠCOUNT _ UNDEFINED ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load If Refresh Allowed _ noop () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġpaging State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 ), Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Refresh If Allowed ( paging State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load If Refresh Allowed _ simple () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠLA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġpaging State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 ), Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . allow Refresh () ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Refresh If Allowed ( paging State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( load Type Ġ= ĠREF RESH , Ġstate Ġ= Ġpaging State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġallow Refresh Ġshould Ġonly Ġallow Ġone Ġsuccessful Ġrequest Ġto Ġgo Ġthrough . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Refresh If Allowed ( paging State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load If Refresh Allowed _ retry () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠLA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġpaging State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 ), Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( Exception ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . allow Refresh () ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Refresh If Allowed ( paging State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( load Type Ġ= ĠREF RESH , Ġstate Ġ= Ġpaging State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Success ( end Of Pagination Reached Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . retry Failed ( paging State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( load Type Ġ= ĠREF RESH , Ġstate Ġ= Ġpaging State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load _ queues Boundary Be hind Refresh () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġfirst State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġval Ġsecond State Ġ= Ġcreate Mock State () ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 ) Ġ// ĠStart Ġremote Ġrefresh , Ġbut Ġdo Ġnot Ġlet Ġit Ġfinish . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠQueue Ġa Ġboundary Ġrequests , Ġbut Ġit Ġshould Ġnot Ġlaunch Ġsince Ġrefresh Ġis Ġrunning . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( PRE PEND , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( APPEND , Ġfirst State ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠQueue Ġmore Ġboundary Ġrequests , Ġbut Ġwith Ġan Ġupdated ĠP aging State . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( PRE PEND , Ġsecond State ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( APPEND , Ġsecond State ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwait Ġuntil Ġall Ġqueued Ġrequests Ġfinish Ġrunning ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġsecond State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġsecond State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load _ cancelled Boundary Retries After Refresh () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġfirst State Ġ= Ġcreate Mock State () ĊĊĠĠĠĠĠĠĠ Ġ// ĠLaunch Ġboundary Ġcalls , Ġbut Ġdo Ġnot Ġlet Ġthem Ġfinish . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( PRE PEND , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġ// ĠSingle Ġrunner Ġshould Ġprevent Ġappend Ġfrom Ġtriggering , Ġbut Ġit Ġshould Ġstill Ġbe Ġqueued . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( APPEND , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġfirst State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLaunch Ġrefresh , Ġwhich Ġshould Ġcancel Ġrunning Ġboundary Ġcalls ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLet Ġrefresh Ġfinish , Ġretry ing Ġcancelled Ġboundary Ġcalls ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġfirst State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġfirst State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load _ queues Boundary After Refresh Fails () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġval Ġsecond State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠRemote Mediator . Initialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Callback Ġ= Ġ{ Ġload Type , Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġerror Ġout Ġon Ġfirst Ġrefresh . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Type Ġ== ĠREF RESH Ġ&& Ġstate Ġ== Ġfirst State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( throwable Ġ= ĠLOAD _ ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Success ( end Of Pagination Reached Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠQueue Ġup Ġsome Ġremote Ġboundary Ġcalls , Ġwhich Ġwill Ġnot Ġrun Ġimmediately Ġbecause Ġthey ĊĠĠĠĠĠĠĠ Ġ// Ġdepend Ġon Ġrefresh . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( PRE PEND , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( APPEND , Ġfirst State ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrigger Ġrefresh , Ġletting Ġit Ġfail . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// ĠBound ary Ġcalls Ġshould Ġbe Ġqueued , Ġbut Ġnot Ġstarted . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġfirst State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠAlthough Ġboundary Ġcalls Ġare Ġqueued , Ġthey Ġshould Ġnot Ġtrigger Ġor Ġupdate ĠLoad State Ġsince ĊĠĠĠĠĠĠĠ Ġ// Ġthey Ġare Ġwaiting Ġfor Ġrefresh Ġto Ġsucceed . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( LOAD _ ERROR ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLet Ġrefresh Ġfinish , Ġtriggering Ġqueued Ġboundary Ġcalls . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . retry Failed ( second State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġsecond State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġfirst State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġfirst State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequest Load _ refresh EndOf Pagination Reached Clear s Boundary Calls () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠRemote Mediator . Initialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Success ( end Of Pagination Reached Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġfirst State Ġ= Ġcreate Mock State () ĊĊĠĠĠĠĠĠĠ Ġ// ĠQueue Ġup Ġsome Ġremote Ġboundary Ġcalls , Ġwhich Ġwill Ġnot Ġrun Ġimmediately Ġbecause Ġthey ĊĠĠĠĠĠĠĠ Ġ// Ġdepend Ġon Ġrefresh . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( PRE PEND , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( APPEND , Ġfirst State ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrigger Ġrefresh Ġand Ġlet Ġit Ġmark Ġend Of Pagination Reached ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġboundary Ġcalls Ġare Ġnot Ġtriggered Ġsince Ġthey Ġshould Ġbe Ġcleared Ġby ĊĠĠĠĠĠĠĠ Ġ// Ġend Of Pagination Reached Ġfrom Ġrefresh . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġfirst State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠAlthough Ġboundary Ġcalls Ġare Ġqueued , Ġthey Ġshould Ġnot Ġtrigger Ġor Ġupdate ĠLoad State Ġsince ĊĠĠĠĠĠĠĠ Ġ// Ġthey Ġare Ġwaiting Ġfor Ġrefresh . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Complete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Complete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ reports Prepend Load State () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġinitial Ġstate Ġis ĠNot Loading . Incomplete . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( prepend Ġ= ĠLoad State . Not Loading . Incomplete ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġa ĠPRE PEND Ġload . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠPRE PEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġstate Ġis Ġimmediately Ġset Ġto ĠLoading . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( prepend Ġ= ĠLoad State . Loading ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġload Ġto Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġstate Ġis Ġset Ġto ĠNot Loading . Incomplete . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( prepend Ġ= ĠLoad State . Not Loading . Incomplete ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġa ĠPRE PEND Ġload Ġwhich Ġresults Ġin Ġend Of Pagination Reached Ġ= Ġtrue . ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Success ( end Of Pagination Reached Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠPRE PEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġload Ġto Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġstate Ġis Ġset Ġto ĠNot Loading . Incomplete . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( prepend Ġ= ĠLoad State . Not Loading . Complete ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ reports Append Load State () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġinitial Ġstate Ġis ĠNot Loading . Incomplete . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( prepend Ġ= ĠLoad State . Not Loading . Incomplete ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġa ĠAPP END Ġload . ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠAPP END , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġstate Ġis Ġimmediately Ġset Ġto ĠLoading . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( append Ġ= ĠLoad State . Loading ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġload Ġto Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġstate Ġis Ġset Ġto ĠNot Loading . Incomplete . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( append Ġ= ĠLoad State . Not Loading . Incomplete ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġa ĠAPP END Ġload Ġwhich Ġresults Ġin Ġend Of Pagination Reached Ġ= Ġtrue . ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Success ( end Of Pagination Reached Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠAPP END , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġload Ġto Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġstate Ġis Ġset Ġto ĠNot Loading . Incomplete . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . copy ( append Ġ= ĠLoad State . Not Loading . Complete ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ con fl ates Prepend () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠPRE PEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= ĠP aging State ( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠPRE PEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= ĠP aging State ( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġexactly Ġone Ġload Ġrequest Ġwas Ġstarted . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremote Mediator . new Load Events . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFast - forward Ġtime Ġuntil Ġboth Ġload Ġrequests Ġjobs Ġcomplete . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġthe Ġsecond Ġload Ġrequest Ġwas Ġskipped Ġsince Ġit Ġwas Ġlaunched Ġwhile Ġthe Ġfirst ĊĠĠĠĠĠĠĠ Ġ// Ġload Ġrequest Ġwas Ġstill Ġrunning . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremote Mediator . new Load Events . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ con fl ates Append () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠAPP END , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= ĠP aging State ( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠAPP END , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= ĠP aging State ( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġexactly Ġone Ġload Ġrequest Ġwas Ġstarted . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremote Mediator . new Load Events . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFast - forward Ġtime Ġuntil Ġboth Ġload Ġrequests Ġjobs Ġcomplete . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġthe Ġsecond Ġload Ġrequest Ġwas Ġskipped Ġsince Ġit Ġwas Ġlaunched Ġwhile Ġthe Ġfirst ĊĠĠĠĠĠĠĠ Ġ// Ġload Ġrequest Ġwas Ġstill Ġrunning . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremote Mediator . new Load Events . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ con fl ates Refresh () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠREF RESH , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= ĠP aging State ( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠREF RESH , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= ĠP aging State ( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġexactly Ġone Ġload Ġrequest Ġwas Ġstarted . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremote Mediator . new Load Events . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFast - forward Ġtime Ġuntil Ġboth Ġload Ġrequests Ġjobs Ġcomplete . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġthe Ġsecond Ġload Ġrequest Ġwas Ġskipped Ġsince Ġit Ġwas Ġlaunched Ġwhile Ġthe Ġfirst ĊĠĠĠĠĠĠĠ Ġ// Ġload Ġrequest Ġwas Ġstill Ġrunning . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremote Mediator . new Load Events . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ concurrent Initialize Job Cancel s Boundary Jobs () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= Ġobject Ġ: ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġloading Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Type : ĠLoad Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠInt > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠMed iator Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! loading . compare AndSet ( false , Ġtrue )) Ġfail (" Concurrent Ġload ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . load ( load Type , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠPRE PEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠAPP END , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġprepend Job Ġand Ġappend Job , Ġbut Ġdo Ġnot Ġlet Ġthem Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġonly Ġthe ĠPRE PEND ĠRemote Mediator . load () Ġcall Ġwas Ġmade . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Load Event ( PRE PEND , Ġempty State )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator . new Load Events ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġrefresh Job ĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Type Ġ= ĠREF RESH , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaging State Ġ= Ġempty State ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGive Ġprepend Job Ġenough Ġtime Ġto Ġbe Ġcancelled Ġand Ġrefresh Ġstarted Ġdue Ġto Ġhigher Ġpriority ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 0 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Load Event ( REFRESH , Ġempty State )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator . new Load Events ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġassert Ġthat Ġall Ġof Ġthem Ġare Ġin Ġloading Ġstate Ġas Ġwe Ġdon 't Ġknow Ġif Ġrefresh Ġwill Ġsucceed ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġrefresh Ġfails , Ġwe Ġwould Ġretry Ġappend Ġ/ Ġprepend ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġall Ġoutstanding Ġ/ Ġqueued Ġjobs Ġto Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Until Idle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġall Ġoutstanding Ġ/ Ġqueued Ġjobs Ġfinished . ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Accessor . state . value ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠQue ued Ġboundary Ġrequests Ġshould Ġbe Ġtriggered , Ġeven Ġthough Ġthey Ġare Ġout - of - date . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġempty State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġempty State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload _ concurrent Boundary Jobs Runs Ser ially () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty State Ġ= ĠP aging State < Int , ĠInt >( listOf (), Ġnull , ĠP aging Config ( 1 0 ), ĠCOUNT _ UNDEFINED ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= Ġobject Ġ: ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġloading Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Type : ĠLoad Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠInt > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠMed iator Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! loading . compare AndSet ( false , Ġtrue )) Ġfail (" Concurrent Ġload ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . load ( load Type , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Accessor Ġ= Ġcreate Accessor ( remote Mediator ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( load Type Ġ= ĠPRE PEND , Ġpaging State Ġ= Ġempty State ) ĊĊĠĠĠĠĠĠĠ Ġremote Mediator Accessor . request Load ( load Type Ġ= ĠAPP END , Ġpaging State Ġ= Ġempty State ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġonly Ġone Ġjob Ġruns Ġdue Ġto Ġsecond Ġjob Ġjoining Ġthe Ġfirst Ġbefore Ġstarting . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremote Mediator . new Load Events . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdv ance Ġsome Ġtime , Ġbut Ġnot Ġenough Ġto Ġfinish Ġfirst Ġload . ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġremote Mediator . new Load Events . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġsecond Ġjob Ġstarts Ġafter Ġfirst Ġfinishes . ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġrun Current () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġremote Mediator . new Load Events . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAllow Ġsecond Ġjob Ġto Ġfinish . ĊĠĠĠĠĠĠĠ Ġadvance Time By ( 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġignore Append Prepend When Refresh IsRequired () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠRemote Mediator . Initialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Events ĊĠĠĠĠĠĠĠ Ġ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġallow Append Prepend When Refresh IsNot Required () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĊĠĠĠĠĠĠĠ Ġval Ġappend State Ġ= Ġcreate Mock State ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġprepend State Ġ= Ġcreate Mock State ( 2 ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġappend State ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġprepend State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġappend State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġprepend State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġignore Append Prepend Before Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠRemote Mediator . Initialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtest Scope Ġ= ĠTest Scope ( Standard Test Dispatcher ()) ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrefresh State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġrefresh State ) ĊĠĠĠĠĠĠĠ Ġ// Ġno Ġrequests Ġyet Ġsince Ġscope Ġis Ġnot Ġtriggered ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . load Events ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġ// Ġadvance Ġenough Ġto Ġtrigger Ġthe Ġrequest , Ġnot Ġenough Ġto Ġcomplete ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġthese Ġshould Ġbe Ġignored ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġcreate Mock State ()) ĊĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġappend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġappend State ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprepend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 1 ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġprepend State ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġrefresh State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġadvance Ġenough Ġthat Ġwe Ġcan Ġaccept Ġappend Ġprepend ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġqueued Ġappend / prepend Ġshould Ġbe Ġexecuted Ġafterwards . ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġappend State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġprepend State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġother Prepend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġval Ġother Append State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġother Prepend State ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġother Append State ) ĊĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġother Prepend State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġwhile Ġprepend Ġrunning , Ġany Ġmore Ġrequests Ġshould Ġbe Ġignored ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 4 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġother Append State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġ// Ġwhile Ġappend Ġrunning , Ġany Ġmore Ġrequests Ġshould Ġbe Ġignored ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġthe Ġwork Ġis Ġdone , Ġwe Ġcan Ġadd Ġmore ĊĠĠĠĠĠĠĠ Ġval Ġnew Append State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġnew Append State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġnew Append State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdrop Append Prepend If Refresh Is Triggered () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĠĠĠĠĠĠĠ Ġval Ġinitial Append Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġinitial Append ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġinitial Append ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġbefore Ġthat Ġappend Ġfinishes , Ġtrigger Ġa Ġrefresh ĊĠĠĠĠĠĠĠ Ġval Ġnew Refresh Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġnew Refresh ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthat Ġwe Ġimmediately Ġget Ġthe Ġnew Ġrefresh Ġbecause Ġwe 'll Ġcancel Ġthe Ġappend ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġnew Refresh ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . in complete Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġinitial Append ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġstate ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( Load States . IDLE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAppend Ġrequest Ġshould Ġgo Ġthrough Ġsince Ġit Ġdoesn 't Ġrequire Ġrefresh ĊĠĠĠĠĠĠĠ Ġval Ġfirst Append State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġfirst Append State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 4 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġfirst Append State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrigger Ġrefresh , Ġcancell ing Ġremote Ġappend ĊĠĠĠĠĠĠĠ Ġval Ġfirst Refresh State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġfirst Refresh State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġadvance Ġenough Ġto Ġcomplete Ġrefresh ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġassert Ġthat Ġwe Ġreceive Ġrefresh , Ġand Ġappend Ġis Ġretried Ġsince Ġit Ġwas Ġcancelled ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġfirst Refresh State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġfirst Append State ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġappend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġappend State ) ĊĠĠĠĠĠĠĠ Ġval Ġprepend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġprepend State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġboth Ġstates Ġshould Ġbe Ġset Ġto Ġloading Ġeven Ġthough Ġprepend Ġis Ġnot Ġreally Ġrunning ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġappend State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġadvance Ġenough Ġto Ġtrigger Ġprepend ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġprepend State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠThrowable () ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Callback Ġ= Ġ{ Ġtype , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠPRE PEND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġcomplete Ġappend , Ġa . k . a . Ġend Of Pagination Reached ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Callback Ġ= Ġ{ Ġtype , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠAPP END ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Of Pagination Reached Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Complete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġclear Ġevents ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ// Ġanother Ġappend Ġrequest Ġshould Ġjust Ġbe Ġignored ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Complete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġrefresh State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġrefresh State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġprepend Ġerror Ġstate Ġis Ġstill Ġpresent ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Complete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġrefresh Ġsucceeds , Ġit Ġwill Ġclear Ġthe Ġerror Ġstate Ġfor Ġrefresh ĊĠĠĠĠĠĠĠ ĠassertThat ( accessor . state . value ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator Mock . new Load Events ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , Ġrefresh State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġretry _ refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Callback Ġ= Ġ{ Ġload Type , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Type Ġ== ĠREF RESH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfirst Refresh State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġfirst Refresh State ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( Load Event ( REFRESH , Ġfirst Refresh State )) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . refresh ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġretry State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . retry Failed ( retry State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( Load Event ( REFRESH , Ġretry State )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfailed Refresh Should Not Allow Append Prepend If Refresh IsRequired () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠRemote Mediator . Initialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠinitialState Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , ĠinitialState ) ĊĠĠĠĠĠĠĠ Ġ// Ġeven Ġthough Ġwe Ġare Ġsending Ġappend Ġprepend , Ġthey Ġwon 't Ġreally Ġtrigger Ġsince Ġrefresh Ġwill ĊĠĠĠĠĠĠĠ Ġ// Ġfail ĊĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġthat Ġwe Ġdidn 't Ġset Ġappend / prepend Ġto Ġloading Ġwhen Ġrefresh Ġis Ġrequired ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . modify State ( REFRESH , ĠLoad State . Loading ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġonly Ġrefresh Ġhas Ġhappened ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , ĠinitialState ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States . IDLE . modify State ( REFRESH , ĠLoad State . Error ( exception )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfailed Refresh Should Allow Append Prepend If Refresh IsNot Required () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Callback Ġ= Ġ{ Ġload Type , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Type Ġ!= ĠAPP END ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ// Ġlet Ġappend Ġsucceed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠinitialState Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , ĠinitialState ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , ĠinitialState ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , ĠinitialState ) ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġwe Ġoptim istic ally Ġupdated Ġappend Ġprepend Ġstates ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġall Ġrequests Ġdid Ġhappen Ġeventually ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( REFRESH , ĠinitialState ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , ĠinitialState ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , ĠinitialState ) ĊĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġretry _ retry Both Append And Prepend () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Mock Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Result Ġ= ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator Mock ) ĊĠĠĠĠĠĠĠ Ġremote Mediator Mock . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġappend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġval Ġprepend State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġprepend State ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġappend State ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġprepend State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġappend State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġretry , Ġensure Ġboth Ġruns ĊĠĠĠĠĠĠĠ Ġval Ġretry State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . retry Failed ( retry State ) ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġthey Ġboth Ġmove Ġto Ġloading ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġthey Ġboth Ġgot Ġcalled ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Mock . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( PRE PEND , Ġretry State ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( APPEND , Ġretry State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġnew Ġloading Ġstates Ġare Ġcorrect ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġretry _ multiple Triggers Only Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= Ġobject Ġ: ĠRemote Mediator Mock ( 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinitialize (): ĠInitialize Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfail Ġall ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġrefresh Ġstart Ġbut Ġdon 't Ġlet Ġit Ġfinish ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġall Ġerrors ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġrequests Ġsucceed ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġretry State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . retry Failed ( retry State ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfailing Refresh Retries Append Prepend _ refresh Not Required () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= Ġobject Ġ: ĠRemote Mediator Mock ( 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinitialize (): ĠInitialize Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġtype , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfail Ġfor Ġrefresh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠREF RESH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġrefresh Ġstart Ġbut Ġdon 't Ġlet Ġit Ġfinish ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġrefresh Ġdoes Ġnot Ġrevert Ġthe Ġappend Ġ/ Ġprepend Ġstates ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġrefresh Ġfail , Ġit Ġshould Ġretry Ġappend Ġprepend ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 2 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġlet Ġthe Ġprepend Ġretry Ġstart ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload More Refresh Should Retry Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsee : Ġb / 1 7 3 4 3 8 4 7 4 ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġstate 1 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġstate 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . refresh ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Loading ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġto Ġget Ġthe Ġerror ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . refresh ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġsend Ġanother Ġload Ġtype Ġrefresh , Ġshould Ġtrigger Ġanother Ġload ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġnull Ġ// Ġlet Ġit Ġsucceed ĊĠĠĠĠĠĠĠ Ġval Ġstate 2 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġstate 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . refresh ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Loading ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . refresh ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload More Refresh Should Retry Refresh _ with Append Prepend Errors () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsee : Ġb / 1 7 3 4 3 8 4 7 4 ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġstate 1 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġto Ġget Ġthe Ġerror ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġsend Ġanother Ġload Ġtype Ġrefresh , Ġshould Ġtrigger Ġanother Ġload ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġnull Ġ// Ġlet Ġit Ġsucceed ĊĠĠĠĠĠĠĠ Ġval Ġstate 2 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġstate 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception ), Ġ// Ġkeep Ġerrors Ġfor Ġthese Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Not Loading . Incomplete , Ġ// Ġclear Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Not Loading . Incomplete , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload More Refresh Should Retry Refresh _ with Append Prepend Errors _ second Refresh Fails () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsee : Ġb / 1 7 3 4 3 8 4 7 4 ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( load Delay Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexception 1 Ġ= ĠException (" 1 ") ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġstate 1 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( APPEND , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( PRE PEND , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġto Ġget Ġthe Ġerror ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġsend Ġanother Ġload Ġtype Ġrefresh , Ġshould Ġtrigger Ġanother Ġload ĊĠĠĠĠĠĠĠ Ġval Ġexception 2 Ġ= ĠException (" 2 ") ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate 2 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( REFRESH , Ġstate 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception 1 ), Ġ// Ġkeep Ġerrors Ġfor Ġthese Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad States ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= ĠLoad State . Error ( exception 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepend Ġ= ĠLoad State . Error ( exception 1 ), Ġ// Ġthese Ġkeep Ġtheir Ġoriginal Ġexceptions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ= ĠLoad State . Error ( exception 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequire Retry _ append () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Retry ( APPEND ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrequire Retry _ prepend () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Retry ( PRE PEND ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequire Retry ( load Type : ĠLoad Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġthat Ġwe Ġdon 't Ġretry Ġa Ġfailed Ġrequest Ġuntil Ġa Ġretry Ġar rives . ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠRemote Mediator Mock ( 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Mediator . Mediator Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= Ġtest Scope . create Accessor ( remote Mediator ) ĊĠĠĠĠĠĠĠ Ġval Ġstate 1 Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( load Type , Ġstate 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . get ( load Type ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Loading ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . get ( load Type ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( load Type , Ġstate 1 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġsubsequent Ġadd Ġcalls Ġshouldn 't Ġdo Ġanything ĊĠĠĠĠĠĠĠ Ġaccessor . request Load ( load Type , Ġcreate Mock State ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . get ( load Type ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . get ( load Type ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( remote Mediator . new Load Events ). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġsend Ġa Ġretry , Ġthen Ġit Ġwill Ġwork ĊĠĠĠĠĠĠĠ Ġremote Mediator . load Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġretry State Ġ= Ġcreate Mock State () ĊĠĠĠĠĠĠĠ Ġaccessor . retry Failed ( retry State ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . get ( load Type ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Loading ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Scope . advance Until Idle () ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator . new Load Events ĊĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Event ( load Type , Ġretry State ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . state . value . get ( load Type ) ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad State . Not Loading . Incomplete ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTest Scope . create Accessor ( ĊĠĠĠĠĠĠĠ Ġmedi ator : ĠRemote Mediator Mock ĊĠĠĠ Ġ): ĠRemote Mediator Accessor < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccessor Ġ= ĠRemote Mediator Accessor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate Ġ= Ġmedi ator ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTest Scope (). launch ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccessor . initialize () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaccessor ĊĠĠĠ Ġ} Ċ } Ċ