package Ġcom . speaker box lite . rx entity Ċ Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Test Ċ Ċ interface ĠTest Entity Back Protocol : ĠEntity Back Int Ċ { ĊĠĠĠ Ġval Ġid : ĠInt ĊĠĠĠ Ġval Ġvalue : ĠString ĊĠĠĠ Ġval Ġindirect Id : ĠInt ĊĠĠĠ Ġval Ġindirect Value : ĠString ĊĊĠĠĠ Ġoverride Ġval Ġ_ key : ĠInt Ġget () Ġ= Ġid Ċ } Ċ Ċ data Ġclass ĠTest Entity Back ( override Ġval Ġid : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvalue : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġindirect Id : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġindirect Value : ĠString Ġ= Ġ"") Ġ: ĠTest Entity Back Protocol Ċ { ĊĠĠĠ Ġ/* constructor ( entity : ĠTest Entity Back Protocol ) Ġ{ ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġentity . id ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġentity . value ĊĠĠĠĠĠĠĠ Ġindirect Id Ġ= Ġentity . indirect Id ĊĠĠĠĠĠĠĠ Ġindirect Value Ġ= Ġentity . indirect Value ĊĠĠĠ Ġ}*/ Ċ } Ċ Ċ interface ĠIn direct Entity Back Protocol : ĠEntity Back Int Ċ { ĊĠĠĠ Ġval Ġid : ĠInt ĊĠĠĠ Ġval Ġvalue : ĠString ĊĊĠĠĠ Ġoverride Ġval Ġ_ key : ĠInt Ġget () Ġ= Ġid Ċ } Ċ Ċ data Ġclass ĠIn direct Entity Back ( override Ġval Ġid : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvalue : ĠString ): ĠIn direct Entity Back Protocol Ċ { Ċ /* ĊĠĠĠ Ġconstructor ( entity : ĠTest Entity Back Protocol ) Ġ{ ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġentity . id ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġentity . value ĊĠĠĠ Ġ}*/ Ċ } Ċ Ċ open Ġclass ĠTest Repository < Entity : ĠEntity Back Int >: ĠEntity Repository < Int , ĠEntity >() Ċ { ĊĠĠĠ Ġvar Ġitems : ĠMutable List < Entity > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġfun ĠAdd ( entities : ĠList < Entity >) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġitems . addAll ( entities ) ĊĠĠĠĠĠĠĠ Ġrx Entities Updated . onNext ( entities . map Ġ{ ĠEntity Updated ( key Ġ= Ġit ._ key , Ġoperation Ġ= ĠUpdate Operation . Insert ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠUpdate ( entity : ĠEntity ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġitems . indexOf First Ġ{ Ġentity ._ key Ġ== Ġit ._ key Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ i ] Ġ= Ġentity ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . add ( entity ) ĊĊĠĠĠĠĠĠĠ Ġrx Entities Updated . onNext ( listOf ( Entity Updated ( key Ġ= Ġentity ._ key , Ġoperation Ġ= ĠUpdate Operation . Update ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDelete ( key : ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġitems . removeAll Ġ{ Ġit ._ key Ġ== Ġkey Ġ} ĊĠĠĠĠĠĠĠ Ġrx Entities Updated . onNext ( listOf ( Entity Updated ( key Ġ= Ġkey , Ġoperation Ġ= ĠUpdate Operation . Delete ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠClear () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġitems . clear () ĊĠĠĠĠĠĠĠ Ġrx Entities Updated . onNext ( listOf ( Entity Updated ( key Ġ= Ġ 0 , Ġoperation Ġ= ĠUpdate Operation . Clear ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠRx Get ( key : ĠInt ): ĠSingle < Optional < Entity >> Ġ= ĠSingle . just ( Optional ( items . first OrNull Ġ{ Ġit ._ key Ġ== Ġkey Ġ})) ĊĊĠĠĠ Ġoverride Ġfun ĠRx Get ( keys : ĠList < Int >): ĠSingle < List < Entity >> Ġ= ĠSingle . just ( items . filter Ġ{ Ġkeys . contains ( it ._ key ) Ġ}) Ċ } Ċ Ċ type alias ĠTest Repository Indirect Ġ= ĠTest Repository < Indirect Entity Back > Ċ Ċ class ĠTest Repository Direct ( val Ġsecond : ĠTest Repository Indirect ): ĠTest Repository < Test Entity Back >() Ċ { ĊĠĠĠ Ġoverride Ġfun ĠRx Get ( key : ĠInt ): ĠSingle < Optional < Test Entity Back >> Ġ= Ġsuper . Rx Get ( key Ġ= Ġkey ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . value Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( Optional ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRx Load ( entities Ġ= ĠlistOf ( it . value !! )). map Ġ{ ĠOptional ( it . first OrNull ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠRx Get ( keys : ĠList < Int >): ĠSingle < List < Test Entity Back >> Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . Rx Get ( keys Ġ= Ġkeys ). flatMap Ġ{ Ġthis . Rx Load ( entities Ġ= Ġit ) Ġ} ĊĊĠĠĠ Ġfun ĠRx Load ( entities : ĠList < Test Entity Back >): ĠSingle < List < Test Entity Back >> ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġentities . map Ġ{ Ġit . indirect Id Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. Rx Get ( keys Ġ= Ġkeys ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Entities Back Map () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġm Ġ-> Ġ Ġentities . map Ġ{ ĠTest Entity Back ( id Ġ= Ġit . id , Ġvalue Ġ= Ġit . value , Ġindirect Id Ġ= Ġit . indirect Id , Ġindirect Value Ġ= Ġm [ it . indirect Id ]?. value Ġ?: Ġ"") Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTest Entity Mapper : ĠEntity Factory < Int , ĠTest Entity Back , ĠTest Entity > Ċ { ĊĠĠĠ Ġoverride Ġfun Ġmap ( entity : ĠTest Entity Back ): ĠTest Entity Ġ= ĠTest Entity ( entity . id , Ġentity . value , Ġentity . indirect Id , Ġentity . indirect Value ) Ċ } Ċ Ċ class ĠRepository UnitTest Ċ { ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Repositories () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠTest Repository < Test Entity Back >() ĊĠĠĠĠĠĠĠ Ġrepository . Add ( entities Ġ= ĠlistOf ( Test Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" test 1 "), ĠTest Entity Back ( id Ġ= Ġ 2 , Ġvalue Ġ= Ġ" test 2 "))) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= ĠEntity Observable Collection Extra Back Int < Test Entity , ĠTest Entity Back , ĠExtra Collection Params >( Schedulers . tr amp oline (), Ġcollection Extra Ġ= ĠExtra Collection Params ( test =" 2 ")) ĊĠĠĠĠĠĠĠ Ġcollection . repository Ġ= Ġrepository ĊĠĠĠĠĠĠĠ Ġcollection . entity Factory Ġ= ĠTest Entity Mapper () Ġas ĠEntity Factory < Int , ĠEntity Back < Int >, ĠTest Entity > ĊĊĠĠĠĠĠĠĠ Ġval Ġall Array Ġ= Ġcollection . create Array Back Ġ{ ĠSingle . just ( repository . items ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcollection . create Key Array ( keys Ġ= ĠlistOf ( 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġcollection . create Single ( key Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġd Ġ= Ġsingle . subscribe Ġ{ ĠAssert . assertEquals (" test 1 ", Ġit . value !!. value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" test 1 ", Ġit [ 0 ]. value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" test 2 ", Ġit [ 1 ]. value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġrepository . Update ( entity Ġ= ĠTest Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" test 1 - new ")) ĊĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . subscribe Ġ{ ĠAssert . assertEquals (" test 1 - new ", Ġit . value !!. value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĠAssert . assertEquals (" test 1 - new ", Ġit [ 0 ]. value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġrepository . Delete ( key Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . rx State . subscribe Ġ{ ĠAssert . assertEquals ( Single Observable Extra . State . Deleted , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 , Ġit [ 0 ]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" test 2 ", Ġit [ 0 ]. value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġsingle . key Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . subscribe Ġ{ ĠAssert . assertEquals (" test 2 ", Ġit . value !!. value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġsingle . key Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . subscribe Ġ{ ĠAssert . assertEquals ( null , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . rx State . subscribe Ġ{ ĠAssert . assertEquals ( Single Observable Extra . State . NotFound , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Repositories Clear () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠTest Repository < Test Entity Back >() ĊĠĠĠĠĠĠĠ Ġrepository . Add ( entities Ġ= ĠlistOf ( Test Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" test 1 "), ĠTest Entity Back ( id Ġ= Ġ 2 , Ġvalue Ġ= Ġ" test 2 "))) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= ĠEntity Observable Collection Extra Back Int < Test Entity , ĠTest Entity Back , ĠExtra Collection Params >( Schedulers . tr amp oline (), Ġcollection Extra Ġ= ĠExtra Collection Params ( test =" 2 ")) ĊĠĠĠĠĠĠĠ Ġcollection . repository Ġ= Ġrepository ĊĠĠĠĠĠĠĠ Ġcollection . entity Factory Ġ= ĠTest Entity Mapper () Ġas ĠEntity Factory < Int , ĠEntity Back < Int >, ĠTest Entity > ĊĊĠĠĠĠĠĠĠ Ġval Ġall Array Ġ= Ġcollection . create Array Back Ġ{ ĠSingle . just ( repository . items ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcollection . create Key Array ( keys Ġ= ĠlistOf ( 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġcollection . create Single ( key Ġ= Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġd Ġ= Ġarray . subscribe Ġ{ ĠAssert . assertEquals ( 2 , Ġit . size ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġrepository . Clear () ĊĊĠĠĠĠĠĠĠ Ġd Ġ= Ġall Array . subscribe Ġ{ ĠAssert . assertEquals ( 0 , Ġit . size ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĠAssert . assertEquals ( 0 , Ġit . size ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . rx State . subscribe Ġ{ ĠAssert . assertEquals ( Single Observable Extra . State . Deleted , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Array Refresh () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠTest Repository < Test Entity Back >() ĊĠĠĠĠĠĠĠ Ġrepository . Add ( entities Ġ= ĠlistOf ( Test Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" test 1 "), ĠTest Entity Back ( id Ġ= Ġ 2 , Ġvalue Ġ= Ġ" test 2 "))) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= ĠEntity Observable Collection Extra Back Int < Test Entity , ĠTest Entity Back , ĠExtra Collection Params >( Schedulers . tr amp oline (), Ġcollection Extra Ġ= ĠExtra Collection Params ( test =" 2 ")) ĊĠĠĠĠĠĠĠ Ġcollection . repository Ġ= Ġrepository ĊĠĠĠĠĠĠĠ Ġcollection . entity Factory Ġ= ĠTest Entity Mapper () Ġas ĠEntity Factory < Int , ĠEntity Back < Int >, ĠTest Entity > ĊĊĠĠĠĠĠĠĠ Ġval Ġall Array Ġ= Ġcollection . create Array Back Ġ{ ĠSingle . just ( repository . items ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcollection . create Key Array ( keys Ġ= ĠlistOf ( 1 , Ġ 2 )) ĊĊĠĠĠĠĠĠĠ Ġrepository . items . clear () ĊĠĠĠĠĠĠĠ Ġcollection . refresh () ĊĊĠĠĠĠĠĠĠ Ġvar Ġd Ġ= Ġall Array . subscribe Ġ{ ĠAssert . assertEquals ( 0 , Ġit . size ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĠAssert . assertEquals ( 0 , Ġit . size ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Repositories Connect () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Indirect Ġ= ĠTest Repository Indirect () ĊĠĠĠĠĠĠĠ Ġrepository Indirect . Add ( entities Ġ= ĠlistOf ( Indirect Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" indirect 1 "), ĠIn direct Entity Back ( id Ġ= Ġ 2 , Ġvalue Ġ= Ġ" indirect 2 "))) ĊĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠTest Repository Direct ( repository Indirect ) ĊĠĠĠĠĠĠĠ Ġrepository . Add ( entities Ġ= ĠlistOf ( Test Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" test 1 ", Ġindirect Id Ġ= Ġ 2 , Ġindirect Value Ġ= Ġ""), ĠTest Entity Back ( id Ġ= Ġ 2 , Ġvalue Ġ= Ġ" test 2 ", Ġindirect Id Ġ= Ġ 1 , Ġindirect Value Ġ= Ġ" "))) ĊĊĠĠĠĠĠĠĠ Ġrepository . connect ( repository Indirect , ĠTest Entity :: indirect Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= ĠEntity Observable Collection Extra Back Int < Test Entity , ĠTest Entity Back , ĠExtra Collection Params >( Schedulers . tr amp oline (), Ġcollection Extra Ġ= ĠExtra Collection Params ( test =" 2 ")) ĊĠĠĠĠĠĠĠ Ġcollection . repository Ġ= Ġrepository ĊĠĠĠĠĠĠĠ Ġcollection . entity Factory Ġ= ĠTest Entity Mapper () Ġas ĠEntity Factory < Int , ĠEntity Back < Int >, ĠTest Entity > ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġcollection . create Single ( key Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcollection . create Key Array ( keys Ġ= ĠlistOf ( 1 , Ġ 2 )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġd Ġ= Ġsingle . subscribe Ġ{ ĠAssert . assertEquals (" indirect 2 ", Ġit . value !!. indirect Value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" indirect 2 ", Ġit [ 0 ]. indirect Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" indirect 1 ", Ġit [ 1 ]. indirect Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĊĠĠĠĠĠĠĠ Ġrepository Indirect . Update ( entity Ġ= ĠIn direct Entity Back ( id Ġ= Ġ 1 , Ġvalue Ġ= Ġ" indirect - 1 ")) ĊĠĠĠĠĠĠĠ Ġrepository Indirect . Update ( entity Ġ= ĠIn direct Entity Back ( id Ġ= Ġ 2 , Ġvalue Ġ= Ġ" indirect - 2 ")) ĊĊĠĠĠĠĠĠĠ Ġd Ġ= Ġsingle . subscribe Ġ{ ĠAssert . assertEquals (" indirect - 2 ", Ġit . value !!. indirect Value ) Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠĠĠĠĠ Ġd Ġ= Ġarray . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" indirect - 2 ", Ġit [ 0 ]. indirect Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" indirect - 1 ", Ġit [ 1 ]. indirect Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġd . dispose () ĊĠĠĠ Ġ} Ċ }