jsoniter_array_test.go 2.7 KB

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