123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- package jsoniter
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "github.com/json-iterator/go/require"
- "strconv"
- "testing"
- )
- func Test_read_big_float(t *testing.T) {
- should := require.New(t)
- iter := ParseString(`12.3`)
- val := iter.ReadBigFloat()
- val64, _ := val.Float64()
- should.Equal(12.3, val64)
- }
- func Test_read_big_int(t *testing.T) {
- should := require.New(t)
- iter := ParseString(`92233720368547758079223372036854775807`)
- val := iter.ReadBigInt()
- should.NotNil(val)
- should.Equal(`92233720368547758079223372036854775807`, val.String())
- }
- func Test_read_float(t *testing.T) {
- inputs := []string{`1.1`, `1000`, `9223372036854775807`, `12.3`, `-12.3`, `720368.54775807`, `720368.547758075`}
- for _, input := range inputs {
- // non-streaming
- t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
- should := require.New(t)
- iter := ParseString(input + ",")
- expected, err := strconv.ParseFloat(input, 32)
- should.Nil(err)
- should.Equal(float32(expected), iter.ReadFloat32())
- })
- t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
- should := require.New(t)
- iter := ParseString(input + ",")
- expected, err := strconv.ParseFloat(input, 64)
- should.Nil(err)
- should.Equal(expected, iter.ReadFloat64())
- })
- // streaming
- t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
- should := require.New(t)
- iter := Parse(bytes.NewBufferString(input+","), 2)
- expected, err := strconv.ParseFloat(input, 32)
- should.Nil(err)
- should.Equal(float32(expected), iter.ReadFloat32())
- })
- t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
- should := require.New(t)
- iter := Parse(bytes.NewBufferString(input+","), 2)
- expected, err := strconv.ParseFloat(input, 64)
- should.Nil(err)
- should.Equal(expected, iter.ReadFloat64())
- })
- }
- }
- func Test_read_float_as_interface(t *testing.T) {
- should := require.New(t)
- iter := ParseString(`12.3`)
- should.Equal(float64(12.3), iter.Read())
- }
- func Test_read_float_as_any(t *testing.T) {
- should := require.New(t)
- any, err := UnmarshalAnyFromString("12.3")
- should.Nil(err)
- should.Equal(float64(12.3), any.ToFloat64())
- should.Equal("12.3", any.ToString())
- should.True(any.ToBool())
- }
- func Test_wrap_float(t *testing.T) {
- should := require.New(t)
- str, err := MarshalToString(WrapFloat64(12.3))
- should.Nil(err)
- should.Equal("12.3", str)
- }
- func Test_write_float32(t *testing.T) {
- vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
- -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
- for _, val := range vals {
- t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
- should := require.New(t)
- buf := &bytes.Buffer{}
- stream := NewStream(buf, 4096)
- stream.WriteFloat32Lossy(val)
- stream.Flush()
- should.Nil(stream.Error)
- should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
- })
- t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
- should := require.New(t)
- buf := &bytes.Buffer{}
- stream := NewStream(buf, 4096)
- stream.WriteVal(val)
- stream.Flush()
- should.Nil(stream.Error)
- should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
- })
- }
- should := require.New(t)
- buf := &bytes.Buffer{}
- stream := NewStream(buf, 10)
- stream.WriteRaw("abcdefg")
- stream.WriteFloat32Lossy(1.123456)
- stream.Flush()
- should.Nil(stream.Error)
- should.Equal("abcdefg1.123456", buf.String())
- }
- func Test_write_float64(t *testing.T) {
- vals := []float64{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
- -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
- for _, val := range vals {
- t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
- should := require.New(t)
- buf := &bytes.Buffer{}
- stream := NewStream(buf, 4096)
- stream.WriteFloat64Lossy(val)
- stream.Flush()
- should.Nil(stream.Error)
- should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
- })
- t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
- should := require.New(t)
- buf := &bytes.Buffer{}
- stream := NewStream(buf, 4096)
- stream.WriteVal(val)
- stream.Flush()
- should.Nil(stream.Error)
- should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
- })
- }
- should := require.New(t)
- buf := &bytes.Buffer{}
- stream := NewStream(buf, 10)
- stream.WriteRaw("abcdefg")
- stream.WriteFloat64Lossy(1.123456)
- stream.Flush()
- should.Nil(stream.Error)
- should.Equal("abcdefg1.123456", buf.String())
- }
- func Test_read_float64_cursor(t *testing.T) {
- should := require.New(t)
- iter := ParseString("[1.23456789\n,2,3]")
- should.True(iter.ReadArray())
- should.Equal(1.23456789, iter.Read())
- should.True(iter.ReadArray())
- should.Equal(float64(2), iter.Read())
- }
- func Test_read_float_scientific(t *testing.T) {
- should := require.New(t)
- var obj interface{}
- should.Nil(UnmarshalFromString(`1e1`, &obj))
- should.Equal(float64(10), obj)
- should.Nil(json.Unmarshal([]byte(`1e1`), &obj))
- should.Equal(float64(10), obj)
- should.Nil(UnmarshalFromString(`1.0e1`, &obj))
- should.Equal(float64(10), obj)
- should.Nil(json.Unmarshal([]byte(`1.0e1`), &obj))
- should.Equal(float64(10), obj)
- }
- func Benchmark_jsoniter_float(b *testing.B) {
- b.ReportAllocs()
- input := []byte(`1.1123,`)
- iter := NewIterator()
- for n := 0; n < b.N; n++ {
- iter.ResetBytes(input)
- iter.ReadFloat64()
- }
- }
- func Benchmark_json_float(b *testing.B) {
- for n := 0; n < b.N; n++ {
- result := float64(0)
- json.Unmarshal([]byte(`1.1`), &result)
- }
- }
|