96 lines
1.9 KiB
Go
96 lines
1.9 KiB
Go
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)
|
|
}
|