package Ġru . dim su z . unic orn . coroutines Ċ Ċ import Ġapp . cash . tur bine . test Ċ import Ġio . kot est . assertions . throw ables . should Throw Message Ċ import Ġio . kot est . core . spec . style . Should Spec Ċ import Ġio . kot est . matchers . collections . should Contain Exactly Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . kot est . matchers . should Not Be Ċ import Ġio . kot est . property . Ar b Ċ import Ġio . kot est . property . ar bitrary . ar bitrary Ċ import Ġio . kot est . property . ar bitrary . int Ċ import Ġio . kot est . property . ar bitrary . list Ċ import Ġio . kot est . property . ar bitrary . next Ċ import Ġio . kot est . property . ar bitrary . string Ċ import Ġio . kot est . property . check All Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . flow . Mutable Shared Flow Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . flow . onStart Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . concurrent . atomic . Atomic Long Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ class ĠMachine Dsl Test Ġ: ĠShould Spec ({ ĊĠ Ġcontext (" initial Ġstate ") Ġ{ ĊĠĠĠ Ġshould (" throw Ġif Ġnot Ġspecified ") Ġ{ ĊĠĠĠĠĠ Ġshould Throw Message (" initial Ġstate Ġis Ġmissing ") Ġ{ ĊĠĠĠĠĠĠĠ Ġmachine < Unit , ĠUnit > Ġ{ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" emit Ġinitial Ġstate Ġfirst ") Ġ{ ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 3 Ġto Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe Ġ 3 ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcontext (" transitions ") Ġ{ ĊĠĠĠ Ġshould (" perform Ġtransitions Ġgiven Ġst reamed Ġpayload s ") Ġ{ ĊĠĠĠĠĠ Ġcheck All Ġ{ Ġinitial Value : ĠList < Int >, Ġpayload s : ĠList < Int > Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġinitial Ġ= Ġinitial Value Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġon Each ( payload s . as Flow ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġpayload Ġ-> Ġstate . plus ( payload ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ Ġval Ġawait ed States Ġ= Ġmutable ListOf ( initial Value ) ĊĠĠĠĠĠĠĠ Ġpayload s . map To ( await ed States ) Ġ{ Ġpayload Ġ-> Ġawait ed States . last () Ġ+ Ġpayload Ġ} ĊĊĠĠĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait ed States . forEach Ġ{ Ġawait ed State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe Ġawait ed State ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" perform Ġtransitions Ġgiven Ġnullable Ġst reamed Ġpayload s ") Ġ{ ĊĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠ Ġval Ġpayload s Ġ= Ġflow Of ( 3 , Ġnull , Ġ 4 , Ġnull , Ġ 5 ) ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int ? >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġmutable ListOf < Int ?> () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( payload s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġpayload Ġ-> Ġstate . plus ( payload ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠ Ġval Ġawait ed States Ġ= Ġmutable ListOf ( emptyList < Int ?> ()) ĊĠĠĠĠĠ ĠlistOf ( 3 , Ġnull , Ġ 4 , Ġnull , Ġ 5 ). map To ( await ed States ) Ġ{ Ġpayload Ġ-> Ġawait ed States . last () Ġ+ Ġpayload Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġawait ed States . forEach Ġ{ Ġawait ed State Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe Ġawait ed State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" perform Ġtransitions Ġgiven Ġdiscrete Ġevents ") Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . list ( Ar b . events (), Ġ 0 .. 2 0 )) Ġ{ Ġevents : ĠList < Event > Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Pair < List < Int >, ĠString >, ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ( listOf ( 3 ) Ġto Ġ"") Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġevent Ġ-> Ġstate . copy ( first Ġ= Ġstate . first . plus ( event . value )) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġon ( Event . E 2 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġevent Ġ-> Ġstate . copy ( second Ġ= Ġstate . second . plus ( event . value )) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠ Ġevents . forEach Ġ{ Ġm . send ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠĠĠ Ġval Ġawait ed States Ġ= Ġmutable ListOf ( listOf ( 3 ) Ġto Ġ"") ĊĠĠĠĠĠĠĠĠĠ Ġevents . map To ( await ed States ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġawait ed States . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . E 1 Ġ-> Ġstate . copy ( first Ġ= Ġstate . first Ġ+ Ġevent . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . E 2 Ġ-> Ġstate . copy ( second Ġ= Ġstate . second Ġ+ Ġevent . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġawait ed States . forEach Ġ{ Ġawait ed State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe Ġawait ed State ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" not Ġthrow Ġerrors Ġwhen Ġno Ġtransitions Ġin Ġon Each - clause ") Ġ{ ĊĠĠĠĠĠ Ġ// Ġsuch Ġmachine Ġis Ġvalid Ġbecause Ġit Ġcan Ġcontain Ġactions Ġto Ġexecute ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġ/* Ġdo Ġsomething Ġawesome Ġ*/ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe ĠlistOf ( 3 ) ĊĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe ĠlistOf ( 3 ) ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" not Ġthrow Ġerrors Ġwhen Ġno Ġtransitions Ġin Ġon - clause ") Ġ{ ĊĠĠĠĠĠ Ġ// Ġsuch Ġmachine Ġis Ġvalid Ġbecause Ġit Ġcan Ġcontain Ġactions Ġto Ġexecute ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġ/* Ġdo Ġsomething Ġawesome Ġ*/ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 2 4 )) ĊĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe ĠlistOf ( 3 ) ĊĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe ĠlistOf ( 3 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" process Ġboth Ġon Ġand Ġon Each Ġsources Ġwhen Ġthey Ġare Ġmixed ") Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . list ( Ar b . events (), Ġrange Ġ= Ġ 0 .. 2 0 )) Ġ{ Ġevents : ĠList < Event > Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠ Ġval Ġst reamed Source Ġ= ĠMutable Shared Flow < String >() ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġevent Ġ-> Ġstate . plus ( event . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġon Each ( stre amed Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġpayload Ġ-> Ġstate . plus ( payload . length Ġ* Ġ 1 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠ Ġevents . forEach Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . E 1 Ġ-> Ġm . send ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . E 2 Ġ-> Ġst reamed Source . emit ( event . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠĠĠ Ġval Ġawait ed States Ġ= Ġmutable ListOf ( listOf ( 3 )) ĊĠĠĠĠĠĠĠĠĠ Ġevents . map To ( await ed States ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġawait ed States . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . E 1 Ġ-> Ġstate Ġ+ Ġevent . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent . E 2 Ġ-> Ġstate Ġ+ Ġevent . value . length Ġ* Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġawait ed States . forEach Ġ{ Ġawait ed State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Item () ĠshouldBe Ġawait ed State ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" call Ġtransition Ġblock Ġonly Ġfor Ġspecific Ġstreaming Ġpayload s ") Ġ{ ĊĠĠĠĠĠ Ġvar Ġfirst Block Call Count Ġ= Ġ 0 ĊĠĠĠĠĠ Ġvar Ġsecond Block Call Count Ġ= Ġ 0 ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 0 , Ġ 2 0 , Ġ 3 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Block Call Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of (" a ", Ġ" b ", Ġ" c ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Block Call Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 7 ) Ġ{ Ġawait Item () Ġ} Ġ// Ġinitial Ġ+ Ġ 6 Ġemission s ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠĠĠ Ġfirst Block Call Count ĠshouldBe Ġ 3 ĊĠĠĠĠĠĠĠ Ġsecond Block Call Count ĠshouldBe Ġ 3 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" subscribe Ġto Ġst reamed Ġpayload s Ġonly Ġonce ") Ġ{ ĊĠĠĠĠĠ Ġval Ġcount Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 0 , Ġ 2 0 , Ġ 3 0 ). onStart Ġ{ Ġcount . increment AndGet () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġ_ Ġ-> Ġstate Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 4 ) Ġ{ Ġawait Item () Ġ} Ġ// Ġinitial Ġ+ Ġ 3 Ġemission s ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġcount . get () ĠshouldBe Ġ 1 ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcontext (" actions ") Ġ{ ĊĠĠĠ Ġshould (" execute Ġinitial Ġaction Ġif Ġspecified ") Ġ{ ĊĠĠĠĠĠ Ġvar Ġexecuted Ġ= Ġfalse ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 3 Ġto Ġ{ Ġexecuted Ġ= Ġtrue Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ Ġexecuted ĠshouldBe Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġaction Ġin Ġon Each - clause Ġon Ġeach Ġemission ") Ġ{ ĊĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 , Ġ 2 , Ġ 3 , Ġ 4 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġ_ Ġ-> Ġstate Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġcount Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ Ġcount ĠshouldBe Ġ 4 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġaction Ġin Ġon Each - clause Ġwith Ġcorrect Ġarguments ") Ġ{ ĊĠĠĠĠĠ Ġval Ġarguments : ĠMutable List < Action Args < List < Int >, ĠInt >> Ġ= Ġarray ListOf () ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 , Ġ 2 , Ġ 3 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġpayload Ġ-> Ġstate . plus ( payload ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġprev State , ĠnewState , Ġpayload Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠ Ġrepeat ( 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ Ġarguments Ġshould Contain Exactly ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠ ĠAction Args ( listOf ( 3 ), ĠlistOf ( 3 , Ġ 1 ), Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 1 , Ġ 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġaction Ġin Ġon - clause Ġwith Ġcorrect Ġarguments ") Ġ{ ĊĠĠĠĠĠ Ġval Ġarguments : ĠMutable List < Action Args < List < Int >, ĠEvent >> Ġ= Ġarray ListOf () ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġevent Ġ-> Ġstate . plus ( event . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġprev State , ĠnewState , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon ( Event . E 2 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġevent Ġ-> Ġstate . plus ( event . value . toInt () Ġ* Ġ 1 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġprev State , ĠnewState , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 2 (" 3 3 ")) ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 8 8 )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠ Ġrepeat ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ Ġarguments Ġshould Contain Exactly ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 3 3 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent . E 2 (" 3 3 ") ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ ĠAction Args ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 3 3 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 3 3 0 , Ġ 8 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent . E 1 ( 8 8 ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" merge Ġactions Ġin Ġthe Ġon Each - clause Ġand Ġexecute Ġthem Ġse quent ially ") Ġ{ ĊĠĠĠĠĠ Ġval Ġmarkers : ĠMutable List < String > Ġ= Ġarray ListOf () ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < List < Int >, ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= ĠlistOf ( 3 ) Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 , Ġ 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġ_ Ġ-> Ġstate Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġmarkers . add (" action 1 ") Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġmarkers . add (" action 2 ") Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġmarkers . add (" action 3 ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĊĠĠĠĠĠĠĠ Ġmarkers Ġshould Contain Exactly ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠ Ġ" action 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" action 2 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" action 3 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" action 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" action 2 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" action 3 " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġaction Ġin Ġon Each Ġonly Ġonce Ġper Ġreduce ") Ġ{ ĊĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 0 Ġto Ġnull ĊĊĠĠĠĠĠĠĠ Ġon Each ( flow Of (" 1 ", Ġ" 2 ", Ġ" 3 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġawait Complete () ĊĊĠĠĠĠĠĠĠ Ġcount ĠshouldBe Ġ 3 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġaction Ġin Ġon - clause Ġonly Ġonce Ġper Ġreduce ") Ġ{ ĊĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 0 Ġto Ġnull ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 1 )) ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 2 )) ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 3 )) ĊĊĠĠĠĠĠĠĠ Ġrepeat ( 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcount ĠshouldBe Ġ 3 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġcorresponding Ġevent Ġtransition Ġafter Ġon Each - action Ġemits Ġan Ġevent ") Ġ{ ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 0 Ġto Ġnull ĊĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 0 , Ġ 2 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction With Event Ġ{ Ġ_, Ġ_, Ġpayload Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent . E 1 ( payload ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġpayload Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ+ Ġpayload . value ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast State : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlast State Ġ= Ġawait Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast State ĠshouldBe Ġ 3 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" execute Ġcorresponding Ġevent Ġtransition Ġafter Ġon - action Ġemits Ġan Ġevent ") Ġ{ ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 0 Ġto Ġnull ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 2 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction With Event Ġ{ Ġ_, Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent . E 1 ( if Ġ( event . value Ġ== Ġ" he ") Ġ 1 0 Ġelse Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtransition To Ġ{ Ġstate , Ġpayload Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ+ Ġpayload . value ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 2 (" he ")) ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 2 (" l lo ")) ĊĊĠĠĠĠĠĠĠ Ġvar Ġlast State : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġawait Item () ĊĠĠĠĠĠĠĠĠĠ Ġlast State Ġ= Ġs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast State ĠshouldBe Ġ 3 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġthis Ġchecks Ġthe Ġcurrent Ġthread , Ġbut Ġit Ġreally Ġshould Ġcheck Ġrunning Ġin Ġthe Ġcurrent Ġ` Coroutine Context ` ! ĊĠĠĠ Ġ// ĠĠ Ġcurrently Ġnot Ġsure Ġhow Ġto Ġcheck Ġthat ĊĠĠĠ Ġshould (" run Ġactions Ġon Ġcurrent Ġthread Ġby Ġdefault ") Ġ{ ĊĠĠĠĠĠ Ġval Ġtest Thread Id Ġ= ĠThread . currentThread (). id ĊĠĠĠĠĠ Ġval Ġon Each Action Thread Id Ġ= ĠAtomic Long () ĊĠĠĠĠĠ Ġval Ġon Action Thread Id Ġ= ĠAtomic Long () ĊĠĠĠĠĠ Ġval Ġon Action With Event Thread Id Ġ= ĠAtomic Long () ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 3 Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġon Each Action Thread Id . set ( Thread . currentThread (). id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġon Action Thread Id . set ( Thread . currentThread (). id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 2 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction With Event Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġon Action With Event Thread Id . set ( Thread . currentThread (). id ); Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 3 3 )) ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 2 (" hello ")) ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĊĠĠĠĠĠĠĠ Ġon Each Action Thread Id . get () ĠshouldBe Ġtest Thread Id ĊĠĠĠĠĠĠĠ Ġon Action Thread Id . get () ĠshouldBe Ġtest Thread Id ĊĠĠĠĠĠĠĠ Ġon Action With Event Thread Id . get () ĠshouldBe Ġtest Thread Id ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġshould (" run Ġactions Ġon Ġspecified Ġdispatcher ") Ġ{ ĊĠĠĠĠĠ Ġval Ġtest Thread Id Ġ= ĠThread . currentThread (). id ĊĠĠĠĠĠ Ġval Ġon Each Action Thread Id Ġ= ĠAtomic Long () ĊĠĠĠĠĠ Ġval Ġon Action Thread Id Ġ= ĠAtomic Long () ĊĠĠĠĠĠ Ġval Ġon Action With Event Thread Id Ġ= ĠAtomic Long () ĊĠĠĠĠĠ Ġval Ġm Ġ= Ġmachine < Int , ĠEvent >( Executors . new Fixed ThreadPool ( 8 ). as Coroutine Dispatcher ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ 3 Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġon Each ( flow Of ( 1 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Each Action Thread Id . set ( Thread . currentThread (). id ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 1 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Action Thread Id . set ( Thread . currentThread (). id ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon ( Event . E 2 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction With Event Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Action With Event Thread Id . set ( Thread . currentThread (). id ); Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġm . states . test Ġ{ ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 1 ( 3 3 )) ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĠĠĠĠĠĠĠ Ġm . send ( Event . E 2 (" hello ")) ĊĠĠĠĠĠĠĠ Ġawait Item () ĊĊĠĠĠĠĠĠĠ Ġon Each Action Thread Id . get () Ġshould Not Be Ġtest Thread Id ĊĠĠĠĠĠĠĠ Ġon Action Thread Id . get () Ġshould Not Be Ġtest Thread Id ĊĠĠĠĠĠĠĠ Ġon Action With Event Thread Id . get () Ġshould Not Be Ġtest Thread Id ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġerror Ġwhen Ġ 2 Ġtransition To Ġblocks ĊĠĠĠ Ġ// ĠTODO Ġno Ġerror Ġwhen Ġno Ġtransitions Ġand Ġno Ġactions ĊĠ Ġ} Ċ }) Ċ Ċ private Ġsealed Ġclass ĠEvent Ġ{ ĊĠ Ġdata Ġclass ĠE 1 ( val Ġvalue : ĠInt ) Ġ: ĠEvent () ĊĠ Ġdata Ġclass ĠE 2 ( val Ġvalue : ĠString ) Ġ: ĠEvent () Ċ } Ċ Ċ type alias ĠAction Args < S , ĠP > Ġ= ĠTrip le < S , ĠS , ĠP > Ċ Ċ private Ġfun ĠA rb . Companion . events (): ĠA rb < Event > Ġ{ ĊĠ Ġreturn Ġarbitrary Ġ{ Ġrs Ġ-> ĊĠĠĠ Ġval Ġuse First Ġ= Ġrs . random . next Boolean () ĊĠĠĠ Ġif Ġ( use First ) Ġ{ ĊĠĠĠĠĠ ĠEvent . E 1 ( Ar b . int (). next ( rs )) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠEvent . E 2 ( Ar b . string (). next ( rs )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ