package Ġcom . re vol ut . rx data . dod Ċ Ċ import Ġcom . n ha ar man . mockito _ kotlin .* Ċ import Ġcom . re vol ut . rx data . core . Data Ċ import Ġcom . re vol ut . rx data . core . extensions . extract Content Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . plugins . Rx Java Plugins Ċ import Ġio . reactivex . schedul ers . Test Scheduler Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ private Ġtype alias ĠParams Ġ= ĠInt Ċ private Ġtype alias ĠDomain Ġ= ĠString Ċ Ċ /* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠRe vol ut Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ*/ Ċ Ċ class ĠData Observable Delegate Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġparams : ĠParams Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġcached Domain : ĠDomain Ġ= Ġ" cached _ domain _ model " ĊĊĠĠĠ Ġprivate Ġval Ġdomain : ĠDomain Ġ= Ġ" domain _ model " ĊĠĠĠ Ġprivate Ġval Ġdomain 2 : ĠDomain Ġ= Ġ" domain _ model _ 2 " ĊĊĠĠĠ Ġprivate Ġval Ġbackend Exception Ġ= ĠIOException (" HTTP Ġ 5 0 0 . ĠAll Ġtests Ġare Ġgreen !") ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfrom Network : Ġ( Params ) Ġ-> ĠSingle < Domain > ĊĊĠĠĠ Ġprivate Ġval Ġfrom Network Scoped : ĠData Observable Delegate < Params , ĠDomain >. ( Params ) Ġ-> ĠSingle < Domain > Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġfrom Network ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġto Memory : Ġ( Params , ĠDomain ) Ġ-> ĠUnit ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfrom Memory : Ġ( Params ) Ġ-> ĠDomain ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġto Storage : Ġ( Params , ĠDomain ) Ġ-> ĠUnit ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfrom Storage : Ġ( Params ) Ġ-> ĠDomain ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdata Observable Delegate : ĠData Observable Delegate < Params , ĠDomain > ĊĊĠĠĠ Ġprivate Ġval Ġcomputation Scheduler : ĠTest Scheduler Ġ= ĠTest Scheduler () ĊĠĠĠ Ġprivate Ġval Ġio Scheduler : ĠTest Scheduler Ġ= ĠTest Scheduler () ĊĊĠĠĠ Ġprivate Ġval Ġmem Cache Ġ= Ġhash Map Of < Params , ĠDomain >() ĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= Ġhash Map Of < Params , ĠDomain >() ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom Network Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġto Memory Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġfrom Memory Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġto Storage Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġfrom Storage Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate Ġ= ĠData Observable Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Network Ġ= Ġfrom Network Scoped , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Memory Ġ= Ġfrom Memory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Memory Ġ= Ġto Memory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Storage Ġ= Ġfrom Storage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Storage Ġ= Ġto Storage ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġmem Cache . clear () ĊĠĠĠĠĠĠĠ Ġstorage . clear () ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Memory . invoke ( any ())). then Answer Ġ{ Ġinvocation Ġ-> Ġmem Cache [ invocation . arguments [ 0 ]] Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( to Memory . invoke ( any (), Ġany ())). then Answer Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Cache [ invocation . arguments [ 0 ] Ġas ĠParams ] Ġ= Ġinvocation . arguments [ 1 ] Ġas ĠDomain ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Storage . invoke ( any ())). then Answer Ġ{ Ġinvocation Ġ-> Ġstorage [ invocation . arguments [ 0 ]] Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( to Storage . invoke ( any (), Ġany ())). then Answer Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage [ invocation . arguments [ 0 ] Ġas ĠParams ] Ġ= Ġinvocation . arguments [ 1 ] Ġas ĠDomain ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠRx Java Plugins . set Io Scheduler Handler Ġ{ Ġio Scheduler Ġ} ĊĠĠĠĠĠĠĠ ĠRx Java Plugins . set Computation Scheduler Handler Ġ{ Ġcomputation Scheduler Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` FORCE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠEMPTY `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` FORCE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠNOT ĠEMPTY `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( cached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 2 , ĠData ( domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( cached Domain )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` from Network Ġshould Ġbe Ġinvoked Ġon ĠIO `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmem Cache [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( from Network ) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network ). invoke ( any ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġun subscribed Ġfrom Ġnetwork Ġreload ĠTHEN Ġdata Ġis Ġstill Ġsaved Ġto Ġstorage Ġand Ġmemory `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelayed Network Ġ= ĠSingle . from Callable Ġ{ Ġdomain Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 1 , ĠTimeUnit . SECONDS , Ġcomputation Scheduler ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( delayed Network ) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () Ġ// Ġgets Ġstorage Ġand Ġun sub scri bes Ġbefore Ġnetwork Ġemits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , Ġcached Domain ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Complete () ĊĊĠĠĠĠĠĠĠ Ġ// storage Ġdomain Ġmoved Ġto Ġmemory ĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( cached Domain )) ĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġnot Ġmoved Ġto Ġmemory Ġyet ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġnever ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĊĠĠĠĠĠĠĠ Ġcomputation Scheduler . advance Time By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS ĊĠĠĠĠĠĠĠ Ġ) Ġ// network Ġfinishes Ġafter Ġobserver Ġun subscribed ĊĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġmoved Ġto Ġmemory ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġat Least Once ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġmoved Ġto Ġstorage ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġat Least Once ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġun subscribed Ġfrom Ġdod ĠAND Ġdod Ġis Ġglobally Ġcleared ĠTHEN Ġdata Ġis Ġnot Ġsaved `() Ġ{ ĊĠĠĠĠĠĠĠ ĠD od Global . network Timeout Seconds Ġ= Ġ 6 0 L ĊĊĠĠĠĠĠĠĠ Ġval Ġdelayed Network Ġ= ĠSingle . from Callable Ġ{ Ġdomain Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 1 0 , ĠTimeUnit . SECONDS , Ġcomputation Scheduler ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( delayed Network ) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () Ġ// Ġgets Ġstorage Ġand Ġun - sub scri bes Ġbefore Ġnetwork Ġemits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġ// network Ġis Ġnot Ġfinished Ġyet Ġand Ġwe Ġdispose ĠDO D Ġglobally ĊĠĠĠĠĠĠĠ Ġcomputation Scheduler . advance Time By ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠD od Global . clear Pending Network () ĊĠĠĠĠĠĠĠ Ġcomputation Scheduler . advance Time By ( 5 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġ// network Ġresult Ġis Ġnot Ġstored ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġnever ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġnever ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġun subscribed Ġfrom Ġnetwork Ġand Ġdata ĠNOT Ġar rives Ġin Ġ 6 0 Ġseconds ĠTHEN Ġdata Ġnot Ġsaved `() Ġ{ ĊĠĠĠĠĠĠĠ ĠD od Global . network Timeout Seconds Ġ= Ġ 6 0 L ĊĊĠĠĠĠĠĠĠ Ġval Ġdelayed Network Ġ= ĠSingle . from Callable Ġ{ Ġdomain Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 2 , ĠTimeUnit . MIN UTES , Ġio Scheduler ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( delayed Network ) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () Ġ// Ġgets Ġstorage Ġand Ġun - sub scri bes Ġbefore Ġnetwork Ġemits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , Ġcached Domain ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Complete () ĊĊĠĠĠĠĠĠĠ Ġ// storage Ġdomain Ġmoved Ġto Ġmemory ĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( cached Domain )) ĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġnot Ġmoved Ġto Ġmemory Ġyet ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġnever ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĊĠĠĠĠĠĠĠ Ġ// network Ġreload Ġtermin ates Ġafter Ġ 6 0 Ġseconds ĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 6 0 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġnot Ġmoved Ġto Ġmemory ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġnever ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġnot Ġmoved Ġto Ġstorage ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġnever ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĊĊĠĠĠĠĠĠĠ Ġ// re - sub scri b ption Ġwill Ġre - trigger Ġnetwork Ġafter Ġ 6 0 Ġseconds Ġtimeout ĊĠĠĠĠĠĠĠ Ġval Ġnetwork 2 Ġ= ĠSingle . from Callable Ġ{ Ġdomain 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( network 2 ) ĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġ// network Ġdomain 2 Ġmoved Ġto Ġmemory ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġat Least Once ()). invoke ( eq ( params ), Ġeq ( domain 2 )) ĊĠĠĠĠĠĠĠ Ġ// network Ġdomain 2 Ġmoved Ġto Ġstorage ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġat Least Once ()). invoke ( eq ( params ), Ġeq ( domain 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġun subscribed Ġfrom Ġnetwork Ġstream ĠAND Ġerror Ġoccurs ĠTHEN Ġnext Ġobserve Ġwill Ġreload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelayed Network Ġ= ĠSingle . from Callable < Domain > Ġ{ Ġthrow Ġ Ġbackend Exception Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 1 , ĠTimeUnit . SECONDS , Ġio Scheduler ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( delayed Network ) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () Ġ// Ġgets Ġstorage Ġand Ġun sub scri bes Ġbefore Ġnetwork Ġemits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( cached Domain )) Ġ// storage Ġdomain Ġmoved Ġto Ġmemory ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , Ġcached Domain ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Complete () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS ĊĠĠĠĠĠĠĠ Ġ) Ġ// network Ġfinishes Ġwith Ġerror Ġafter Ġobserver Ġun subscribed ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ob serving Ġwith Ġforce Reload Ġ= Ġfalse Ġexpecting Ġto Ġtrigger Ġnetwork Ġcall Ġagain ĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () Ġ// Ġgets Ġstorage Ġand Ġun sub scri bes Ġbefore Ġnetwork Ġemits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġmoved Ġto Ġmemory ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġat Least Once ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġ// network Ġdomain Ġmoved Ġto Ġstorage ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġat Least Once ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġprevious Ġfrom Network Ġfailed ĠTHEN Ġobserve Ġforce Reload = false Ġwill Ġreload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test (). apply Ġ{ Ġio Scheduler . trigger Actions () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Error ( backend Exception ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( cached Domain , Ġmem Cache [ params ]) ĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġtimes ( 1 )). invoke ( eq ( params )) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test (). apply Ġ{ Ġio Scheduler . trigger Actions () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Values ( cached Domain , Ġdomain ) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġtimes ( 2 )). invoke ( eq ( params )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġprevious Ġfrom Network Ġfailed Ġwith ĠNoSuch ElementException ĠTHEN Ġobserve Ġforce Reload = false Ġwill Ġnot Ġreload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠCustom Exception Ġ: ĠNoSuch ElementException () ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow ĠCustom Exception () Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content ( consume Errors Ġ= Ġ{ Ġerror , Ġ_ Ġ-> Ġerror . take Unless Ġ{ Ġit Ġis ĠCustom Exception Ġ} Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test (). apply Ġ{ Ġio Scheduler . trigger Actions () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Values ( cached Domain ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( cached Domain , Ġmem Cache [ params ]) ĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġtimes ( 1 )). invoke ( eq ( params )) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. extract Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test (). apply Ġ{ Ġio Scheduler . trigger Actions () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Values ( cached Domain ) ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( from Network ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` FORCE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠNOT ĠEMPTY `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĠĠĠĠĠĠĠ Ġmem Cache [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( from Storage ) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġfrom Network Ġis Ġretried ĠAND Ġnotify From Memory Ġcalled ĠTHEN Ġsubscriber Ġreceives Ġthe Ġvalue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . never ()) ĊĠĠĠĠĠĠĠ Ġmem Cache [ params ] Ġ= Ġcached Domain ĊĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= ĠIllegalStateException (" From ĠNetwork Ġis ĠRet ried ĠOut side ") ĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . notify From Memory ( error Ġ= Ġerr , Ġloading Ġ= Ġtrue ) Ġ{ Ġit Ġ== Ġparams Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġerr , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` FORCE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠEMPTY Ġand Ġserver Ġreturns ĠERROR `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( null , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse )) ĊĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` FORCE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠNOT ĠEMPTY Ġand Ġserver Ġreturns ĠERROR `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( cached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 2 , ĠData ( cached Domain , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġonly ()). invoke ( eq ( params ), Ġeq ( cached Domain )) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` FORCE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠNOT ĠEMPTY Ġ Ġand Ġserver Ġreturns ĠERROR `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĠĠĠĠĠĠĠ Ġmem Cache [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( from Storage ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` NOT ĠFOR CE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠEMPTY `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage , Ġonly ()). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` NOT ĠFOR CE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠNOT ĠEMPTY `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 3 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( cached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 2 , ĠData ( domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( cached Domain )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage ). invoke ( eq ( params ), Ġeq ( domain )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` NOT ĠFOR CE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠNOT ĠEMPTY `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmem Cache [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( from Network ) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( from Storage ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` NOT ĠFOR CE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠEMPTY Ġand Ġserver Ġreturns ĠERROR `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( null , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Memory ) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` NOT ĠFOR CE Ġob serving Ġdata Ġwhen Ġmemory Ġcache ĠIS ĠEMPTY Ġand Ġstorage ĠIS ĠNOT ĠEMPTY Ġand Ġserver Ġreturns ĠERROR `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( null , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 3 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( cached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 2 , ĠData ( cached Domain , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( from Network , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify ( to Memory , Ġonly ()). invoke ( eq ( params ), Ġeq ( cached Domain )) ĊĠĠĠĠĠĠĠ Ġverify ( from Storage , Ġonly ()). invoke ( eq ( params )) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( to Storage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ob serving Ġdata Ġfor ĠMO RE ĠTH AN ĠONE Ġobserver `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Time Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Time Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġbackend Exception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġmem Cache [ params ] Ġ= Ġcached Domain ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer 1 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġrefresh Ġwith Ġresult ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value At ( 0 , ĠData ( content Ġ= Ġcached Domain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value Count ( 3 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value At ( 2 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value At ( 1 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( eq ( params ), Ġeq ( domain )) ĊĊĠĠĠĠĠĠĠ Ġ// refresh Ġwith Ġerror ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer 3 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value Count ( 4 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value At ( 3 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value Count ( 3 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value At ( 2 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 3 . assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 3 . assert Value At ( 0 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . advance Time By ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value Count ( 5 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 1 . assert Value At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value Count ( 4 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . assert Value At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtest Observer 3 . assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠ Ġtest Observer 3 . assert Value At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġbackend Exception , Ġloading Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` re - sub scri bing Ġto Ġconstructed Ġstream Ġre - f etches Ġmemory Ġcache `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= Ġdata Observable Delegate . observe ( params , Ġforce Reload Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġobservable . test (). await Count ( 1 ). dispose () ĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġtimes ( 1 )). invoke ( eq ( params )) ĊĊĠĠĠĠĠĠĠ Ġobservable . test (). await Count ( 1 ). dispose () ĊĊĠĠĠĠĠĠĠ Ġverify ( from Memory , Ġtimes ( 2 )). invoke ( eq ( params )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` reload Ġcomplet able Ġnot ifies Ġsubscribers Ġand Ġupdates Ġstorage Ġand Ġmemory `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Values ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ( null , Ġnull , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData ( domain , Ġnull , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Domain : ĠDomain Ġ= Ġ" updated _ domain " ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġupdated Domain Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . reload ( params Ġ= Ġparams ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġio Scheduler . trigger Actions () Ġ}. assert Complete () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 3 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 2 , ĠData ( updated Domain , Ġnull , Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġverify ( to Memory ). invoke ( params , Ġupdated Domain ) ĊĠĠĠĠĠĠĠ Ġverify ( to Storage ). invoke ( params , Ġupdated Domain ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġstorage Ġreturns Ġerror ĠTHEN Ġnetwork Ġdata Ġis Ġemitted Ġlater `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĠĠĠĠĠĠĠ Ġwhenever ( from Storage . invoke ( any ())). then Throw ( error ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġfalse ). test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value Count ( 3 ) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 0 , ĠData ( content Ġ= Ġnull , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 1 , ĠData ( content Ġ= Ġnull , Ġerror Ġ= Ġerror , Ġloading Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value At ( 2 , ĠData ( content Ġ= Ġdomain , Ġerror Ġ= Ġnull , Ġloading Ġ= Ġfalse )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġmemory IsEmpty Ġand Ġdod Ġis Ġobserved Ġmulti pple Ġtimes ĠTHEN Ġfrom Storage Ġis Ġcalled Ġonce `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger ( 0 ); ĊĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġdomain Ġ}) ĊĠĠĠĠĠĠĠ Ġwhenever ( from Storage . invoke ( eq ( params ))). then Answer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcounter . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Domain ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). test () ĊĊĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcounter . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġforce Reload Ġdod Ġswitch Maps Ġto Ġthe Ġsame Ġforce Reload Ġdod ĠTHEN Ġemission s Ġare Ġmut ed Ġafter Ġ 2 nd Ġiteration ` (){ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġcached Domain Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĠĠĠĠĠĠĠ Ġmem Cache . remove ( params ) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġdod Ġswitch Maps Ġto Ġthe Ġsame Ġforce Reload Ġdod ĠTHEN Ġemission s Ġare Ġmut ed Ġafter Ġ 2 nd Ġiteration ` (){ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġcached Domain Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĠĠĠĠĠĠĠ Ġmem Cache . remove ( params ) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams ). take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġdod Ġswitch Maps Ġto Ġthe Ġsame Ġforce Reload Ġdod ĠAND Ġfrom Network Ġreturns Ġerrors ĠTHEN Ġemission s Ġare Ġmut ed Ġafter Ġ 2 nd Ġiteration ` (){ ĊĠĠĠĠĠĠĠ Ġwhenever ( from Network . invoke ( eq ( params ))). thenReturn ( Single . from Callable Ġ{ Ġthrow Ġbackend Exception Ġ}) ĊĠĠĠĠĠĠĠ Ġstorage [ params ] Ġ= Ġcached Domain ĊĠĠĠĠĠĠĠ Ġmem Cache . remove ( params ) ĊĊĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams ). take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Observable Delegate . observe ( params Ġ= Ġparams , Ġforce Reload Ġ= Ġtrue ). take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio Scheduler . trigger Actions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 8 ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ