/* Ċ Ġ* ĠÂ© Ġ 2 0 1 8 ĠMatch ĠGroup , ĠLLC . Ċ Ġ*/ Ċ Ċ package Ġcom . t inder . state machine Ċ Ċ import Ġcom . n ha ar man . mockito _ kotlin . mock Ċ import Ġcom . n ha ar man . mockito _ kotlin . then Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . assertj . core . api . Assertions . assertThat IllegalArgumentException Ċ import Ġorg . assertj . core . api . Assertions . assertThat IllegalStateException Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . experimental . runners . En closed Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( En closed :: class ) Ċ internal Ġclass ĠState Machine Test Ġ{ ĊĊĠĠĠ Ġclass ĠObject StateMachine Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State ChangeListener 1 Ġ= Ġmock <( State ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State ChangeListener 2 Ġ= Ġmock <( State ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State A Exit Listener 1 Ġ= Ġmock < State .( Event ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State A Exit Listener 2 Ġ= Ġmock < State .( Event ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State C Enter Listener 1 Ġ= Ġmock < State .( Event ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State C Enter Listener 2 Ġ= Ġmock < State .( Event ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State A Action 1 On Event 3 Ġ= Ġmock < State .( Event ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State A Action 2 On Event 3 Ġ= Ġmock < State .( Event ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstate Machine Ġ= ĠState Machine . create < State , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate < State . A > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit ( on State A Exit Listener 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit ( on State A Exit Listener 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . E 1 >() Ġtransition To Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . E 2 >() Ġtransition To Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . C ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . E 3 >() Ġrun ( on State A Action 1 On Event 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . E 3 >() Ġrun ( on State A Action 2 On Event 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate < State . B > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . E 3 >() Ġtransition To Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . C ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate < State . C > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter ( on State C Enter Listener 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter ( on State C Enter Listener 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault State ( State . A ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon StateChange ( on State ChangeListener 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon StateChange ( on State ChangeListener 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġstate _ should Return Default State () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstate Machine . state ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state ). isEqualTo ( State . A ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Return True () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Successful From State A To State B Ġ= Ġstate Machine . transition ( Event . E 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Successful From State A To State B ). isTrue () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Successful From State B To State C Ġ= Ġstate Machine . transition ( Event . E 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Successful From State B To State C ). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Create AndSet New State () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Machine . state ). isEqualTo ( State . B ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Machine . state ). isEqualTo ( State . C ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Trigger On State ChangeListener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State ChangeListener 1 ). should (). invoke ( State . B ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State ChangeListener 2 ). should (). invoke ( State . C ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Trigger On Enter Listeners () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State C Enter Listener 1 ). should (). invoke ( State . C , ĠEvent . E 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State C Enter Listener 2 ). should (). invoke ( State . C , ĠEvent . E 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Trigger On Exit Listeners () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State A Exit Listener 1 ). should (). invoke ( State . A , ĠEvent . E 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State A Exit Listener 2 ). should (). invoke ( State . A , ĠEvent . E 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event That Is Action _ should Run Actions () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Transition ed Ġ= Ġstate Machine . transition ( Event . E 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( has Transition ed ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State A Action 1 On Event 3 ). should (). invoke ( State . A , ĠEvent . E 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State A Action 2 On Event 3 ). should (). invoke ( State . A , ĠEvent . E 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Invalid Event _ should Return False () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting State Ġ= Ġstate Machine . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Successful Ġ= Ġstate Machine . transition ( Event . E 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Successful ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Machine . state ). isEqualTo ( existing State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠObject StateMachine Without Default State Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġcreate _ given No Default State _ should Throw IllegalArgumentException () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat IllegalArgumentException (). is Thrown By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState Machine . create < State , ĠEvent > Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠObject StateMachine With Undefined State Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstate Machine Ġ= ĠState Machine . create < State , ĠEvent > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault State ( State . A ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Undefined State _ should Throw IllegalStateException () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat IllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Thrown By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( Event . E 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠConstant StateMachine Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State ChangeListener 1 Ġ= Ġmock <( String ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State ChangeListener 2 Ġ= Ġmock <( String ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State C Enter Listener 1 Ġ= Ġmock < String .( Int ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State C Enter Listener 2 Ġ= Ġmock < String .( Int ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State A Exit Listener 1 Ġ= Ġmock < String .( Int ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon State A Exit Listener 2 Ġ= Ġmock < String .( Int ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstate Machine Ġ= ĠState Machine . create < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ( STATE _ A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit ( on State A Exit Listener 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit ( on State A Exit Listener 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( EVENT _ 1 ) Ġtransition To Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( EVENT _ 2 ) Ġtransition To Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ C ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ( STATE _ B ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( EVENT _ 3 ) Ġtransition To Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ C ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ( STATE _ C ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter ( on State C Enter Listener 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter ( on State C Enter Listener 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault State ( STATE _ A ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon StateChange ( on State ChangeListener 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon StateChange ( on State ChangeListener 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġstate _ should Return Default State () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstate Machine . state ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state ). isEqualTo ( STATE _ A ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Return True () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Successful From State A To State B Ġ= Ġstate Machine . transition ( EVENT _ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Successful From State A To State B ). isTrue () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Successful From State B To State C Ġ= Ġstate Machine . transition ( EVENT _ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Successful From State B To State C ). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Create AndSet New State () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Machine . state ). isEqualTo ( STATE _ B ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Machine . state ). isEqualTo ( STATE _ C ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Trigger On State ChangeListener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State ChangeListener 1 ). should (). invoke ( STATE _ B ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State ChangeListener 2 ). should (). invoke ( STATE _ C ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Trigger On Enter Listeners () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State C Enter Listener 1 ). should (). invoke ( STATE _ C , ĠEVENT _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State C Enter Listener 2 ). should (). invoke ( STATE _ C , ĠEVENT _ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Valid Event _ should Trigger On Exit Listeners () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State A Exit Listener 1 ). should (). invoke ( STATE _ A , ĠEVENT _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthen ( on State A Exit Listener 2 ). should (). invoke ( STATE _ A , ĠEVENT _ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Invalid Event _ should Return False () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting State Ġ= Ġstate Machine . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Successful Ġ= Ġstate Machine . transition ( EVENT _ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( is Successful ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state Machine . state ). isEqualTo ( existing State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠConstant StateMachine Without Default State Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġcreate _ given No Default State _ should Throw IllegalArgumentException () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat IllegalArgumentException (). is Thrown By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState Machine . create < String , ĠInt > Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠConstant StateMachine With Undefined State Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstate Machine Ġ= ĠState Machine . create < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault State ( STATE _ A ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtransition _ given Undefined State _ should Throw IllegalStateException () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat IllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Thrown By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . transition ( EVENT _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġsealed Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠA Ġ: ĠState () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠB Ġ: ĠState () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠC Ġ: ĠState () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġsealed Ġclass ĠEvent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠE 1 Ġ: ĠEvent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠE 2 Ġ: ĠEvent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠE 3 Ġ: ĠEvent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ A Ġ= Ġ" a " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ B Ġ= Ġ" b " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ C Ġ= Ġ" c " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEVENT _ 1 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEVENT _ 2 Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEVENT _ 3 Ġ= Ġ 3 ĊĠĠĠ Ġ} Ċ } Ċ