jsoniter_float_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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_wrap_float(t *testing.T) {
  59. should := require.New(t)
  60. str, err := MarshalToString(WrapFloat64(12.3))
  61. should.Nil(err)
  62. should.Equal("12.3", str)
  63. }
  64. func Test_write_float32(t *testing.T) {
  65. vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
  66. -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
  67. for _, val := range vals {
  68. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  69. should := require.New(t)
  70. buf := &bytes.Buffer{}
  71. stream := NewStream(buf, 4096)
  72. stream.WriteFloat32(val)
  73. stream.Flush()
  74. should.Nil(stream.Error)
  75. should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
  76. })
  77. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  78. should := require.New(t)
  79. buf := &bytes.Buffer{}
  80. stream := NewStream(buf, 4096)
  81. stream.WriteVal(val)
  82. stream.Flush()
  83. should.Nil(stream.Error)
  84. should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
  85. })
  86. }
  87. should := require.New(t)
  88. buf := &bytes.Buffer{}
  89. stream := NewStream(buf, 10)
  90. stream.WriteRaw("abcdefg")
  91. stream.WriteFloat32(1.123456)
  92. stream.Flush()
  93. should.Nil(stream.Error)
  94. should.Equal("abcdefg1.123456", buf.String())
  95. }
  96. func Test_write_float64(t *testing.T) {
  97. vals := []float64{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
  98. -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
  99. for _, val := range vals {
  100. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  101. should := require.New(t)
  102. buf := &bytes.Buffer{}
  103. stream := NewStream(buf, 4096)
  104. stream.WriteFloat64(val)
  105. stream.Flush()
  106. should.Nil(stream.Error)
  107. should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
  108. })
  109. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  110. should := require.New(t)
  111. buf := &bytes.Buffer{}
  112. stream := NewStream(buf, 4096)
  113. stream.WriteVal(val)
  114. stream.Flush()
  115. should.Nil(stream.Error)
  116. should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
  117. })
  118. }
  119. should := require.New(t)
  120. buf := &bytes.Buffer{}
  121. stream := NewStream(buf, 10)
  122. stream.WriteRaw("abcdefg")
  123. stream.WriteFloat64(1.123456)
  124. stream.Flush()
  125. should.Nil(stream.Error)
  126. should.Equal("abcdefg1.123456", buf.String())
  127. }
  128. func Test_read_float64_cursor(t *testing.T) {
  129. should := require.New(t)
  130. iter := ParseString("[1.23456789\n,2,3]")
  131. should.True(iter.ReadArray())
  132. should.Equal(1.23456789, iter.Read())
  133. should.True(iter.ReadArray())
  134. should.Equal(float64(2), iter.Read())
  135. }
  136. func Benchmark_jsoniter_float(b *testing.B) {
  137. b.ReportAllocs()
  138. input := []byte(`1.1123,`)
  139. iter := NewIterator()
  140. for n := 0; n < b.N; n++ {
  141. iter.ResetBytes(input)
  142. iter.ReadFloat64()
  143. }
  144. }
  145. func Benchmark_json_float(b *testing.B) {
  146. for n := 0; n < b.N; n++ {
  147. result := float64(0)
  148. json.Unmarshal([]byte(`1.1`), &result)
  149. }
  150. }