fuzzy_decoder_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. package extra
  2. import (
  3. "testing"
  4. "github.com/json-iterator/go"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func init() {
  8. RegisterFuzzyDecoders()
  9. }
  10. func Test_any_to_string(t *testing.T) {
  11. should := require.New(t)
  12. var val string
  13. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  14. should.Equal("100", val)
  15. should.Nil(jsoniter.UnmarshalFromString("10", &val))
  16. should.Equal("10", val)
  17. should.Nil(jsoniter.UnmarshalFromString("10.1", &val))
  18. should.Equal("10.1", val)
  19. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  20. should.Equal("10.1", val)
  21. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  22. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  23. }
  24. func Test_any_to_int64(t *testing.T) {
  25. should := require.New(t)
  26. var val int64
  27. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  28. should.Equal(int64(100), val)
  29. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  30. should.Equal(int64(10), val)
  31. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  32. should.Equal(int64(10), val)
  33. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  34. should.Equal(int64(10), val)
  35. // bool part
  36. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  37. should.Equal(int64(0), val)
  38. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  39. should.Equal(int64(1), val)
  40. should.Nil(jsoniter.UnmarshalFromString(`-10`, &val))
  41. should.Equal(int64(-10), val)
  42. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  43. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  44. // large float to int
  45. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  46. }
  47. func Test_any_to_int(t *testing.T) {
  48. should := require.New(t)
  49. var val int
  50. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  51. should.Equal(100, val)
  52. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  53. should.Equal(10, val)
  54. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  55. should.Equal(10, val)
  56. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  57. should.Equal(10, val)
  58. // bool part
  59. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  60. should.Equal(0, val)
  61. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  62. should.Equal(1, val)
  63. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  64. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  65. // large float to int
  66. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  67. }
  68. func Test_any_to_int16(t *testing.T) {
  69. should := require.New(t)
  70. var val int16
  71. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  72. should.Equal(int16(100), val)
  73. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  74. should.Equal(int16(10), val)
  75. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  76. should.Equal(int16(10), val)
  77. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  78. should.Equal(int16(10), val)
  79. // bool part
  80. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  81. should.Equal(int16(0), val)
  82. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  83. should.Equal(int16(1), val)
  84. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  85. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  86. // large float to int
  87. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  88. }
  89. func Test_any_to_int32(t *testing.T) {
  90. should := require.New(t)
  91. var val int32
  92. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  93. should.Equal(int32(100), val)
  94. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  95. should.Equal(int32(10), val)
  96. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  97. should.Equal(int32(10), val)
  98. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  99. should.Equal(int32(10), val)
  100. // bool part
  101. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  102. should.Equal(int32(0), val)
  103. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  104. should.Equal(int32(1), val)
  105. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  106. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  107. // large float to int
  108. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  109. }
  110. func Test_any_to_int8(t *testing.T) {
  111. should := require.New(t)
  112. var val int8
  113. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  114. should.Equal(int8(100), val)
  115. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  116. should.Equal(int8(10), val)
  117. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  118. should.Equal(int8(10), val)
  119. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  120. should.Equal(int8(10), val)
  121. // bool part
  122. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  123. should.Equal(int8(0), val)
  124. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  125. should.Equal(int8(1), val)
  126. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  127. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  128. // large float to int
  129. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  130. }
  131. func Test_any_to_uint8(t *testing.T) {
  132. should := require.New(t)
  133. var val uint8
  134. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  135. should.Equal(uint8(100), val)
  136. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  137. should.Equal(uint8(10), val)
  138. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  139. should.Equal(uint8(10), val)
  140. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  141. should.Equal(uint8(10), val)
  142. // bool part
  143. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  144. should.Equal(uint8(0), val)
  145. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  146. should.Equal(uint8(1), val)
  147. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  148. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  149. // large float to int
  150. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  151. }
  152. func Test_any_to_uint64(t *testing.T) {
  153. should := require.New(t)
  154. var val uint64
  155. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  156. should.Equal(uint64(100), val)
  157. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  158. should.Equal(uint64(10), val)
  159. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  160. should.Equal(uint64(10), val)
  161. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  162. should.Equal(uint64(10), val)
  163. // bool part
  164. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  165. should.Equal(uint64(0), val)
  166. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  167. should.Equal(uint64(1), val)
  168. // TODO fix?
  169. should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
  170. should.Equal(uint64(0), val)
  171. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  172. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  173. // large float to int
  174. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  175. }
  176. func Test_any_to_uint32(t *testing.T) {
  177. should := require.New(t)
  178. var val uint32
  179. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  180. should.Equal(uint32(100), val)
  181. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  182. should.Equal(uint32(10), val)
  183. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  184. should.Equal(uint32(10), val)
  185. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  186. should.Equal(uint32(10), val)
  187. // bool part
  188. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  189. should.Equal(uint32(0), val)
  190. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  191. should.Equal(uint32(1), val)
  192. // TODO fix?
  193. should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
  194. should.Equal(uint32(0), val)
  195. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  196. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  197. // large float to int
  198. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  199. }
  200. func Test_any_to_uint16(t *testing.T) {
  201. should := require.New(t)
  202. var val uint16
  203. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  204. should.Equal(uint16(100), val)
  205. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  206. should.Equal(uint16(10), val)
  207. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  208. should.Equal(uint16(10), val)
  209. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  210. should.Equal(uint16(10), val)
  211. // bool part
  212. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  213. should.Equal(uint16(0), val)
  214. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  215. should.Equal(uint16(1), val)
  216. // TODO fix?
  217. should.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))
  218. should.Equal(uint16(0), val)
  219. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  220. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  221. // large float to int
  222. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  223. }
  224. func Test_any_to_uint(t *testing.T) {
  225. should := require.New(t)
  226. var val uint
  227. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  228. should.Equal(uint(100), val)
  229. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  230. should.Equal(uint(10), val)
  231. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  232. should.Equal(uint(10), val)
  233. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  234. should.Equal(uint(10), val)
  235. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  236. should.Equal(uint(0), val)
  237. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  238. should.Equal(uint(1), val)
  239. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  240. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  241. // large float to int
  242. should.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))
  243. }
  244. func Test_any_to_float32(t *testing.T) {
  245. should := require.New(t)
  246. var val float32
  247. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  248. should.Equal(float32(100), val)
  249. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  250. should.Equal(float32(10.1), val)
  251. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  252. should.Equal(float32(10.1), val)
  253. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  254. should.Equal(float32(10), val)
  255. // bool part
  256. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  257. should.Equal(float32(0), val)
  258. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  259. should.Equal(float32(1), val)
  260. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  261. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  262. }
  263. func Test_any_to_float64(t *testing.T) {
  264. should := require.New(t)
  265. var val float64
  266. should.Nil(jsoniter.UnmarshalFromString(`"100"`, &val))
  267. should.Equal(float64(100), val)
  268. should.Nil(jsoniter.UnmarshalFromString(`"10.1"`, &val))
  269. should.Equal(float64(10.1), val)
  270. should.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))
  271. should.Equal(float64(10.1), val)
  272. should.Nil(jsoniter.UnmarshalFromString(`10`, &val))
  273. should.Equal(float64(10), val)
  274. // bool part
  275. should.Nil(jsoniter.UnmarshalFromString(`false`, &val))
  276. should.Equal(float64(0), val)
  277. should.Nil(jsoniter.UnmarshalFromString(`true`, &val))
  278. should.Equal(float64(1), val)
  279. should.NotNil(jsoniter.UnmarshalFromString("{}", &val))
  280. should.NotNil(jsoniter.UnmarshalFromString("[]", &val))
  281. }
  282. func Test_empty_array_as_map(t *testing.T) {
  283. should := require.New(t)
  284. var val map[string]interface{}
  285. should.Nil(jsoniter.UnmarshalFromString(`[]`, &val))
  286. should.Equal(map[string]interface{}{}, val)
  287. }
  288. func Test_empty_array_as_object(t *testing.T) {
  289. should := require.New(t)
  290. var val struct{}
  291. should.Nil(jsoniter.UnmarshalFromString(`[]`, &val))
  292. should.Equal(struct{}{}, val)
  293. }
  294. func Test_bad_case(t *testing.T) {
  295. var jsonstr = `
  296. {
  297. "extra_type": 181760,
  298. "combo_type": 0,
  299. "trigger_time_ms": 1498800398000,
  300. "_create_time": "2017-06-16 11:21:39",
  301. "_msg_type": 41000
  302. }
  303. `
  304. type OrderEventRequestParams struct {
  305. ExtraType uint64 `json:"extra_type"`
  306. }
  307. var a OrderEventRequestParams
  308. err := jsoniter.UnmarshalFromString(jsonstr, &a)
  309. should := require.New(t)
  310. should.Nil(err)
  311. }
  312. func Test_null_to_string(t *testing.T) {
  313. should := require.New(t)
  314. body := []byte(`null`)
  315. var message string
  316. err := jsoniter.Unmarshal(body, &message)
  317. should.NoError(err)
  318. }
  319. func Test_null_to_int(t *testing.T) {
  320. should := require.New(t)
  321. body := []byte(`null`)
  322. var message int
  323. err := jsoniter.Unmarshal(body, &message)
  324. should.NoError(err)
  325. }
  326. func Test_null_to_float32(t *testing.T) {
  327. should := require.New(t)
  328. body := []byte(`null`)
  329. var message float32
  330. err := jsoniter.Unmarshal(body, &message)
  331. should.NoError(err)
  332. }
  333. func Test_null_to_float64(t *testing.T) {
  334. should := require.New(t)
  335. body := []byte(`null`)
  336. var message float64
  337. err := jsoniter.Unmarshal(body, &message)
  338. should.NoError(err)
  339. }