jsoniter_float_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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_float32_1_dot_1_comma(t *testing.T) {
  25. iter := ParseString(`1.1,`)
  26. val := iter.ReadFloat32()
  27. if val != 1.1 {
  28. fmt.Println(iter.Error)
  29. t.Fatal(val)
  30. }
  31. }
  32. func Test_write_float32(t *testing.T) {
  33. vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
  34. -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
  35. for _, val := range vals {
  36. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  37. should := require.New(t)
  38. buf := &bytes.Buffer{}
  39. stream := NewStream(buf, 4096)
  40. stream.WriteFloat32(val)
  41. stream.Flush()
  42. should.Nil(stream.Error)
  43. should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
  44. })
  45. t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
  46. should := require.New(t)
  47. buf := &bytes.Buffer{}
  48. stream := NewStream(buf, 4096)
  49. stream.WriteVal(val)
  50. stream.Flush()
  51. should.Nil(stream.Error)
  52. should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String())
  53. })
  54. }
  55. should := require.New(t)
  56. buf := &bytes.Buffer{}
  57. stream := NewStream(buf, 10)
  58. stream.WriteRaw("abcdefg")
  59. stream.WriteFloat32(1.123456)
  60. stream.Flush()
  61. should.Nil(stream.Error)
  62. should.Equal("abcdefg1.123456", buf.String())
  63. }
  64. func Test_write_float64(t *testing.T) {
  65. vals := []float64{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.WriteFloat64(val)
  73. stream.Flush()
  74. should.Nil(stream.Error)
  75. should.Equal(strconv.FormatFloat(val, 'f', -1, 64), 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(val, 'f', -1, 64), buf.String())
  85. })
  86. }
  87. should := require.New(t)
  88. buf := &bytes.Buffer{}
  89. stream := NewStream(buf, 10)
  90. stream.WriteRaw("abcdefg")
  91. stream.WriteFloat64(1.123456)
  92. stream.Flush()
  93. should.Nil(stream.Error)
  94. should.Equal("abcdefg1.123456", buf.String())
  95. }
  96. func Benchmark_jsoniter_float(b *testing.B) {
  97. b.ReportAllocs()
  98. for n := 0; n < b.N; n++ {
  99. iter := ParseString(`1.1111111111`)
  100. iter.ReadFloat64()
  101. }
  102. }
  103. func Benchmark_json_float(b *testing.B) {
  104. for n := 0; n < b.N; n++ {
  105. result := float64(0)
  106. json.Unmarshal([]byte(`1.1`), &result)
  107. }
  108. }