package Ġviv id . money . el ms lie . core . store Ċ Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . schedul ers . Test Scheduler Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Register Extension Ċ import Ġviv id . money . el ms lie . core . testutil . model . Command Ċ import Ġviv id . money . el ms lie . core . testutil . model . Effect Ċ import Ġviv id . money . el ms lie . core . testutil . model . Event Ċ import Ġviv id . money . el ms lie . core . testutil . model . State Ċ import Ġviv id . money . el ms lie . test . Test Scheduler Extension Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠEl m Store Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscheduler Ġ= ĠTest Scheduler () ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġ@ Register Extension ĊĠĠĠ Ġval Ġextension Ġ= ĠTest Scheduler Extension ( scheduler ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Stopping Ġthe Ġstore Ġworks Ġcorrectly `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore ( State ()) ĊĊĠĠĠĠĠĠĠ Ġstore . start () ĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ()) ĊĠĠĠĠĠĠĠ Ġstore . stop () ĊĊĠĠĠĠĠĠĠ Ġassert (! store . is Started ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Stopping Ġthe Ġstore Ġstops Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult ( state Ġ= Ġstate . copy ( value Ġ= Ġstate . value Ġ+ Ġ 1 ), Ġcommand Ġ= ĠCommand ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠObservable . timer ( 2 , ĠTimeUnit . SECONDS ). map Ġ{ ĠEvent () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġstore . states . test () ĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ()) ĊĠĠĠĠĠĠĠ Ġscheduler . advance Time By ( 6 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġstore . stop () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Values ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 0 ), Ġ// ĠInitial ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 1 ), Ġ// ĠAfter Ġreceiving Ġinitial ĠEvent ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 2 ), Ġ// ĠAfter Ġexecuting Ġfirst Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 3 ), Ġ// ĠAfter Ġexecuting Ġsecond Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 4 ) Ġ Ġ// ĠAfter Ġexecuting Ġthird Ġcommand ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Event Ġtriggers Ġstate Ġupdate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġevent , Ġstate Ġ-> ĠResult ( state Ġ= Ġstate . copy ( value Ġ= Ġevent . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġstore . states . test () ĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ( value Ġ= Ġ 1 0 )) ĊĠĠĠĠĠĠĠ Ġscheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Values ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Not Ġchanged Ġstate Ġis Ġnot Ġemitted `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġevent , Ġstate Ġ-> ĠResult ( state Ġ= Ġstate . copy ( value Ġ= Ġevent . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġstore . states . test () ĊĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ( value Ġ= Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġscheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Values ( State ( 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Emit ted Ġeffect Ġis Ġreceived Ġby Ġob servers `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġevent , Ġstate Ġ-> ĠResult ( state Ġ= Ġstate , Ġeffect Ġ= ĠEffect ( value Ġ= Ġevent . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġstore . effects . test () ĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ( value Ġ= Ġ 7 )) ĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ( value Ġ= Ġ 9 )) ĊĠĠĠĠĠĠĠ Ġscheduler . trigger Actions () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Values ( Effect ( value Ġ= Ġ 7 ), ĠEffect ( value Ġ= Ġ 9 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Command Ġresult Ġis Ġobserved Ġby Ġstore `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġevent , Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate . copy ( value Ġ= Ġevent . value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand ( event . value Ġ- Ġ 1 ). take If Ġ{ Ġevent . value Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠObservable . just ( Event ( it . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġstore . states . test () ĊĊĠĠĠĠĠĠĠ Ġstore . accept ( Event ( 3 )) ĊĠĠĠĠĠĠĠ Ġscheduler . trigger Actions () ĊĠĠĠĠĠĠĠ Ġstore . stop () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Values ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 0 ), Ġ// ĠInitial ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 3 ), Ġ// ĠAfter Ġreceiving Ġinitial ĠEvent ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 2 ), Ġ// ĠAfter Ġexecuting Ġfirst Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 1 ), Ġ// ĠAfter Ġexecuting Ġsecond Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( 0 ) Ġ Ġ// ĠAfter Ġexecuting Ġthird Ġcommand ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstore ( ĊĠĠĠĠĠĠĠ Ġstate : ĠState , ĊĠĠĠĠĠĠĠ Ġreducer : ĠState Reducer < Event , ĠState , ĠEffect , ĠCommand > Ġ= ĠNo Op Reducer (), ĊĠĠĠĠĠĠĠ Ġactor : ĠActor < Command , ĠEvent > Ġ= ĠNo Op Actor () ĊĠĠĠ Ġ) Ġ= ĠEl m Store ( state , Ġreducer , Ġactor ) Ċ } Ċ