package Ġcom . ms ab hi . shared Ċ Ċ import Ġkotlinx . coroutines . run Blocking ĊĊ Ċ class ĠClass ic Store State Replay Test Ġ{ ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġreplay Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// single Replay Test Iteration ( N Ġ= Ġ 2 0 0 , Ġsubscribers Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġreplay Large Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// single Replay Test Iteration ( N Ġ= Ġ 5 0 0 , Ġsubscribers Ġ= Ġ 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġconsistency Ġof Ġproduced Ġflow . ĠE . g . Ġfor Ġjust Ġincrement Ġreducer Ġoutput Ġmust Ġbe ĊĠĠĠĠ Ġ* Ġ 1 , 2 , 3 , 4 , 5 ĊĠĠĠĠ Ġ* Ġnot Ġ 1 , 3 , 4 , 5 Ġ( value Ġmissing ) ĊĠĠĠĠ Ġ* Ġor Ġ 4 , 3 , 4 , 5 Ġ( incorrect Ġorder ) ĊĠĠĠĠ Ġ* Ġor Ġ 3 , 3 , 4 , 5 Ġ( duplicate Ġvalue ) ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ/* private Ġfun Ġsingle Replay Test Iteration ( N : ĠInt , Ġsubscribers : ĠInt ) Ġ= Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= ĠMutable Shared Flow < Counter State >( replay Ġ= Ġ 1 ). apply Ġ{ Ġtry Emit ( Counter State ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Change Listeners Ġ= Ġarray ListOf < State ChangeListener < Counter State >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsubscribers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Change Listeners . add Ġ{ Ġstates . try Emit ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠClass ic Store ( Counter State (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: counter State Reduce , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Change Listeners , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor ()) ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore . dispatch ( Counter Action . Increment Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOne Ġmore Ġscope Ġfor Ġsubscribers , Ġto Ġensure Ġsubscribers Ġare Ġfinished Ġbefore Ġcancell ing Ġstore Ġscope ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( subscribers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġonly Ġincrease Ġby Ġ 1 Ġreduc ers Ġare Ġapplied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit 's Ġexpected Ġto Ġsee Ġmon oton ously Ġincreasing Ġsequence Ġwith Ġno Ġmissing Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstates . take While Ġ{ Ġit . counter Ġ< ĠN Ġ}. toList (). zip With Next Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( a . counter Ġ+ Ġ 1 , Ġb . counter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ}*/ Ċ }