jsoniter_skip_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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_skip_empty(t *testing.T) {
  96. should := require.New(t)
  97. should.NotNil(jsoniter.Get([]byte("")).LastError())
  98. }
  99. type TestResp struct {
  100. Code uint64
  101. }
  102. func Benchmark_jsoniter_skip(b *testing.B) {
  103. input := []byte(`
  104. {
  105. "_shards":{
  106. "total" : 5,
  107. "successful" : 5,
  108. "failed" : 0
  109. },
  110. "hits":{
  111. "total" : 1,
  112. "hits" : [
  113. {
  114. "_index" : "twitter",
  115. "_type" : "tweet",
  116. "_id" : "1",
  117. "_source" : {
  118. "user" : "kimchy",
  119. "postDate" : "2009-11-15T14:12:12",
  120. "message" : "trying out Elasticsearch"
  121. }
  122. }
  123. ]
  124. },
  125. "code": 200
  126. }`)
  127. for n := 0; n < b.N; n++ {
  128. result := TestResp{}
  129. iter := jsoniter.ParseBytes(jsoniter.ConfigDefault, input)
  130. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  131. switch field {
  132. case "code":
  133. result.Code = iter.ReadUint64()
  134. default:
  135. iter.Skip()
  136. }
  137. }
  138. }
  139. }
  140. func Benchmark_json_skip(b *testing.B) {
  141. input := []byte(`
  142. {
  143. "_shards":{
  144. "total" : 5,
  145. "successful" : 5,
  146. "failed" : 0
  147. },
  148. "hits":{
  149. "total" : 1,
  150. "hits" : [
  151. {
  152. "_index" : "twitter",
  153. "_type" : "tweet",
  154. "_id" : "1",
  155. "_source" : {
  156. "user" : "kimchy",
  157. "postDate" : "2009-11-15T14:12:12",
  158. "message" : "trying out Elasticsearch"
  159. }
  160. }
  161. ]
  162. },
  163. "code": 200
  164. }`)
  165. for n := 0; n < b.N; n++ {
  166. result := TestResp{}
  167. json.Unmarshal(input, &result)
  168. }
  169. }