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