package Ġde . half bit . com achine . tests Ċ Ċ import Ġde . half bit . com achine . com achine Ċ import Ġde . half bit . com achine . start In Scope Ċ import Ġde . half bit . com achine . tests . utils . await Ċ import Ġde . half bit . com achine . tests . utils . execute Blocking Test Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Timeout Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠOn Suspend able Latest Test Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠState ( val Ġdone : ĠBoolean Ġ= Ġfalse ) ĊĠĠĠ Ġdata Ġclass ĠEvent ( val Ġindex : ĠInt ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnew Events Replace The Current One If It Was InProgress () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġmutable ListOf < Event >() ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Event Job : ĠJob ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġall Events Sent Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcom achine < State , ĠEvent >( start With Ġ= ĠState ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen In < State > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Latest < Event > Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Event Job Ġ= Ġlaunch Ġ{ Ġdelay ( 2 0 0 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Events Sent . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . update Ġ{ Ġcopy ( done Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexecute Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġmutable ListOf < State >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . state . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstates Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . start In Scope ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . send ( Event ( index Ġ= Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Events Sent . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . await < State > Ġ{ Ġdone Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġevents . size Ġ>= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" The Ġlist Ġcan Ġhave Ġless Ġevents , Ġbecause Ġsome Ġevents Ġcan Ġbe " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġcancelled Ġeven Ġbefore Ġthey Ġare Ġscheduled Ġfor Ġlaunch . ĠNon et he less ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġthe Ġvery Ġfirst Ġand Ġthe Ġvery Ġlast Ġevent Ġ( tw ice , Ġbecause Ġthe Ġlast Ġevent " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġis Ġprocessed Ġcompletely ) Ġare Ġexpected ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( events [ 0 ], ĠEvent ( index Ġ= Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( events [ events . last Index Ġ- Ġ 1 ], ĠEvent ( index Ġ= Ġ 9 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( events [ events . last Index ], ĠEvent ( index Ġ= Ġ 9 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġfirst Event Job ?. is Cancelled Ġ== Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Expect Ġfirst Ġevent 's Ġjob Ġto Ġbe Ġcancelled " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }