package Ġorg . softp ark . state ful 4 k Ċ Ċ import Ġorg . junit . Test Ċ import Ġorg . softp ark . state ful 4 k . data . Capt uring Emitter Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠDoor StateMachine Test Ġ{ ĊĠĠĠ Ġval Ġdoor Ġ= ĠDoor StateMachine () ĊĊĠĠĠ Ġfun Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial : ĠDoor State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠDoor Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck State : Ġ( Door State ) Ġ-> ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck History : Ġ( Capt uring Emitter ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= ĠCapt uring Emitter () ĊĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= ĠDoor StateMachine (). start ( history , Ġinitial ) ĊĠĠĠĠĠĠĠ Ġmachine . fire ( event ) ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġcheck State ( machine . state ) Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġcheck History ( history ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Cannot Ġopen Ġopened Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( false , Ġtrue ). forEach Ġ{ Ġlocked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClosed State ( locked ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠClosed State Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Cannot Ġclose Ġclosed Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( false , Ġtrue ). forEach Ġ{ Ġlocked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClosed State ( locked ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠClosed State Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Cannot Ġopen Ġlocked Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClosed State ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠClosed State Ġ&& Ġit . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" Click ! ĠClick !") Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Cannot Ġclose Ġlocked Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen State ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠOpen State Ġ&& Ġit . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" S que ak ! ĠB ang !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Open Ġun locked Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClosed State ( false ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠOpen State Ġ&& Ġ! it . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" Click ! ĠS que ak !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Close Ġun locked Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen State ( false ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠClosed State Ġ&& Ġ! it . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" S que ak ! ĠClick !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Lock Ġclosed Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClosed State ( false ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLock Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠClosed State Ġ&& Ġit . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" Cl ack !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Lock Ġopened Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen State ( false ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLock Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠOpen State Ġ&& Ġit . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" Cl ack !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Unlock Ġclosed Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClosed State ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn lock Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠClosed State Ġ&& Ġ! it . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" Click !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Unlock Ġopened Ġdo ors `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen State ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn lock Event (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġis ĠOpen State Ġ&& Ġ! it . locked Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . matches (" Click !") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }