package fsm import ( "log" "testing" "time" ) type myFsm struct { fsm *FSM } func state1(fsm *FSM, event EventName, arg interface{}) EventName { switch event { case EventEntry: log.Println("state1", event) case EventExit: log.Println("state1", event) default: log.Println("state1", event) return EventNoProc } return EventOK } func state2(fsm *FSM, event EventName, arg interface{}) EventName { switch event { case EventEntry: log.Println("state2", event) case EventExit: log.Println("state2", event) default: log.Println("state2", event) return EventNoProc } return EventOK } func state3(fsm *FSM, event EventName, arg interface{}) EventName { switch event { case EventEntry: log.Println("state3", event) case EventExit: log.Println("state3", event) case "test event": log.Println("state3", event) default: log.Println("state3", event) return EventNoProc } return EventOK } func newMyFsm() *myFsm { state1 := NewFSMState("State1", "", "State2", state1) state2 := NewFSMState("State2", "State1", "", state2) state3 := NewFSMState("State3", "State1", "", state3) fsm, err := NewFSM("MyFSM", &[]string{string(EventEntry), string(EventExit)}, state2, state1, state3) if err != nil { log.Fatal(err) } return &myFsm{fsm: fsm} } func Test_fsm(t *testing.T) { myfsm := newMyFsm() if err := myfsm.fsm.ChangeState("State3", nil); err != nil { log.Fatal(err) } myfsm.fsm.ExecuteEvent("test event", nil) // Start a timer (example) // timerHandle := &ReactorTimerHandle{} // if err := fsm.StartReactorTimer(timerHandle, 0, 1000, EventEntry, nil); err != nil { // log.Fatal(err) // } // Keep the program running to observeinterior time.Sleep(2 * time.Second) }