float_test.go 4.1 KB

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