fsm/fsm_test.go
2025-06-10 19:53:35 +08:00

96 lines
1.8 KiB
Go

package fsm
import (
"context"
"fmt"
"log"
"testing"
"time"
"git.zhangshuocauc.cn/redhat/timewheel"
)
func state1(ctx context.Context, e *Event) error {
switch e.Event {
case EventEntry:
log.Println("state1", *e)
case EventExit:
log.Println("state1", *e)
default:
log.Println("state1", *e)
return EventNoProc
}
return EventOK
}
func state2(ctx context.Context, e *Event) error {
switch e.Event {
case EventEntry:
log.Println("state2", *e)
case EventExit:
log.Println("state2", *e)
default:
log.Println("state2", *e)
return EventNoProc
}
return EventOK
}
func state3(ctx context.Context, e *Event) error {
switch e.Event {
case EventEntry:
log.Println("state3", *e)
case EventExit:
log.Println("state3", *e)
case "assign":
log.Println("state3", *e)
default:
log.Println("state3", *e)
return EventNoProc
}
return EventOK
}
var events = Events{
"assign",
"accept",
}
func Test_fsm(t *testing.T) {
fsm, err := NewFsm("MyFsm", "state1", events, []*StateRule{
{Name: "state1", Parent: "", InitState: "state2", Processor: state1, Dst: []string{}},
{Name: "state2", Parent: "state1", InitState: "", Processor: state2, Dst: []string{}},
{Name: "state3", Parent: "state1", InitState: "", Processor: state3, Dst: []string{}},
{},
})
if err != nil {
fmt.Println(err)
}
defer fsm.StopTimer()
ctx := context.Background()
fmt.Println(fsm)
fsm.ExecuteEvent(ctx, EventName("assign"), nil)
fmt.Println(fsm.StateChange(ctx, "state3", nil))
fsm.ExecuteEvent(ctx, EventName("accept"), nil)
fsm.ExecuteEvent(ctx, EventName("accept1"), nil)
fsm.StartEventTimer(ctx, timewheel.TimeTypeLoop, time.Millisecond*100, nil)
<-time.After(time.Millisecond*100)
fmt.Println(fsm.StateChange(ctx, "state2", nil))
<-time.After(3 * time.Second)
}