package fsm import ( "log" "testing" "time" "git.zhangshuocauc.cn/redhat/timewheel" ) 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) case EventTimeOut: 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) case EventTimeOut: 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)}, state1, state2, 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) myfsm.fsm.StartTimer(timewheel.TimerTypeOnce, time.Millisecond*100, nil) <-time.After(200 * time.Millisecond) myfsm.fsm.ChangeState("State2", nil) myfsm.fsm.StartTimer(timewheel.TimeTypeLoop, time.Second, nil) // Keep the program running to observeinterior <-time.After(3 * time.Second) }