/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ Ċ package Ġar cs . core . storage Ċ Ċ import Ġar cs . core . cr dt . Cr dt Count Ċ import Ġar cs . core . cr dt . Cr dt Count . Operation . Increment Ċ import Ġar cs . core . cr dt . Cr dt Data Ċ import Ġar cs . core . cr dt . Cr dt Exception Ċ import Ġar cs . core . cr dt . Cr dt Operation Ċ import Ġar cs . core . cr dt . Cr dt Set Ċ import Ġar cs . core . cr dt . Version Map Ċ import Ġar cs . core . data . Collection Type Ċ import Ġar cs . core . data . Count Type Ċ import Ġar cs . core . data . EntityType Ċ import Ġar cs . core . data . FieldType Ċ import Ġar cs . core . data . Raw Entity Ċ import Ġar cs . core . data . Schema Ċ import Ġar cs . core . data . Schema Fields Ċ import Ġar cs . core . data . util . to Refer enc able Ċ import Ġar cs . core . storage . testutil . Dummy Storage Key Ċ import Ġar cs . core . type . Type Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlinx . atomic fu . atomic Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . fail Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ Ċ /** ĠTests Ġfor Ġ[ Store ]. Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ", Ġ" UNUSED _ VARIABLE ") Ċ @ Experimental Cor outines Api Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠStore Test Ġ{ ĊĠĠĠ Ġval Ġtest Key : ĠStorage Key Ġ= ĠDummy Storage Key (" key ") ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ ĠDriver Factory . clear Regist rations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġteardown () Ġ{ ĊĠĠĠĠĠĠĠ ĠDriver Factory . clear Regist rations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠCr dt Exception :: class ) ĊĠĠĠ Ġfun Ġthrows _ if Appro priate Driver C ant Be Found () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Store () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconstructs Direct Stores _ when Required () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( store ). isInstanceOf ( Direct Store :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpropag ates Model Updates _ from Prox ies _ to Drivers () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () Ġas ĠDirect Store < Cr dt Data , ĠCr dt Operation , ĠAny ?> ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġcount . apply Operation ( Increment (" me ", Ġ 0 Ġto Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġstore . on Proxy Message ( Proxy Message . Model Update ( count . data , Ġ 1 )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( driver . last Data ). isEqualTo ( count . data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġapplies And Propag ates Operations _ from Prox ies _ to Drivers () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () Ġas ĠDirect Store < Cr dt Data , ĠCr dt Operation , ĠAny ?> ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġval Ġop Ġ= ĠIncrement (" me ", Ġ 0 Ġto Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġstore . on Proxy Message ( Proxy Message . Operations ( listOf ( op ), Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġcount . apply Operation ( op ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( driver . last Data ). isEqualTo ( count . data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrespon ds _ to Model Request _ from Proxy With Model () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () Ġas ĠDirect Store < Cr dt Data , ĠCr dt Operation , ĠAny ?> ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġval Ġop Ġ= ĠIncrement (" me ", Ġ 0 Ġto Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcount . apply Operation ( op ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsent Sync Request Ġ= Ġatomic ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= ĠComp letable Deferred < Unit >( coroutine Context [ Job . Key ]) ĊĠĠĠĠĠĠĠ Ġvar Ġcb id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠProxy Callback < Cr dt Data , ĠCr dt Operation , ĠAny ?> Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProxy Message . Operations Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sent Sync Request . get AndSet ( true )). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġto Ġrequest Ġsync Ġon Ġthis Ġcallback ĠID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore . on Proxy Message ( Proxy Message . Sync Request ( cb id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProxy Message . Model Update Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sent Sync Request . value ). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( message . model ). isEqualTo ( count . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProxy Message . Sync Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete Exception ally ( AssertionError (" Should n 't Ġever Ġget Ġhere .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġthe Ġcallback ĊĠĠĠĠĠĠĠ Ġcb id Ġ= Ġstore . on ( callback ) ĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġour Ġop . ĊĠĠĠĠĠĠĠ Ġstore . on Proxy Message ( Proxy Message . Operations ( listOf ( op ), Ġ 2 )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġour Ġdeferred Ġto Ġbe Ġcompleted . ĊĠĠĠĠĠĠĠ Ġdeferred . await () ĊĠĠĠĠĠĠĠ ĠassertThat ( sent Sync Request . value ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsends A Model Response _ only To _ the Request ing Proxy () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener 1 Finished Ġ= ĠComp letable Deferred < Unit >( coroutine Context [ Job . Key ]) ĊĠĠĠĠĠĠĠ Ġval Ġid 1 Ġ= Ġstore . on ( Proxy Callback Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( message ). isInstanceOf ( Proxy Message . Model Update :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener 1 Finished . complete ( Unit ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġid 2 Ġ= Ġstore . on ( Proxy Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" This Ġcallback Ġshould Ġnot Ġbe Ġcalled .") ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġstore . on Proxy Message ( Proxy Message . Sync Request ( id 1 )) ĊĊĠĠĠĠĠĠĠ Ġlistener 1 Finished . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpropag ates Updates _ from Drivers _ to Prox ies () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġcount . apply Operation ( Increment (" me ", Ġ 0 Ġto Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Finished Ġ= ĠComp letable Deferred < Unit >( coroutine Context [ Job . Key ]) ĊĊĠĠĠĠĠĠĠ Ġstore . on ( Proxy Callback Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġis ĠProxy Message . Operations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( message . operations . size ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( message . operations [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( Cr dt Count . Operation . Multi Increment (" me ", Ġ 0 Ġto Ġ 1 , Ġdelta Ġ= Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Finished . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Proxy Callback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Finished . complete Exception ally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalStateException (" Should Ġbe Ġan Ġoperations Ġmessage .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdriver . last Receiver !!. invoke ( count . data , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġlistener Finished . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoesnt Send Update To Driver _ after Driver Origin ated Messages () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĠĠĠĠĠĠĠ Ġdriver . throw On Send Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Count Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġremote Count . apply Operation ( Increment (" them ", Ġ 0 Ġto Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġthis Ġassumes Ġno Ġas ynchron y Ġinside ĠStore . kt . ĠThis Ġis Ġgu arded Ġby Ġthe Ġfollowing ĊĠĠĠĠĠĠĠ Ġ// Ġtest , Ġwhich Ġwill Ġfail Ġif Ġdriver . receiver () Ġdoesn 't Ġsynchronous ly Ġinvoke Ġdriver . send (). ĊĠĠĠĠĠĠĠ Ġdriver . last Receiver !!. invoke ( remote Count . data , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoesnt Send Update To Driver _ after Driver Origin ated Messages _ Cr dt Set () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup Set F akes () ĊĠĠĠĠĠĠĠ Ġdriver . throw On Send Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠSchema ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Set (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Fields ( map Of (" name " Ġto ĠFieldType . Text ), Ġempty Map ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" abc " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstore : ĠCollection Store < Raw Entity > Ġ= ĠDefault Activation Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStore Options ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollection Type ( EntityType ( schema )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Set Ġ= ĠCr dt Set < Raw Entity >() ĊĠĠĠĠĠĠĠ Ġval Ġentity Ġ= ĠRaw Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsing letons Ġ= Ġmap Of (" name " Ġto Ġ" a ". to Refer enc able ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollections Ġ= Ġempty Map () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġremote Set . apply Operation ( Cr dt Set . Operation . Add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" bob ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVersion Map (" bob " Ġto Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġthis Ġassumes Ġno Ġas ynchron y Ġinside ĠStore . kt . ĠThis Ġis Ġgu arded Ġby Ġthe Ġfollowing ĊĠĠĠĠĠĠĠ Ġ// Ġtest , Ġwhich Ġwill Ġfail Ġif Ġdriver . receiver () Ġdoesn 't Ġsynchronous ly Ġinvoke Ġdriver . send (). ĊĠĠĠĠĠĠĠ Ġdriver . last Receiver !!. invoke ( remote Set . data , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġres ends Failed Driver Updates _ after Mer ging () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Call Complete Ġ= ĠComp letable Deferred < Unit >( coroutine Context [ Job . Key ]) ĊĠĠĠĠĠĠĠ Ġval Ġsecond Call Complete Ġ= ĠComp letable Deferred < Unit >( coroutine Context [ Job . Key ]) ĊĊĠĠĠĠĠĠĠ Ġdriver . do On Send Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Call Complete . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġactive Store Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġ// Ġlocal Ġcount Ġfrom Ġproxy ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġcount . apply Operation ( Increment (" me ", Ġ 0 Ġto Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġconflicting Ġremote Ġcount Ġfrom Ġstore ĊĠĠĠĠĠĠĠ Ġval Ġremote Count Ġ= ĠCr dt Count () ĊĠĠĠĠĠĠĠ Ġremote Count . apply Operation ( Increment (" them ", Ġ 0 Ġto Ġ 1 )) ĊĊĠĠĠĠĠĠĠ Ġactive Store . on Proxy Message ( Proxy Message . Model Update ( count . data , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġprintln (" Received Ġresult .") ĊĊĠĠĠĠĠĠĠ Ġfirst Call Complete . await () ĊĊĠĠĠĠĠĠĠ Ġprintln (" Setting Ġup Ġfor Ġround Ġtwo ") ĊĠĠĠĠĠĠĠ Ġ// ĠReset , Ġthis Ġtime Ġwe 'll Ġcapture Ġthe Ġmodel Ġit Ġreceives . ĊĠĠĠĠĠĠĠ Ġdriver . do On Send Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Call Complete . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" Calling Ġreceiver : Ġ${ driver . last Receiver }") ĊĠĠĠĠĠĠĠ Ġdriver . last Receiver !!. invoke ( remote Count . data , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprintln (" Called Ġcapt or ") ĊĊĠĠĠĠĠĠĠ Ġsecond Call Complete . await () ĊĊĠĠĠĠĠĠĠ Ġcount . merge ( remote Count . data ) ĊĠĠĠĠĠĠĠ ĠassertThat ( driver . last Data ). isEqualTo ( count . data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġresolves _ combin ation Of Messages _ from Proxy And Driver () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( driver , Ġ_) Ġ= Ġsetup F akes () ĊĊĠĠĠĠĠĠĠ Ġval Ġactive Store Ġ= Ġcreate Store () Ġas ĠDirect Store < Cr dt Data , ĠCr dt Operation , ĠAny ?> ĊĊĠĠĠĠĠĠĠ Ġactive Store . on Proxy Message ( Proxy Message . Operations ( listOf ( Increment (" me ", Ġ 0 Ġto Ġ 1 )), Ġid Ġ= Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġactive Store . on Proxy Message ( Proxy Message . Operations ( listOf ( Increment (" me ", Ġ 1 Ġto Ġ 2 )), Ġid Ġ= Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġactive Store . on Proxy Message ( Proxy Message . Operations ( listOf ( Increment (" me ", Ġ 2 Ġto Ġ 3 )), Ġid Ġ= Ġ 1 )) ĊĊĠĠĠĠĠĠĠ ĠCr dt Count . Data () ĊĠĠĠĠĠĠĠ Ġdriver . last Receiver !!. invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCr dt Count . Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of (" me " Ġto Ġ 1 , Ġ" them " Ġto Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVersion Map (" me " Ġto Ġ 1 , Ġ" them " Ġto Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdriver . last Receiver !!. invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCr dt Count . Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of (" me " Ġto Ġ 1 , Ġ" them " Ġto Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVersion Map (" me " Ġto Ġ 1 , Ġ" them " Ġto Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġactive Store . idle () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( active Store . getLocal Data ()). isEqualTo ( driver . last Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup F akes (): ĠPair < Fake Driver < Cr dt Count . Data >, ĠFake Provider > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfake Driver Ġ= ĠFake Driver < Cr dt Count . Data >() ĊĠĠĠĠĠĠĠ Ġval Ġfake Provider Ġ= ĠFake Provider ( fake Driver ) ĊĠĠĠĠĠĠĠ ĠDriver Factory . register ( fake Provider ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfake Driver Ġto Ġfake Provider ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Set F akes (): ĠPair < Fake Driver < Cr dt Set . Data <* >>, ĠFake Provider > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfake Driver Ġ= ĠFake Driver < Cr dt Set . Data <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġfake Provider Ġ= ĠFake Provider ( fake Driver ) ĊĠĠĠĠĠĠĠ ĠDriver Factory . register ( fake Provider ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfake Driver Ġto Ġfake Provider ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Store () Ġ= ĊĠĠĠĠĠĠĠ ĠDefault Activation Factory < Cr dt Data , ĠCr dt Operation , ĠAny ? >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStore Options ( test Key , ĠCount Type ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠFake Driver < T Ġ: ĠCr dt Data > Ġ: ĠDriver < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstorage Key : ĠStorage Key Ġ= Ġtest Key ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġtoken : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġvar Ġthrow On Send : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġdo On Send : Ġ(( data : ĠT , Ġversion : ĠInt ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġsend ReturnValue : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġlast Receiver : Ġ( suspend Ġ( data : ĠT , Ġversion : ĠInt ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġlast Data : ĠT ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġlast Version : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver : Ġsuspend Ġ( data : ĠT , Ġversion : ĠInt ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Receiver Ġ= Ġreceiver ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġsend ( data : ĠT , Ġversion : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( throw On Send ) Ġthrow ĠUnsupportedOperationException (" Not Ġsupposed Ġto Ġbe Ġcalled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Data Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Version Ġ= Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo On Send ?. invoke ( data , Ġversion ) Ġ?: Ġsend ReturnValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠFake Provider ( val Ġfake Driver : ĠFake Driver <* >) Ġ: ĠDriver Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwill Support ( storage Key : ĠStorage Key ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstorage Key Ġ== Ġtest Key ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< Data Ġ: ĠAny > Ġget Driver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Key : ĠStorage Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Class : ĠK Class < Data >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠType ĊĠĠĠĠĠĠĠ Ġ): ĠDriver < Data > Ġ= Ġfake Driver Ġas ĠDriver < Data > ĊĠĠĠ Ġ} Ċ } Ċ