fuzzy_decoder_test.go 12 KB

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