package Ġcom . air bnb . mv rx . mock ing Ċ Ċ import Ġcom . air bnb . mv rx . M aver icks ViewModel Config Ċ import Ġcom . air bnb . mv rx . M aver icks State Ċ import Ġcom . air bnb . mv rx . mock ing . Mock Behavior . InitialState Mock ing Ċ import Ġcom . air bnb . mv rx . mock ing . Mock Behavior . State Store Behavior Ċ import Ġcom . air bnb . mv rx . test . Mv Rx Test Rule Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . flow . first OrNull Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertNull Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Class Rule Ċ import Ġorg . junit . Test Ċ Ċ class ĠMock able M aver icks State Store Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġ@ Class Rule ĊĠĠĠĠĠĠĠ Ġval Ġmv rx Test Rule Ġ= ĠM v Rx Test Rule () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġadd On Disposed Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisposed Stores Ġ= Ġmutable Set Of < Mock able M aver icks State Store <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Cancel Listener Ġ{ Ġdisposed Stores . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( dis posed Stores . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġstore . coroutine Scope . coroutine Context [ Job ] !!. invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( store ), Ġdisposed Stores ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstore . coroutine Scope . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon Disposed Called Immediate ly If Already Disposed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisposed Stores Ġ= Ġmutable Set Of < Mock able M aver icks State Store <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĠĠĠĠĠĠĠ Ġstore . coroutine Scope . cancel () ĊĊĠĠĠĠĠĠĠ Ġstore . add On Cancel Listener Ġ{ Ġdisposed Stores . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( store ), Ġdisposed Stores ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠsetState No op When Script able () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 5 ) Ġ} ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġstate . num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠsetState Callback When Script able () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġvar Ġprevious State : ĠTest State ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar ĠnewState : ĠTest State ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġstore . add On State Set Listener Ġ{ Ġprev , Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious State Ġ= Ġprev ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewState Ġ= Ġnew ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 5 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Test State (), Ġprevious State ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Test State ( 5 ), ĠnewState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove Set State Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġvar Ġprevious State : ĠTest State ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar ĠnewState : ĠTest State ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġstate Callback Ġ= Ġ{ Ġprev : ĠTest State , Ġnew : ĠTest State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious State Ġ= Ġprev ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewState Ġ= Ġnew ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstore . add On State Set Listener ( state Callback ) ĊĠĠĠĠĠĠĠ Ġstore . remove On State Set Listener ( state Callback ) ĊĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 5 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertNull ( previous State ) ĊĠĠĠĠĠĠĠ ĠassertNull ( newState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnext State When Script able () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġstore . next ( Test State ( 5 )) ĊĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġstate . num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnext Triggers Observable () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĊĠĠĠĠĠĠĠ Ġstore . next ( Test State ( 5 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġflow Value Ġ= Ġstore . flow . first OrNull () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Test State ( 5 ), Ġflow Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġnext State When Normal Behavior Fails () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store ( State Store Behavior . Normal ) ĊĠĠĠĠĠĠĠ Ġstore . next ( Test State ( 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġnext State When S ynchronous Behavior Fails () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store ( State Store Behavior . S ynchronous ) ĊĠĠĠĠĠĠĠ Ġstore . next ( Test State ( 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset AndGet State S ynchronously () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store ( State Store Behavior . S ynchronous ) ĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 5 ) Ġ} ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġstate . num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset AndGet State Norm ally () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNormal Ġbehavior Ġwould Ġbe Ġasync , Ġbut Ġthe Ġtest Ġenvironment Ġforces Ġit Ġsynchronous ly ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store ( State Store Behavior . Normal ) ĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 5 ) Ġ} ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġstate . num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġswitching From Script able ToS ynchronous () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store () ĊĠĠĠĠĠĠĠ Ġstore . next ( Test State ( 5 )) ĊĊĠĠĠĠĠĠĠ Ġstore . mock Behavior Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . mock Behavior . copy ( state Store Behavior Ġ= ĠState Store Behavior . S ynchronous ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠState Ġforced Ġby Ġ" next " Ġis Ġinherited Ġwhen Ġthe Ġstate Ġstores Ġare Ġswitched ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĠassertEquals ( 5 , Ġstate . num ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNew Ġstate Ġstore Ġbehavior Ġtakes Ġeffect , Ġand Ġwe Ġcan Ġset Ġstates Ġnormally ĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 6 ) Ġ} ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĠassertEquals ( 6 , Ġstate . num ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġswitching From S ynchronous To Script able () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store ( State Store Behavior . S ynchronous ) ĊĠĠĠĠĠĠĠ Ġstore . set Ġ{ ĠTest State ( 5 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġstore . mock Behavior Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . mock Behavior . copy ( state Store Behavior Ġ= ĠState Store Behavior . Script able ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠState Ġforced Ġby Ġ" set " Ġis Ġinherited Ġwhen Ġthe Ġstate Ġstores Ġare Ġswitched ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġstate . num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNew Ġstate Ġstore Ġbehavior Ġtakes Ġeffect , Ġand Ġwe Ġcan Ġscript Ġstate ĊĠĠĠĠĠĠĠ Ġstore . next ( Test State ( 6 )) ĊĠĠĠĠĠĠĠ Ġstore . get Ġ{ Ġstate Ġ-> ĠassertEquals ( 6 , Ġstate . num ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Store ( ĊĠĠĠĠĠĠĠ Ġstore Behavior : ĠState Store Behavior Ġ= ĠState Store Behavior . Script able ĊĠĠĠ Ġ): ĠMock able M aver icks State Store < Test State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMock able M aver icks State Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest State (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Behavior ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState Mock ing Ġ= ĠInitial State Mock ing . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Execution s Ġ= ĠM aver icks ViewModel Config . Block Execution s . No , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Store Behavior Ġ= Ġstore Behavior ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ= Ġtest Coroutine Scope () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠTest State ( val Ġnum : ĠInt Ġ= Ġ 0 ) Ġ: ĠM aver icks State Ċ }