jsoniter_skip_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package skip_tests
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "testing"
  6. "github.com/json-iterator/go"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func Test_skip_number_in_array(t *testing.T) {
  10. should := require.New(t)
  11. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[-0.12, "stream"]`)
  12. iter.ReadArray()
  13. iter.Skip()
  14. iter.ReadArray()
  15. should.Nil(iter.Error)
  16. should.Equal("stream", iter.ReadString())
  17. }
  18. func Test_skip_string_in_array(t *testing.T) {
  19. should := require.New(t)
  20. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `["hello", "stream"]`)
  21. iter.ReadArray()
  22. iter.Skip()
  23. iter.ReadArray()
  24. should.Nil(iter.Error)
  25. should.Equal("stream", iter.ReadString())
  26. }
  27. func Test_skip_null(t *testing.T) {
  28. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[null , "stream"]`)
  29. iter.ReadArray()
  30. iter.Skip()
  31. iter.ReadArray()
  32. if iter.ReadString() != "stream" {
  33. t.FailNow()
  34. }
  35. }
  36. func Test_skip_true(t *testing.T) {
  37. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[true , "stream"]`)
  38. iter.ReadArray()
  39. iter.Skip()
  40. iter.ReadArray()
  41. if iter.ReadString() != "stream" {
  42. t.FailNow()
  43. }
  44. }
  45. func Test_skip_false(t *testing.T) {
  46. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[false , "stream"]`)
  47. iter.ReadArray()
  48. iter.Skip()
  49. iter.ReadArray()
  50. if iter.ReadString() != "stream" {
  51. t.FailNow()
  52. }
  53. }
  54. func Test_skip_array(t *testing.T) {
  55. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[[1, [2, [3], 4]], "stream"]`)
  56. iter.ReadArray()
  57. iter.Skip()
  58. iter.ReadArray()
  59. if iter.ReadString() != "stream" {
  60. t.FailNow()
  61. }
  62. }
  63. func Test_skip_empty_array(t *testing.T) {
  64. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[ [ ], "stream"]`)
  65. iter.ReadArray()
  66. iter.Skip()
  67. iter.ReadArray()
  68. if iter.ReadString() != "stream" {
  69. t.FailNow()
  70. }
  71. }
  72. func Test_skip_nested(t *testing.T) {
  73. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`)
  74. iter.ReadArray()
  75. iter.Skip()
  76. iter.ReadArray()
  77. if iter.ReadString() != "stream" {
  78. t.FailNow()
  79. }
  80. }
  81. func Test_skip_and_return_bytes(t *testing.T) {
  82. should := require.New(t)
  83. iter := jsoniter.ParseString(jsoniter.ConfigDefault, `[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`)
  84. iter.ReadArray()
  85. skipped := iter.SkipAndReturnBytes()
  86. should.Equal(`{"a" : [{"stream": "c"}], "d": 102 }`, string(skipped))
  87. }
  88. func Test_skip_and_return_bytes_with_reader(t *testing.T) {
  89. should := require.New(t)
  90. iter := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(`[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`), 4)
  91. iter.ReadArray()
  92. skipped := iter.SkipAndReturnBytes()
  93. should.Equal(`{"a" : [{"stream": "c"}], "d": 102 }`, string(skipped))
  94. }
  95. func Test_append_skip_and_return_bytes_with_reader(t *testing.T) {
  96. should := require.New(t)
  97. iter := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(`[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`), 4)
  98. iter.ReadArray()
  99. buf := make([]byte, 0, 1024)
  100. buf = iter.SkipAndAppendBytes(buf)
  101. should.Equal(`{"a" : [{"stream": "c"}], "d": 102 }`, string(buf))
  102. }
  103. func Test_skip_empty(t *testing.T) {
  104. should := require.New(t)
  105. should.NotNil(jsoniter.Get([]byte("")).LastError())
  106. }
  107. type TestResp struct {
  108. Code uint64
  109. }
  110. func Benchmark_jsoniter_skip(b *testing.B) {
  111. input := []byte(`
  112. {
  113. "_shards":{
  114. "total" : 5,
  115. "successful" : 5,
  116. "failed" : 0
  117. },
  118. "hits":{
  119. "total" : 1,
  120. "hits" : [
  121. {
  122. "_index" : "twitter",
  123. "_type" : "tweet",
  124. "_id" : "1",
  125. "_source" : {
  126. "user" : "kimchy",
  127. "postDate" : "2009-11-15T14:12:12",
  128. "message" : "trying out Elasticsearch"
  129. }
  130. }
  131. ]
  132. },
  133. "code": 200
  134. }`)
  135. for n := 0; n < b.N; n++ {
  136. result := TestResp{}
  137. iter := jsoniter.ParseBytes(jsoniter.ConfigDefault, input)
  138. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  139. switch field {
  140. case "code":
  141. result.Code = iter.ReadUint64()
  142. default:
  143. iter.Skip()
  144. }
  145. }
  146. }
  147. }
  148. func Benchmark_json_skip(b *testing.B) {
  149. input := []byte(`
  150. {
  151. "_shards":{
  152. "total" : 5,
  153. "successful" : 5,
  154. "failed" : 0
  155. },
  156. "hits":{
  157. "total" : 1,
  158. "hits" : [
  159. {
  160. "_index" : "twitter",
  161. "_type" : "tweet",
  162. "_id" : "1",
  163. "_source" : {
  164. "user" : "kimchy",
  165. "postDate" : "2009-11-15T14:12:12",
  166. "message" : "trying out Elasticsearch"
  167. }
  168. }
  169. ]
  170. },
  171. "code": 200
  172. }`)
  173. for n := 0; n < b.N; n++ {
  174. result := TestResp{}
  175. json.Unmarshal(input, &result)
  176. }
  177. }