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