jsoniter_float_test.go 4.1 KB

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