2018-02-13 23:49:40 +08:00
|
|
|
package test
|
2016-12-01 23:25:29 +08:00
|
|
|
|
|
|
|
import (
|
2018-02-24 22:04:41 +08:00
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
2016-12-08 10:02:18 +08:00
|
|
|
"fmt"
|
2018-02-13 23:49:40 +08:00
|
|
|
"strconv"
|
2018-02-24 22:04:41 +08:00
|
|
|
"testing"
|
2022-09-15 21:13:32 +08:00
|
|
|
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
|
|
"github.com/stretchr/testify/require"
|
2016-12-01 23:25:29 +08:00
|
|
|
)
|
|
|
|
|
2017-01-15 18:08:49 +08:00
|
|
|
func Test_read_float(t *testing.T) {
|
2017-07-10 02:06:37 -04:00
|
|
|
inputs := []string{
|
|
|
|
`1.1`, `1000`, `9223372036854775807`, `12.3`, `-12.3`, `720368.54775807`, `720368.547758075`,
|
|
|
|
`1e1`, `1e+1`, `1e-1`, `1E1`, `1E+1`, `1E-1`, `-1e1`, `-1e+1`, `-1e-1`,
|
|
|
|
}
|
2017-01-15 17:30:02 +08:00
|
|
|
for _, input := range inputs {
|
|
|
|
// non-streaming
|
|
|
|
t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
2018-02-13 23:49:40 +08:00
|
|
|
iter := jsoniter.ParseString(jsoniter.ConfigDefault, input+",")
|
2017-01-15 17:30:02 +08:00
|
|
|
expected, err := strconv.ParseFloat(input, 32)
|
|
|
|
should.Nil(err)
|
|
|
|
should.Equal(float32(expected), iter.ReadFloat32())
|
|
|
|
})
|
2017-01-15 18:08:49 +08:00
|
|
|
t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
2018-02-13 23:49:40 +08:00
|
|
|
iter := jsoniter.ParseString(jsoniter.ConfigDefault, input+",")
|
2017-01-15 18:08:49 +08:00
|
|
|
expected, err := strconv.ParseFloat(input, 64)
|
|
|
|
should.Nil(err)
|
|
|
|
should.Equal(expected, iter.ReadFloat64())
|
|
|
|
})
|
2017-01-15 17:30:02 +08:00
|
|
|
// streaming
|
|
|
|
t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
2018-02-13 23:49:40 +08:00
|
|
|
iter := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(input+","), 2)
|
2017-01-15 17:30:02 +08:00
|
|
|
expected, err := strconv.ParseFloat(input, 32)
|
|
|
|
should.Nil(err)
|
|
|
|
should.Equal(float32(expected), iter.ReadFloat32())
|
|
|
|
})
|
2017-01-15 18:08:49 +08:00
|
|
|
t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
2018-02-13 23:49:40 +08:00
|
|
|
iter := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(input+","), 2)
|
2017-07-18 11:28:19 +08:00
|
|
|
val := float64(0)
|
|
|
|
err := json.Unmarshal([]byte(input), &val)
|
2017-01-15 18:08:49 +08:00
|
|
|
should.Nil(err)
|
2017-07-18 11:28:19 +08:00
|
|
|
should.Equal(val, iter.ReadFloat64())
|
2017-01-15 18:08:49 +08:00
|
|
|
})
|
2016-12-06 10:21:47 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-07 23:06:48 +08:00
|
|
|
func Test_write_float32(t *testing.T) {
|
|
|
|
vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
|
2017-06-06 23:27:00 +08:00
|
|
|
-0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
|
2017-01-07 23:06:48 +08:00
|
|
|
for _, val := range vals {
|
|
|
|
t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
|
|
|
buf := &bytes.Buffer{}
|
2018-02-13 23:49:40 +08:00
|
|
|
stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)
|
2017-05-24 09:08:15 +08:00
|
|
|
stream.WriteFloat32Lossy(val)
|
2017-01-07 23:06:48 +08:00
|
|
|
stream.Flush()
|
|
|
|
should.Nil(stream.Error)
|
2017-07-02 15:11:36 +08:00
|
|
|
output, err := json.Marshal(val)
|
|
|
|
should.Nil(err)
|
|
|
|
should.Equal(string(output), buf.String())
|
2017-01-07 23:06:48 +08:00
|
|
|
})
|
2017-01-09 19:19:48 +08:00
|
|
|
t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
|
|
|
buf := &bytes.Buffer{}
|
2018-02-13 23:49:40 +08:00
|
|
|
stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)
|
2017-01-09 19:19:48 +08:00
|
|
|
stream.WriteVal(val)
|
|
|
|
stream.Flush()
|
|
|
|
should.Nil(stream.Error)
|
2017-07-02 15:11:36 +08:00
|
|
|
output, err := json.Marshal(val)
|
|
|
|
should.Nil(err)
|
|
|
|
should.Equal(string(output), buf.String())
|
2017-01-09 19:19:48 +08:00
|
|
|
})
|
2017-01-07 23:06:48 +08:00
|
|
|
}
|
|
|
|
should := require.New(t)
|
|
|
|
buf := &bytes.Buffer{}
|
2018-02-13 23:49:40 +08:00
|
|
|
stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)
|
2017-01-07 23:06:48 +08:00
|
|
|
stream.WriteRaw("abcdefg")
|
2017-05-24 09:08:15 +08:00
|
|
|
stream.WriteFloat32Lossy(1.123456)
|
2017-01-07 23:06:48 +08:00
|
|
|
stream.Flush()
|
|
|
|
should.Nil(stream.Error)
|
|
|
|
should.Equal("abcdefg1.123456", buf.String())
|
2017-07-06 11:44:39 +08:00
|
|
|
|
2018-02-13 23:49:40 +08:00
|
|
|
stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)
|
2017-07-06 11:44:39 +08:00
|
|
|
stream.WriteFloat32(float32(0.0000001))
|
2022-09-15 21:13:32 +08:00
|
|
|
should.Equal("1e-7", string(stream.Buffer()))
|
2017-01-07 23:06:48 +08:00
|
|
|
}
|
|
|
|
|
2017-01-07 23:32:54 +08:00
|
|
|
func Test_write_float64(t *testing.T) {
|
|
|
|
vals := []float64{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
|
2017-06-06 23:27:00 +08:00
|
|
|
-0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
|
2017-01-07 23:32:54 +08:00
|
|
|
for _, val := range vals {
|
|
|
|
t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
|
|
|
buf := &bytes.Buffer{}
|
2018-02-13 23:49:40 +08:00
|
|
|
stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)
|
2017-05-24 09:08:15 +08:00
|
|
|
stream.WriteFloat64Lossy(val)
|
2017-01-07 23:32:54 +08:00
|
|
|
stream.Flush()
|
|
|
|
should.Nil(stream.Error)
|
|
|
|
should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
|
|
|
|
})
|
2017-01-09 19:19:48 +08:00
|
|
|
t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
|
|
|
|
should := require.New(t)
|
|
|
|
buf := &bytes.Buffer{}
|
2018-02-13 23:49:40 +08:00
|
|
|
stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)
|
2017-01-09 19:19:48 +08:00
|
|
|
stream.WriteVal(val)
|
|
|
|
stream.Flush()
|
|
|
|
should.Nil(stream.Error)
|
|
|
|
should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
|
|
|
|
})
|
2017-01-07 23:32:54 +08:00
|
|
|
}
|
|
|
|
should := require.New(t)
|
|
|
|
buf := &bytes.Buffer{}
|
2018-02-13 23:49:40 +08:00
|
|
|
stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)
|
2017-01-07 23:32:54 +08:00
|
|
|
stream.WriteRaw("abcdefg")
|
2017-05-24 09:08:15 +08:00
|
|
|
stream.WriteFloat64Lossy(1.123456)
|
2017-01-07 23:32:54 +08:00
|
|
|
stream.Flush()
|
|
|
|
should.Nil(stream.Error)
|
|
|
|
should.Equal("abcdefg1.123456", buf.String())
|
2017-07-06 11:44:39 +08:00
|
|
|
|
2018-02-13 23:49:40 +08:00
|
|
|
stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)
|
2017-07-06 11:44:39 +08:00
|
|
|
stream.WriteFloat64(float64(0.0000001))
|
2022-09-15 21:13:32 +08:00
|
|
|
should.Equal("1e-7", string(stream.Buffer()))
|
2018-02-24 22:04:41 +08:00
|
|
|
}
|