dashboard/pkg/myfsm/fsm_test.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)
}