jsoniter_float_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  6. "github.com/json-iterator/go/require"
  7. "bytes"
  8. "strconv"
  9. )
  10. func Test_float64_0(t *testing.T) {
  11. iter := ParseString(`0`)
  12. val := iter.ReadFloat64()
  13. if val != 0 {
  14. t.Fatal(val)
  15. }
  16. }
  17. func Test_float64_1_dot_1(t *testing.T) {
  18. iter := ParseString(`1.1`)
  19. val := iter.ReadFloat64()
  20. if val != 1.1 {
  21. t.Fatal(val)
  22. }
  23. }
  24. func Test_read_float32(t *testing.T) {
  25. inputs := []string{`1.1`, `1000`, `9223372036854775807`, `12.3`, `-12.3`, `720368.54775807`, `720368.547758075`}
  26. for _, input := range inputs {
  27. // non-streaming
  28. t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
  29. should := require.New(t)
  30. iter := ParseString(input + ",")
  31. expected, err := strconv.ParseFloat(input, 32)
  32. should.Nil(err)
  33. should.Equal(float32(expected), iter.ReadFloat32())
  34. })
  35. // streaming
  36. t.Run(fmt.Sprintf("%v", input), func(t *testing.T) {
  37. should := require.New(t)
  38. iter := Parse(bytes.NewBufferString(input + ","), 2)
  39. expected, err := strconv.ParseFloat(input, 32)
  40. should.Nil(err)
  41. should.Equal(float32(expected), iter.ReadFloat32())
  42. })
  43. }
  44. }
  45. func Test_write_float32(t *testing.T) {
  46. vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
  47. -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
  48. for _, val := range vals {
  49. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  50. should := require.New(t)
  51. buf := &bytes.Buffer{}
  52. stream := NewStream(buf, 4096)
  53. stream.WriteFloat32(val)
  54. stream.Flush()
  55. should.Nil(stream.Error)
  56. should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
  57. })
  58. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  59. should := require.New(t)
  60. buf := &bytes.Buffer{}
  61. stream := NewStream(buf, 4096)
  62. stream.WriteVal(val)
  63. stream.Flush()
  64. should.Nil(stream.Error)
  65. should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
  66. })
  67. }
  68. should := require.New(t)
  69. buf := &bytes.Buffer{}
  70. stream := NewStream(buf, 10)
  71. stream.WriteRaw("abcdefg")
  72. stream.WriteFloat32(1.123456)
  73. stream.Flush()
  74. should.Nil(stream.Error)
  75. should.Equal("abcdefg1.123456", buf.String())
  76. }
  77. func Test_write_float64(t *testing.T) {
  78. vals := []float64{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
  79. -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
  80. for _, val := range vals {
  81. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  82. should := require.New(t)
  83. buf := &bytes.Buffer{}
  84. stream := NewStream(buf, 4096)
  85. stream.WriteFloat64(val)
  86. stream.Flush()
  87. should.Nil(stream.Error)
  88. should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
  89. })
  90. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  91. should := require.New(t)
  92. buf := &bytes.Buffer{}
  93. stream := NewStream(buf, 4096)
  94. stream.WriteVal(val)
  95. stream.Flush()
  96. should.Nil(stream.Error)
  97. should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
  98. })
  99. }
  100. should := require.New(t)
  101. buf := &bytes.Buffer{}
  102. stream := NewStream(buf, 10)
  103. stream.WriteRaw("abcdefg")
  104. stream.WriteFloat64(1.123456)
  105. stream.Flush()
  106. should.Nil(stream.Error)
  107. should.Equal("abcdefg1.123456", buf.String())
  108. }
  109. func Benchmark_jsoniter_float(b *testing.B) {
  110. b.ReportAllocs()
  111. input := []byte(`1.1123,`)
  112. iter := NewIterator()
  113. for n := 0; n < b.N; n++ {
  114. iter.ResetBytes(input)
  115. iter.ReadFloat32()
  116. }
  117. }
  118. func Benchmark_json_float(b *testing.B) {
  119. for n := 0; n < b.N; n++ {
  120. result := float64(0)
  121. json.Unmarshal([]byte(`1.1`), &result)
  122. }
  123. }