PaesslerAG / gval

Expression evaluation in golang
BSD 3-Clause "New" or "Revised" License
731 stars 82 forks source link

Issues with uint64 when using in expression #43

Closed darh closed 4 years ago

darh commented 4 years ago

Hi,

Looks like gval is corrupting and returning float64 instead of uint64 when evaluating simple expression. I'm probably missing something obvious here :)

func TestGval(t *testing.T) {
    tUint64 := uint64(197830758113476796)
    fmt.Printf("%d %T \n", tUint64, tUint64)

    {
        eval, _ := gval.Full().NewEvaluable(`a`)
        rval, _ := eval(context.Background(), map[string]interface{}{"a": tUint64})
        fmt.Printf("%d %T (as expected, got uint64) \n", rval, rval)
    }
    {
        eval, _ := gval.Full().NewEvaluable(`a+0`)
        rval, _ := eval(context.Background(), map[string]interface{}{"a": tUint64})
        fmt.Printf("%f %T (got float, not expected...) \n", rval, rval)
    }
    {
        eval, _ := gval.Full().NewEvaluable(`A+0`)
        rval, _ := eval(context.Background(), struct{ A uint64 }{A: tUint64})
        fmt.Printf("%f %T (got float, not expected...) \n", rval, rval)
    }
}

Results:

=== RUN   TestGval
197830758113476796 uint64
197830758113476796 uint64 (as expected, got uint64)
197830758113476800.000000 float64 (got float, not expected...)
197830758113476800.000000 float64 (got float, not expected...)
generikvault commented 4 years ago

Yes, this is the behavior as described in the documentation. If you need uint64 you can replace the arithmetic operators with your own operators.