fix: issue 3840 (#3845)

master
Kevin Wan 11 months ago committed by GitHub
parent 9e33b557b1
commit 408827d876
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -625,7 +625,12 @@ func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(fieldType reflect.Type
return err return err
} }
if value.OverflowFloat(fValue) { // if value is a pointer, we need to check overflow with the pointer's value.
overflowValidator := value
if overflowValidator.Type().Kind() == reflect.Ptr {
overflowValidator = overflowValidator.Elem()
}
if overflowValidator.OverflowFloat(fValue) {
return fmt.Errorf("parsing %q as float32: value out of range", v.String()) return fmt.Errorf("parsing %q as float32: value out of range", v.String())
} }

@ -1339,8 +1339,20 @@ func TestUnmarshalNullableSlice(t *testing.T) {
"slice": `[null,2]`, "slice": `[null,2]`,
} }
ast := assert.New(t) assert.New(t).Equal(UnmarshalKey(m, &v), errNilSliceElement)
ast.Equal(UnmarshalKey(m, &v), errNilSliceElement) }
func TestUnmarshalWithFloatPtr(t *testing.T) {
var v struct {
WeightFloat32 *float32 `key:"weightFloat32,optional"`
}
m := map[string]any{
"weightFloat32": json.Number("3.2"),
}
if assert.NoError(t, UnmarshalKey(m, &v)) {
assert.Equal(t, float32(3.2), *v.WeightFloat32)
}
} }
func TestUnmarshalIntSlice(t *testing.T) { func TestUnmarshalIntSlice(t *testing.T) {

@ -395,6 +395,21 @@ func TestParsePathWithDot(t *testing.T) {
assert.Equal(t, 18, v.Age) assert.Equal(t, 18, v.Age)
} }
func TestParseWithFloatPtr(t *testing.T) {
t.Run("has float32 pointer", func(t *testing.T) {
var v struct {
WeightFloat32 *float32 `json:"weightFloat32,optional"`
}
body := `{"weightFloat32": 3.2}`
r := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(body))
r.Header.Set(ContentType, header.JsonContentType)
if assert.NoError(t, Parse(r, &v)) {
assert.Equal(t, float32(3.2), *v.WeightFloat32)
}
})
}
func BenchmarkParseRaw(b *testing.B) { func BenchmarkParseRaw(b *testing.B) {
r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello&age=18&percent=3.4", http.NoBody) r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello&age=18&percent=3.4", http.NoBody)
if err != nil { if err != nil {

Loading…
Cancel
Save