package Ġru . n sk . k state machine Ċ Ċ import Ġio . kot est . assertions . throw ables . should Throw Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . kot est . matchers . collections . should Contain Exactly Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . mock k . verify Ċ import Ġio . mock k . verify Sequence Ċ Ċ private Ġclass ĠName Event ( override Ġval Ġdata : ĠString ) Ġ: ĠData Event < String > Ċ private Ġclass ĠId Event ( override Ġval Ġdata : ĠInt ) Ġ: ĠData Event < Int > Ċ Ċ class ĠTypes afe Transition Test Ġ: ĠString Spec ({ ĊĠĠĠ Ġ" initial ĠData State Ġnegative " Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Throw < Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd InitialState ( Default Data State < String >(" state 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Final Data State Ġtransition " Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġfinal : ĠData State < Int > ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" initial ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Id Event , ĠInt > Ġ{ Ġtarget State Ġ= Ġ{ Ġfinal Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Ġ= Ġfinal Data State (" final ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( 4 2 )) ĊĠĠĠĠĠĠĠ Ġmachine . active States (). should Contain Exactly ( final ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Final Data State Ġcannot Ġhave Ġtransition " Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" initial ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Data State < Int >(" final ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Throw < Unsupported OperationException > Ġ{ Ġtransition < Switch Event >() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" single Ġdata Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Name Ġ= Ġ" test Name " ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 : ĠData State < String > ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate 3 Ġ= Ġstate (" state 3 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 Ġ= Ġdata State (" state 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Entry Ġ{ Ġdata ĠshouldBe Ġtest Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit Ġ{ Ġshould Throw < IllegalStateException > Ġ{ Ġdata Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition < Switch Event > Ġ{ Ġtarget State Ġ= Ġstate 3 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition < Name Event , ĠString > Ġ{ Ġtarget State Ġ= Ġstate 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshould Throw < IllegalStateException > Ġ{ Ġstate 2 . data Ġ} ĊĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Name Event ( test Name )) ĊĠĠĠĠĠĠĠ Ġstate 2 . data ĠshouldBe Ġtest Name ĊĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Switch Event ) ĊĠĠĠĠĠĠĠ Ġshould Throw < IllegalStateException > Ġ{ Ġstate 2 . data Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" multiple Ġdata Ġstates " Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 : ĠData State < String > ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 3 : ĠData State < Int > ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Name Event , ĠString > Ġ{ Ġtarget State Ġ= Ġ{ Ġstate 2 Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 Ġ= Ġdata State (" state 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Id Event , ĠInt > Ġ{ Ġtarget State Ġ= Ġ{ Ġstate 3 Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate 3 Ġ= Ġdata State (" state 3 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" test Name " ĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Name Event ( name )) ĊĊĠĠĠĠĠĠĠ Ġstate 2 . data ĠshouldBe Ġname ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( id )) ĊĊĠĠĠĠĠĠĠ Ġshould Throw < IllegalStateException > Ġ{ Ġstate 2 . data Ġ} ĊĠĠĠĠĠĠĠ Ġstate 3 . data ĠshouldBe Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" multiple Ġnested Ġdata Ġstates " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallbacks Ġ= Ġmock k Callbacks () ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 1 : ĠState ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 : ĠData State < String > ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 1 : ĠState ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 2 : ĠData State < Int > ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate 1 Ġ= ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . listen ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Name Event , ĠString > Ġ{ Ġtarget State Ġ= Ġ{ Ġstate 2 Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 Ġ= Ġdata State (" state 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . listen ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 1 Ġ= ĠinitialState (" state 2 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . listen ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Id Event , ĠInt > Ġ{ Ġtarget State Ġ= Ġ{ Ġstate 2 2 Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 2 Ġ= Ġdata State (" state 2 2 ") Ġ{ Ġcallbacks . listen ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Sequence And Clear ( callbacks ) Ġ{ Ġcallbacks . on Entry State ( state 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" test Name " ĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Name Event ( name )) ĊĠĠĠĠĠĠĠ Ġverify Sequence And Clear ( callbacks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . on Exit State ( state 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . on Entry State ( state 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . on Entry State ( state 2 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate 2 . data ĠshouldBe Ġname ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( id )) ĊĠĠĠĠĠĠĠ Ġverify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . on Exit State ( state 2 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . on Entry State ( state 2 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate 2 . data ĠshouldBe Ġname ĊĠĠĠĠĠĠĠ Ġstate 2 2 . data ĠshouldBe Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" implicit Ġdata Ġstate Ġactivation Ġby Ġcross Ġlevel Ġtransition Ġnegative " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 1 : ĠState ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition On < Switch Event > Ġ{ Ġtarget State Ġ= Ġ{ Ġstate 2 1 Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata State < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Entry Ġ{ Ġprintln ( data ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 1 Ġ= ĠinitialState () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshould Throw < IllegalStateException > Ġ{ Ġmachine . process Event ( Switch Event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" transition Ġwith Ġevent Ġsuper Ġtype " Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstate 2 : ĠData State < Number > ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate 2 Ġ= Ġdata State (" state 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition < Id Event , ĠNumber > Ġ{ Ġtarget State Ġ= Ġstate 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( id )) ĊĊĠĠĠĠĠĠĠ Ġstate 2 . data ĠshouldBe Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" target less Ġdata Ġtransition Ġnegative " Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Throw < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition < Id Event , ĠInt > Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" target less Ġtransition Ġin Ġdata Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallbacks Ġ= Ġmock k Callbacks () ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= ĠState Machine . Logger Ġ{ Ġprintln ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata State Ġ= Ġdata State < Int >(" state 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition < Switch Event > Ġ{ Ġcallbacks . listen ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition < Id Event , ĠInt >( target State Ġ= Ġdata State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( 1 3 )) ĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Switch Event ) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallbacks . on Triggered Transition ( Switch Event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" self Ġtargeted Ġtransition Ġin Ġdata Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Throw < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata State < Int >(" state 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition < Id Event , ĠInt >( target State Ġ= Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" self Ġtargeted Ġtransition On () Ġdoes Ġnot Ġupdate Ġdata , Ġcannot Ġthrow Ġon Ġconstruction " Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġdata State : ĠData State < Int > ĊĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= Ġcreate StateMachine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= ĠState Machine . Logger Ġ{ Ġprintln ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState (" state 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Id Event , ĠInt > Ġ{ Ġtarget State Ġ= Ġ{ Ġdata State Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata State Ġ= Ġdata State (" state 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Transition On < Id Event , ĠInt > Ġ{ Ġtarget State Ġ= Ġ{ Ġdata State Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( 1 )) ĊĠĠĠĠĠĠĠ Ġdata State . data ĠshouldBe Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġmachine . process Event ( Id Event ( 2 )) ĊĠĠĠĠĠĠĠ Ġdata State . data ĠshouldBe Ġ 1 ĊĠĠĠ Ġ} Ċ })