jsoniter_array_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/json-iterator/go/require"
  6. "bytes"
  7. )
  8. func Test_empty_array(t *testing.T) {
  9. iter := ParseString(`[]`)
  10. cont := iter.ReadArray()
  11. if cont != false {
  12. t.FailNow()
  13. }
  14. }
  15. func Test_one_element(t *testing.T) {
  16. iter := ParseString(`[1]`)
  17. cont := iter.ReadArray()
  18. if cont != true {
  19. t.FailNow()
  20. }
  21. if iter.ReadInt64() != 1 {
  22. t.FailNow()
  23. }
  24. cont = iter.ReadArray()
  25. if cont != false {
  26. t.FailNow()
  27. }
  28. }
  29. func Test_two_elements(t *testing.T) {
  30. iter := ParseString(`[1,2]`)
  31. cont := iter.ReadArray()
  32. if cont != true {
  33. t.FailNow()
  34. }
  35. if iter.ReadInt64() != 1 {
  36. t.FailNow()
  37. }
  38. cont = iter.ReadArray()
  39. if cont != true {
  40. t.FailNow()
  41. }
  42. if iter.ReadInt64() != 2 {
  43. t.FailNow()
  44. }
  45. cont = iter.ReadArray()
  46. if cont != false {
  47. t.FailNow()
  48. }
  49. }
  50. func Test_invalid_array(t *testing.T) {
  51. iter := ParseString(`[`)
  52. iter.ReadArray()
  53. if iter.Error == nil {
  54. t.FailNow()
  55. }
  56. }
  57. func Test_whitespace_in_head(t *testing.T) {
  58. iter := ParseString(` [1]`)
  59. cont := iter.ReadArray()
  60. if cont != true {
  61. t.FailNow()
  62. }
  63. if iter.ReadUint64() != 1 {
  64. t.FailNow()
  65. }
  66. }
  67. func Test_whitespace_after_array_start(t *testing.T) {
  68. iter := ParseString(`[ 1]`)
  69. cont := iter.ReadArray()
  70. if cont != true {
  71. t.FailNow()
  72. }
  73. if iter.ReadUint64() != 1 {
  74. t.FailNow()
  75. }
  76. }
  77. func Test_whitespace_before_array_end(t *testing.T) {
  78. iter := ParseString(`[1 ]`)
  79. cont := iter.ReadArray()
  80. if cont != true {
  81. t.FailNow()
  82. }
  83. if iter.ReadUint64() != 1 {
  84. t.FailNow()
  85. }
  86. cont = iter.ReadArray()
  87. if cont != false {
  88. t.FailNow()
  89. }
  90. }
  91. func Test_whitespace_before_comma(t *testing.T) {
  92. iter := ParseString(`[1 ,2]`)
  93. cont := iter.ReadArray()
  94. if cont != true {
  95. t.FailNow()
  96. }
  97. if iter.ReadUint64() != 1 {
  98. t.FailNow()
  99. }
  100. cont = iter.ReadArray()
  101. if cont != true {
  102. t.FailNow()
  103. }
  104. if iter.ReadUint64() != 2 {
  105. t.FailNow()
  106. }
  107. cont = iter.ReadArray()
  108. if cont != false {
  109. t.FailNow()
  110. }
  111. }
  112. func Test_write_array(t *testing.T) {
  113. should := require.New(t)
  114. buf := &bytes.Buffer{}
  115. stream := NewStream(buf, 4096)
  116. stream.IndentionStep = 2
  117. stream.WriteArrayStart()
  118. stream.WriteInt(1)
  119. stream.WriteMore()
  120. stream.WriteInt(2)
  121. stream.WriteArrayEnd()
  122. stream.Flush()
  123. should.Nil(stream.Error)
  124. should.Equal("[\n 1,\n 2\n]", buf.String())
  125. }
  126. func Benchmark_jsoniter_array(b *testing.B) {
  127. b.ReportAllocs()
  128. input := []byte(`[1,2,3,4,5,6,7,8,9]`)
  129. iter := ParseBytes(input)
  130. b.ResetTimer()
  131. for n := 0; n < b.N; n++ {
  132. iter.ResetBytes(input)
  133. for iter.ReadArray() {
  134. iter.ReadUint64()
  135. }
  136. }
  137. }
  138. func Benchmark_json_array(b *testing.B) {
  139. for n := 0; n < b.N; n++ {
  140. result := []interface{}{}
  141. json.Unmarshal([]byte(`[1,2,3]`), &result)
  142. }
  143. }