json_parser_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. package responses
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestUnmarshal(t *testing.T) {
  7. initJsonParserOnce()
  8. from := []byte(`{}`)
  9. to := &struct{}{}
  10. // support auto json type trans
  11. err := jsonParser.Unmarshal(from, to)
  12. assert.Nil(t, err)
  13. str, err := jsonParser.Marshal(to)
  14. assert.Nil(t, err)
  15. assert.Equal(t, `{}`, string(str))
  16. }
  17. func TestUnmarshal_int(t *testing.T) {
  18. initJsonParserOnce()
  19. to := &struct {
  20. INT int
  21. }{}
  22. from := []byte(`{"INT":100}`)
  23. err := jsonParser.Unmarshal(from, to)
  24. assert.Nil(t, err)
  25. assert.Equal(t, 100, to.INT)
  26. str, err := jsonParser.Marshal(to)
  27. assert.Nil(t, err)
  28. assert.Equal(t, `{"INT":100}`, string(str))
  29. from = []byte(`{"INT":100.1}`)
  30. err = jsonParser.Unmarshal(from, to)
  31. assert.Nil(t, err)
  32. assert.Equal(t, 100, to.INT)
  33. str, err = jsonParser.Marshal(to)
  34. assert.Nil(t, err)
  35. assert.Equal(t, `{"INT":100}`, string(str))
  36. // string to int
  37. from = []byte(`{"INT":"100"}`)
  38. err = jsonParser.Unmarshal(from, to)
  39. assert.Nil(t, err)
  40. assert.Equal(t, 100, to.INT)
  41. str, err = jsonParser.Marshal(to)
  42. assert.Nil(t, err)
  43. assert.Equal(t, `{"INT":100}`, string(str))
  44. from = []byte(`{"INT":""}`)
  45. err = jsonParser.Unmarshal(from, to)
  46. assert.Nil(t, err)
  47. assert.Equal(t, 0, to.INT)
  48. str, err = jsonParser.Marshal(to)
  49. assert.Nil(t, err)
  50. assert.Equal(t, `{"INT":0}`, string(str))
  51. // bool to int
  52. from = []byte(`{"INT":true}`)
  53. err = jsonParser.Unmarshal(from, to)
  54. assert.Nil(t, err)
  55. assert.Equal(t, 1, to.INT)
  56. str, err = jsonParser.Marshal(to)
  57. assert.Nil(t, err)
  58. assert.Equal(t, `{"INT":1}`, string(str))
  59. from = []byte(`{"INT":false}`)
  60. err = jsonParser.Unmarshal(from, to)
  61. assert.Nil(t, err)
  62. assert.Equal(t, 0, to.INT)
  63. str, err = jsonParser.Marshal(to)
  64. assert.Nil(t, err)
  65. assert.Equal(t, `{"INT":0}`, string(str))
  66. // nil to int
  67. from = []byte(`{"INT":null}`)
  68. err = jsonParser.Unmarshal(from, to)
  69. assert.Nil(t, err)
  70. assert.Equal(t, 0, to.INT)
  71. str, err = jsonParser.Marshal(to)
  72. assert.Nil(t, err)
  73. assert.Equal(t, `{"INT":0}`, string(str))
  74. // fuzzy decode int
  75. from = []byte(`{"INT":100000000000000000000000000.1}`)
  76. err = jsonParser.Unmarshal(from, to)
  77. assert.NotNil(t, err)
  78. assert.Equal(t, "struct { INT int }.INT: fuzzy decode int: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  79. from = []byte(`{"INT":{}}`)
  80. err = jsonParser.Unmarshal(from, to)
  81. assert.NotNil(t, err)
  82. assert.Equal(t, "struct { INT int }.INT: readUint64: unexpected character: \xff, error found in #0 byte of ...||..., bigger context ...||...", err.Error())
  83. }
  84. func TestUnmarshal_uint(t *testing.T) {
  85. initJsonParserOnce()
  86. to := &struct {
  87. UINT uint
  88. }{}
  89. from := []byte(`{"UINT":100}`)
  90. err := jsonParser.Unmarshal(from, to)
  91. assert.Nil(t, err)
  92. assert.Equal(t, uint(100), to.UINT)
  93. str, err := jsonParser.Marshal(to)
  94. assert.Nil(t, err)
  95. assert.Equal(t, `{"UINT":100}`, string(str))
  96. from = []byte(`{"UINT":100.1}`)
  97. err = jsonParser.Unmarshal(from, to)
  98. assert.Nil(t, err)
  99. assert.Equal(t, uint(100), to.UINT)
  100. str, err = jsonParser.Marshal(to)
  101. assert.Nil(t, err)
  102. assert.Equal(t, `{"UINT":100}`, string(str))
  103. // fuzzy decode uint
  104. from = []byte(`{"UINT":100000000000000000000000000.1}`)
  105. err = jsonParser.Unmarshal(from, to)
  106. assert.NotNil(t, err)
  107. assert.Equal(t, "struct { UINT uint }.UINT: fuzzy decode uint: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  108. }
  109. func TestUnmarshal_int8(t *testing.T) {
  110. initJsonParserOnce()
  111. to := &struct {
  112. INT8 int8
  113. }{}
  114. from := []byte(`{"INT8":100}`)
  115. err := jsonParser.Unmarshal(from, to)
  116. assert.Nil(t, err)
  117. assert.Equal(t, int8(100), to.INT8)
  118. str, err := jsonParser.Marshal(to)
  119. assert.Nil(t, err)
  120. assert.Equal(t, `{"INT8":100}`, string(str))
  121. from = []byte(`{"INT8":100.1}`)
  122. err = jsonParser.Unmarshal(from, to)
  123. assert.Nil(t, err)
  124. assert.Equal(t, int8(100), to.INT8)
  125. str, err = jsonParser.Marshal(to)
  126. assert.Nil(t, err)
  127. assert.Equal(t, `{"INT8":100}`, string(str))
  128. // fuzzy decode uint
  129. from = []byte(`{"INT8":100000000000000000000000000.1}`)
  130. err = jsonParser.Unmarshal(from, to)
  131. assert.NotNil(t, err)
  132. assert.Equal(t, "struct { INT8 int8 }.INT8: fuzzy decode int8: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  133. }
  134. func TestUnmarshal_uint8(t *testing.T) {
  135. initJsonParserOnce()
  136. to := &struct {
  137. UINT8 uint8
  138. }{}
  139. from := []byte(`{"UINT8":100}`)
  140. err := jsonParser.Unmarshal(from, to)
  141. assert.Nil(t, err)
  142. assert.Equal(t, uint8(100), to.UINT8)
  143. str, err := jsonParser.Marshal(to)
  144. assert.Nil(t, err)
  145. assert.Equal(t, `{"UINT8":100}`, string(str))
  146. from = []byte(`{"UINT8":100.1}`)
  147. err = jsonParser.Unmarshal(from, to)
  148. assert.Nil(t, err)
  149. assert.Equal(t, uint8(100), to.UINT8)
  150. str, err = jsonParser.Marshal(to)
  151. assert.Nil(t, err)
  152. assert.Equal(t, `{"UINT8":100}`, string(str))
  153. // fuzzy decode uint
  154. from = []byte(`{"UINT8":100000000000000000000000000.1}`)
  155. err = jsonParser.Unmarshal(from, to)
  156. assert.NotNil(t, err)
  157. assert.Equal(t, "struct { UINT8 uint8 }.UINT8: fuzzy decode uint8: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  158. }
  159. func TestUnmarshal_int16(t *testing.T) {
  160. initJsonParserOnce()
  161. to := &struct {
  162. INT16 int16
  163. }{}
  164. from := []byte(`{"INT16":100}`)
  165. err := jsonParser.Unmarshal(from, to)
  166. assert.Nil(t, err)
  167. assert.Equal(t, int16(100), to.INT16)
  168. str, err := jsonParser.Marshal(to)
  169. assert.Nil(t, err)
  170. assert.Equal(t, `{"INT16":100}`, string(str))
  171. from = []byte(`{"INT16":100.1}`)
  172. err = jsonParser.Unmarshal(from, to)
  173. assert.Nil(t, err)
  174. assert.Equal(t, int16(100), to.INT16)
  175. str, err = jsonParser.Marshal(to)
  176. assert.Nil(t, err)
  177. assert.Equal(t, `{"INT16":100}`, string(str))
  178. // fuzzy decode uint
  179. from = []byte(`{"INT16":100000000000000000000000000.1}`)
  180. err = jsonParser.Unmarshal(from, to)
  181. assert.NotNil(t, err)
  182. assert.Equal(t, "struct { INT16 int16 }.INT16: fuzzy decode int16: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  183. }
  184. func TestUnmarshal_uint16(t *testing.T) {
  185. initJsonParserOnce()
  186. to := &struct {
  187. UINT16 uint16
  188. }{}
  189. from := []byte(`{"UINT16":100}`)
  190. err := jsonParser.Unmarshal(from, to)
  191. assert.Nil(t, err)
  192. assert.Equal(t, uint16(100), to.UINT16)
  193. str, err := jsonParser.Marshal(to)
  194. assert.Nil(t, err)
  195. assert.Equal(t, `{"UINT16":100}`, string(str))
  196. from = []byte(`{"UINT16":100.1}`)
  197. err = jsonParser.Unmarshal(from, to)
  198. assert.Nil(t, err)
  199. assert.Equal(t, uint16(100), to.UINT16)
  200. str, err = jsonParser.Marshal(to)
  201. assert.Nil(t, err)
  202. assert.Equal(t, `{"UINT16":100}`, string(str))
  203. // fuzzy decode uint
  204. from = []byte(`{"UINT16":100000000000000000000000000.1}`)
  205. err = jsonParser.Unmarshal(from, to)
  206. assert.NotNil(t, err)
  207. assert.Equal(t, "struct { UINT16 uint16 }.UINT16: fuzzy decode uint16: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  208. }
  209. func TestUnmarshal_int32(t *testing.T) {
  210. initJsonParserOnce()
  211. to := &struct {
  212. INT32 int32
  213. }{}
  214. from := []byte(`{"INT32":100}`)
  215. err := jsonParser.Unmarshal(from, to)
  216. assert.Nil(t, err)
  217. assert.Equal(t, int32(100), to.INT32)
  218. str, err := jsonParser.Marshal(to)
  219. assert.Nil(t, err)
  220. assert.Equal(t, `{"INT32":100}`, string(str))
  221. from = []byte(`{"INT32":100.1}`)
  222. err = jsonParser.Unmarshal(from, to)
  223. assert.Nil(t, err)
  224. assert.Equal(t, int32(100), to.INT32)
  225. str, err = jsonParser.Marshal(to)
  226. assert.Nil(t, err)
  227. assert.Equal(t, `{"INT32":100}`, string(str))
  228. // fuzzy decode uint
  229. from = []byte(`{"INT32":100000000000000000000000000.1}`)
  230. err = jsonParser.Unmarshal(from, to)
  231. assert.NotNil(t, err)
  232. assert.Equal(t, "struct { INT32 int32 }.INT32: fuzzy decode int32: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  233. }
  234. func TestUnmarshal_uint32(t *testing.T) {
  235. initJsonParserOnce()
  236. to := &struct {
  237. UINT32 uint32
  238. }{}
  239. from := []byte(`{"UINT32":100}`)
  240. err := jsonParser.Unmarshal(from, to)
  241. assert.Nil(t, err)
  242. assert.Equal(t, uint32(100), to.UINT32)
  243. str, err := jsonParser.Marshal(to)
  244. assert.Nil(t, err)
  245. assert.Equal(t, `{"UINT32":100}`, string(str))
  246. from = []byte(`{"UINT32":100.1}`)
  247. err = jsonParser.Unmarshal(from, to)
  248. assert.Nil(t, err)
  249. assert.Equal(t, uint32(100), to.UINT32)
  250. str, err = jsonParser.Marshal(to)
  251. assert.Nil(t, err)
  252. assert.Equal(t, `{"UINT32":100}`, string(str))
  253. // fuzzy decode uint
  254. from = []byte(`{"UINT32":100000000000000000000000000.1}`)
  255. err = jsonParser.Unmarshal(from, to)
  256. assert.NotNil(t, err)
  257. assert.Equal(t, "struct { UINT32 uint32 }.UINT32: fuzzy decode uint32: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  258. }
  259. func TestUnmarshal_int64(t *testing.T) {
  260. initJsonParserOnce()
  261. to := &struct {
  262. INT64 int64
  263. }{}
  264. from := []byte(`{"INT64":100}`)
  265. err := jsonParser.Unmarshal(from, to)
  266. assert.Nil(t, err)
  267. assert.Equal(t, int64(100), to.INT64)
  268. str, err := jsonParser.Marshal(to)
  269. assert.Nil(t, err)
  270. assert.Equal(t, `{"INT64":100}`, string(str))
  271. from = []byte(`{"INT64":100.1}`)
  272. err = jsonParser.Unmarshal(from, to)
  273. assert.Nil(t, err)
  274. assert.Equal(t, int64(100), to.INT64)
  275. str, err = jsonParser.Marshal(to)
  276. assert.Nil(t, err)
  277. assert.Equal(t, `{"INT64":100}`, string(str))
  278. // fuzzy decode uint
  279. from = []byte(`{"INT64":100000000000000000000000000.1}`)
  280. err = jsonParser.Unmarshal(from, to)
  281. assert.NotNil(t, err)
  282. assert.Equal(t, "struct { INT64 int64 }.INT64: fuzzy decode int64: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  283. }
  284. func TestUnmarshal_uint64(t *testing.T) {
  285. initJsonParserOnce()
  286. to := &struct {
  287. UINT64 uint64
  288. }{}
  289. from := []byte(`{"UINT64":100}`)
  290. err := jsonParser.Unmarshal(from, to)
  291. assert.Nil(t, err)
  292. assert.Equal(t, uint64(100), to.UINT64)
  293. str, err := jsonParser.Marshal(to)
  294. assert.Nil(t, err)
  295. assert.Equal(t, `{"UINT64":100}`, string(str))
  296. from = []byte(`{"UINT64":100.1}`)
  297. err = jsonParser.Unmarshal(from, to)
  298. assert.Nil(t, err)
  299. assert.Equal(t, uint64(100), to.UINT64)
  300. str, err = jsonParser.Marshal(to)
  301. assert.Nil(t, err)
  302. assert.Equal(t, `{"UINT64":100}`, string(str))
  303. // fuzzy decode uint
  304. from = []byte(`{"UINT64":100000000000000000000000000.1}`)
  305. err = jsonParser.Unmarshal(from, to)
  306. assert.NotNil(t, err)
  307. assert.Equal(t, "struct { UINT64 uint64 }.UINT64: fuzzy decode uint64: exceed range, error found in #10 byte of ...|00000000.1|..., bigger context ...|100000000000000000000000000.1|...", err.Error())
  308. }
  309. func TestUnmarshal_string(t *testing.T) {
  310. initJsonParserOnce()
  311. to := &struct {
  312. STRING string
  313. }{}
  314. // string to string
  315. from := []byte(`{"STRING":""}`)
  316. err := jsonParser.Unmarshal(from, to)
  317. assert.Nil(t, err)
  318. assert.Equal(t, "", to.STRING)
  319. str, err := jsonParser.Marshal(to)
  320. assert.Nil(t, err)
  321. assert.Equal(t, `{"STRING":""}`, string(str))
  322. // number to string
  323. from = []byte(`{"STRING":100}`)
  324. err = jsonParser.Unmarshal(from, to)
  325. assert.Nil(t, err)
  326. assert.Equal(t, "100", to.STRING)
  327. str, err = jsonParser.Marshal(to)
  328. assert.Nil(t, err)
  329. assert.Equal(t, `{"STRING":"100"}`, string(str))
  330. // bool to string
  331. from = []byte(`{"STRING":true}`)
  332. err = jsonParser.Unmarshal(from, to)
  333. assert.Nil(t, err)
  334. assert.Equal(t, "true", to.STRING)
  335. str, err = jsonParser.Marshal(to)
  336. assert.Nil(t, err)
  337. assert.Equal(t, `{"STRING":"true"}`, string(str))
  338. // nil to string
  339. from = []byte(`{"STRING":null}`)
  340. err = jsonParser.Unmarshal(from, to)
  341. assert.Nil(t, err)
  342. assert.Equal(t, "", to.STRING)
  343. str, err = jsonParser.Marshal(to)
  344. assert.Nil(t, err)
  345. assert.Equal(t, `{"STRING":""}`, string(str))
  346. // other to string
  347. from = []byte(`{"STRING":{}}`)
  348. err = jsonParser.Unmarshal(from, to)
  349. assert.NotNil(t, err)
  350. assert.Equal(t, "struct { STRING string }.STRING: fuzzyStringDecoder: not number or string or bool, error found in #10 byte of ...|{\"STRING\":{}}|..., bigger context ...|{\"STRING\":{}}|...", err.Error())
  351. }
  352. func TestUnmarshal_bool(t *testing.T) {
  353. initJsonParserOnce()
  354. to := &struct {
  355. BOOL bool
  356. }{}
  357. // bool to bool
  358. from := []byte(`{"BOOL":true}`)
  359. err := jsonParser.Unmarshal(from, to)
  360. assert.Nil(t, err)
  361. assert.Equal(t, true, to.BOOL)
  362. str, err := jsonParser.Marshal(to)
  363. assert.Nil(t, err)
  364. assert.Equal(t, `{"BOOL":true}`, string(str))
  365. // number to bool
  366. from = []byte(`{"BOOL":100}`)
  367. err = jsonParser.Unmarshal(from, to)
  368. assert.Nil(t, err)
  369. assert.Equal(t, true, to.BOOL)
  370. str, err = jsonParser.Marshal(to)
  371. assert.Nil(t, err)
  372. assert.Equal(t, `{"BOOL":true}`, string(str))
  373. from = []byte(`{"BOOL":0}`)
  374. err = jsonParser.Unmarshal(from, to)
  375. assert.Nil(t, err)
  376. assert.Equal(t, false, to.BOOL)
  377. str, err = jsonParser.Marshal(to)
  378. assert.Nil(t, err)
  379. assert.Equal(t, `{"BOOL":false}`, string(str))
  380. // invalid number literal
  381. from = []byte(`{"BOOL": 1000000000000000000000000000000000000000}`)
  382. err = jsonParser.Unmarshal(from, to)
  383. assert.NotNil(t, err)
  384. assert.Equal(t, "struct { BOOL bool }.BOOL: fuzzyBoolDecoder: get value from json.number failed, error found in #10 byte of ...|0000000000}|..., bigger context ...|{\"BOOL\": 1000000000000000000000000000000000000000}|...", err.Error())
  385. // bool to string
  386. from = []byte(`{"BOOL":"true"}`)
  387. err = jsonParser.Unmarshal(from, to)
  388. assert.Nil(t, err)
  389. assert.Equal(t, true, to.BOOL)
  390. str, err = jsonParser.Marshal(to)
  391. assert.Nil(t, err)
  392. assert.Equal(t, `{"BOOL":true}`, string(str))
  393. from = []byte(`{"BOOL":"false"}`)
  394. err = jsonParser.Unmarshal(from, to)
  395. assert.Nil(t, err)
  396. assert.Equal(t, false, to.BOOL)
  397. str, err = jsonParser.Marshal(to)
  398. assert.Nil(t, err)
  399. assert.Equal(t, `{"BOOL":false}`, string(str))
  400. from = []byte(`{"BOOL":"other"}`)
  401. err = jsonParser.Unmarshal(from, to)
  402. assert.NotNil(t, err)
  403. assert.Equal(t, "struct { BOOL bool }.BOOL: fuzzyBoolDecoder: unsupported bool value: other, error found in #10 byte of ...|L\":\"other\"}|..., bigger context ...|{\"BOOL\":\"other\"}|...", err.Error())
  404. // nil to bool
  405. from = []byte(`{"BOOL":null}`)
  406. err = jsonParser.Unmarshal(from, to)
  407. assert.Nil(t, err)
  408. assert.Equal(t, false, to.BOOL)
  409. str, err = jsonParser.Marshal(to)
  410. assert.Nil(t, err)
  411. assert.Equal(t, `{"BOOL":false}`, string(str))
  412. // other to string
  413. from = []byte(`{"BOOL":{}}`)
  414. err = jsonParser.Unmarshal(from, to)
  415. assert.NotNil(t, err)
  416. assert.Equal(t, "struct { BOOL bool }.BOOL: fuzzyBoolDecoder: not number or string or nil, error found in #8 byte of ...|{\"BOOL\":{}}|..., bigger context ...|{\"BOOL\":{}}|...", err.Error())
  417. }
  418. func TestUnmarshal_array(t *testing.T) {
  419. initJsonParserOnce()
  420. to := &struct {
  421. Array []string
  422. }{}
  423. // bool to bool
  424. from := []byte(`{"Array":[]}`)
  425. err := jsonParser.Unmarshal(from, to)
  426. assert.Nil(t, err)
  427. assert.Equal(t, 0, len(to.Array))
  428. str, err := jsonParser.Marshal(to)
  429. assert.Nil(t, err)
  430. assert.Equal(t, `{"Array":[]}`, string(str))
  431. }
  432. func TestUnmarshal_float32(t *testing.T) {
  433. initJsonParserOnce()
  434. to := &struct {
  435. FLOAT32 float32
  436. }{}
  437. from := []byte(`{"FLOAT32":100}`)
  438. err := jsonParser.Unmarshal(from, to)
  439. assert.Nil(t, err)
  440. assert.Equal(t, float32(100), to.FLOAT32)
  441. str, err := jsonParser.Marshal(to)
  442. assert.Nil(t, err)
  443. assert.Equal(t, `{"FLOAT32":100}`, string(str))
  444. from = []byte(`{"FLOAT32":100.1}`)
  445. err = jsonParser.Unmarshal(from, to)
  446. assert.Nil(t, err)
  447. assert.Equal(t, float32(100.1), to.FLOAT32)
  448. str, err = jsonParser.Marshal(to)
  449. assert.Nil(t, err)
  450. assert.Equal(t, `{"FLOAT32":100.1}`, string(str))
  451. // string to float32
  452. from = []byte(`{"FLOAT32":"100.1"}`)
  453. err = jsonParser.Unmarshal(from, to)
  454. assert.Nil(t, err)
  455. assert.Equal(t, float32(100.1), to.FLOAT32)
  456. str, err = jsonParser.Marshal(to)
  457. assert.Nil(t, err)
  458. assert.Equal(t, `{"FLOAT32":100.1}`, string(str))
  459. from = []byte(`{"FLOAT32":""}`)
  460. err = jsonParser.Unmarshal(from, to)
  461. assert.Nil(t, err)
  462. assert.Equal(t, float32(0), to.FLOAT32)
  463. str, err = jsonParser.Marshal(to)
  464. assert.Nil(t, err)
  465. assert.Equal(t, `{"FLOAT32":0}`, string(str))
  466. // error branch
  467. from = []byte(`{"FLOAT32":"."}`)
  468. err = jsonParser.Unmarshal(from, to)
  469. assert.NotNil(t, err)
  470. assert.Equal(t, "struct { FLOAT32 float32 }.FLOAT32: readFloat32: leading dot is invalid, error found in #0 byte of ...|.|..., bigger context ...|.|...", err.Error())
  471. // bool to float32
  472. from = []byte(`{"FLOAT32":true}`)
  473. err = jsonParser.Unmarshal(from, to)
  474. assert.Nil(t, err)
  475. assert.Equal(t, float32(1), to.FLOAT32)
  476. str, err = jsonParser.Marshal(to)
  477. assert.Nil(t, err)
  478. assert.Equal(t, `{"FLOAT32":1}`, string(str))
  479. from = []byte(`{"FLOAT32":false}`)
  480. err = jsonParser.Unmarshal(from, to)
  481. assert.Nil(t, err)
  482. assert.Equal(t, float32(0), to.FLOAT32)
  483. str, err = jsonParser.Marshal(to)
  484. assert.Nil(t, err)
  485. assert.Equal(t, `{"FLOAT32":0}`, string(str))
  486. // nil to float32
  487. from = []byte(`{"FLOAT32":null}`)
  488. err = jsonParser.Unmarshal(from, to)
  489. assert.Nil(t, err)
  490. assert.Equal(t, float32(0), to.FLOAT32)
  491. str, err = jsonParser.Marshal(to)
  492. assert.Nil(t, err)
  493. assert.Equal(t, `{"FLOAT32":0}`, string(str))
  494. // others to float32
  495. from = []byte(`{"FLOAT32":{}}`)
  496. err = jsonParser.Unmarshal(from, to)
  497. assert.NotNil(t, err)
  498. assert.Equal(t, "struct { FLOAT32 float32 }.FLOAT32: nullableFuzzyFloat32Decoder: not number or string, error found in #10 byte of ...|\"FLOAT32\":{}}|..., bigger context ...|{\"FLOAT32\":{}}|...", err.Error())
  499. }
  500. func TestUnmarshal_float64(t *testing.T) {
  501. initJsonParserOnce()
  502. to := &struct {
  503. FLOAT64 float64
  504. }{}
  505. from := []byte(`{"FLOAT64":100}`)
  506. err := jsonParser.Unmarshal(from, to)
  507. assert.Nil(t, err)
  508. assert.Equal(t, float64(100), to.FLOAT64)
  509. str, err := jsonParser.Marshal(to)
  510. assert.Nil(t, err)
  511. assert.Equal(t, `{"FLOAT64":100}`, string(str))
  512. from = []byte(`{"FLOAT64":100.1}`)
  513. err = jsonParser.Unmarshal(from, to)
  514. assert.Nil(t, err)
  515. assert.Equal(t, float64(100.1), to.FLOAT64)
  516. str, err = jsonParser.Marshal(to)
  517. assert.Nil(t, err)
  518. assert.Equal(t, `{"FLOAT64":100.1}`, string(str))
  519. // string to float64
  520. from = []byte(`{"FLOAT64":"100.1"}`)
  521. err = jsonParser.Unmarshal(from, to)
  522. assert.Nil(t, err)
  523. assert.Equal(t, float64(100.1), to.FLOAT64)
  524. str, err = jsonParser.Marshal(to)
  525. assert.Nil(t, err)
  526. assert.Equal(t, `{"FLOAT64":100.1}`, string(str))
  527. from = []byte(`{"FLOAT64":""}`)
  528. err = jsonParser.Unmarshal(from, to)
  529. assert.Nil(t, err)
  530. assert.Equal(t, float64(0), to.FLOAT64)
  531. str, err = jsonParser.Marshal(to)
  532. assert.Nil(t, err)
  533. assert.Equal(t, `{"FLOAT64":0}`, string(str))
  534. // error branch
  535. from = []byte(`{"FLOAT64":"."}`)
  536. err = jsonParser.Unmarshal(from, to)
  537. assert.NotNil(t, err)
  538. assert.Equal(t, "struct { FLOAT64 float64 }.FLOAT64: readFloat64: leading dot is invalid, error found in #0 byte of ...|.|..., bigger context ...|.|...", err.Error())
  539. // bool to float64
  540. from = []byte(`{"FLOAT64":true}`)
  541. err = jsonParser.Unmarshal(from, to)
  542. assert.Nil(t, err)
  543. assert.Equal(t, float64(1), to.FLOAT64)
  544. str, err = jsonParser.Marshal(to)
  545. assert.Nil(t, err)
  546. assert.Equal(t, `{"FLOAT64":1}`, string(str))
  547. from = []byte(`{"FLOAT64":false}`)
  548. err = jsonParser.Unmarshal(from, to)
  549. assert.Nil(t, err)
  550. assert.Equal(t, float64(0), to.FLOAT64)
  551. str, err = jsonParser.Marshal(to)
  552. assert.Nil(t, err)
  553. assert.Equal(t, `{"FLOAT64":0}`, string(str))
  554. // nil to float64
  555. from = []byte(`{"FLOAT64":null}`)
  556. err = jsonParser.Unmarshal(from, to)
  557. assert.Nil(t, err)
  558. assert.Equal(t, float64(0), to.FLOAT64)
  559. str, err = jsonParser.Marshal(to)
  560. assert.Nil(t, err)
  561. assert.Equal(t, `{"FLOAT64":0}`, string(str))
  562. // others to float64
  563. from = []byte(`{"FLOAT64":{}}`)
  564. err = jsonParser.Unmarshal(from, to)
  565. assert.NotNil(t, err)
  566. assert.Equal(t, "struct { FLOAT64 float64 }.FLOAT64: nullableFuzzyFloat64Decoder: not number or string, error found in #10 byte of ...|\"FLOAT64\":{}}|..., bigger context ...|{\"FLOAT64\":{}}|...", err.Error())
  567. }