// helpers_test.go package expr import ( "fmt" "testing" ) func subtract(ctx ExprContext, name string, args []any) (result any, err error) { if len(args) != 2 { err = fmt.Errorf("%s(): requires exactly two arguments", name) return } x, xok := args[0].(int64) y, yok := args[1].(int64) if xok && yok { result = x - y } else { err = fmt.Errorf("expected integer (int64) arguments, got %T and %T values", x, y) } return } func TestEvalStringA(t *testing.T) { source := `a + b * subtract(4,2)` args := []EvalArg{ {"a", uint8(1)}, {"b", int8(2)}, {"subtract", FuncTemplate(subtract)}, // force coverage {"a16", uint16(1)}, {"b16", int16(2)}, {"a32", uint32(1)}, {"b32", int32(2)}, {"a64", uint64(1)}, {"b64", int64(2)}, {"f32", float32(1.0)}, {"f64", float64(1.0)}, } wantResult := int64(5) gotResult, gotErr := EvalStringA(source, args...) if value, ok := gotResult.(int64); ok && value != wantResult { t.Errorf("Source %q got %v, want %v", source, gotResult, wantResult) t.Errorf("Error: %v", gotErr) } fmt.Println("Hello World!") } func TestEvalString(t *testing.T) { ctx := NewSimpleVarStore() ctx.SetVar("a", uint8(1)) ctx.SetVar("b", int8(2)) ctx.SetVar("f", 2.0) // force coverage ctx.SetVar("a16", uint16(1)) ctx.SetVar("b16", int16(2)) ctx.SetVar("a32", uint32(1)) ctx.SetVar("b32", int32(2)) ctx.SetVar("a64", uint64(1)) ctx.SetVar("b64", int64(2)) ctx.SetVar("f32", float32(1.0)) ctx.SetVar("f64", float64(1.0)) // force coverage ctx.GetFuncInfo("dummy") ctx.Call("dummy", []any{}) source := `a + b * f` wantResult := float64(5) gotResult, gotErr := EvalString(ctx, source) if value, ok := gotResult.(float64); ok && value != wantResult { t.Errorf("Source %q got %v, want %v", source, gotResult, wantResult) t.Errorf("Error: %v", gotErr) } fmt.Println("Hello World!") }