package engine import ( "testing" "git.fsdpf.net/go/condition" "git.fsdpf.net/go/reflux" "git.fsdpf.net/go/req" ) type TestTable struct { Null any Age int64 `db:"age"` Name string `db:"name"` Map map[string]any `db:"map"` Bool bool `db:"bool"` Struct *struct{ Name string } `db:"json"` Array []any `db:"array"` } func TestEngine(t *testing.T) { engine := Engine{ code: "TestTable", g: req.NewGlobalParams(`{"age": 30}`, nil), } cond1 := condition.New(condition.Describe("条件1")) cond1.SetExpr(condition.NewExpr("TestTable", "age", condition.Token("age", condition.PARAM))) engine.Case(cond1, func(data reflux.R, g req.UserAccessor) error { t.Log("cond1", data.Any()) return nil }) engine.Default(func(data reflux.R, g req.UserAccessor) error { t.Log("default", data.Any()) return nil }) testData := map[string]any{ "null": nil, "age": 30, "name": "张三", "map": map[string]any{ "field": 1, }, "bool": false, "struct": struct{ Name string }{"李四"}, "struct-ptr": &struct{ Name string }{"张三"}, "array": []any{1, "a", false}, } engine.Execute(testData) testData2 := map[string]any{ "null": nil, "age": 30, "name": "张三", "map": map[string]any{ "field": 1, }, "bool": false, "struct": &struct{ Name string }{"李四"}, "array": []any{1, "a", false}, } t.Log("execute error", engine.Execute(testData2)) } func TestRelationEngine(t *testing.T) { engine := Engine{ code: "TestTable", g: req.NewGlobalParams(`{"age": 30}`, nil), opts: engineOptions{ debug: false, relations: []string{"TestTableA"}, }, } cond1 := condition.New(condition.Describe("条件1")). SetExpr(condition.NewExpr("TestTable", "age", condition.Token("age", condition.PARAM))) engine.Case(cond1, func(data reflux.R, g req.UserAccessor) error { t.Log("cond1", data.Any()) return nil }) cond2 := condition.New(condition.Type(condition.OR), condition.Describe("条件2")). SetExpr(condition.NewExpr("TestTableA", "age", condition.Token("age", condition.PARAM))). SetExpr(condition.NewExpr("TestTable", "age", condition.Token("age", condition.PARAM))) engine.Case(cond2, func(data reflux.R, g req.UserAccessor) error { t.Log("cond2", data.Any()) return nil }) engine.Default(func(data reflux.R, g req.UserAccessor) error { t.Log("default", data.Any()) return nil }) testData := map[string]any{ "null": nil, "age": 31, "name": "张三", "map": map[string]any{ "field": 1, }, "bool": false, "struct": &struct{ Name string }{"李四"}, "array": []any{1, "a", false}, "TestTableA": map[string]any{ "age": 30, "TestTableA": map[string]any{ "age": 22, }, }, } engine.Execute(testData) // t.Log("execute error", engine.Execute(TestTable{nil, 30, "张三", map[string]any{"field": 1}, false, &struct{ Name string }{"李四"}, []any{1, "a", false}})) }