@@ -19,6 +19,8 @@ limitations under the License.
19
19
package json
20
20
21
21
import (
22
+ gojson "encoding/json"
23
+
22
24
"fmt"
23
25
"math"
24
26
"reflect"
@@ -278,42 +280,139 @@ func TestEvaluateTypes(t *testing.T) {
278
280
},
279
281
}
280
282
281
- for _ , tc := range testCases {
282
- inputJSON := fmt .Sprintf (`{"data":%s}` , tc .In )
283
- expectedJSON := fmt .Sprintf (`{"data":%s}` , tc .Out )
284
- m := map [string ]interface {}{}
285
- err := Unmarshal ([]byte (inputJSON ), & m )
286
- if tc .Err && err != nil {
287
- // Expected error
288
- continue
289
- }
290
- if err != nil {
291
- t .Errorf ("%s: error decoding: %v" , tc .In , err )
292
- continue
293
- }
294
- if tc .Err {
295
- t .Errorf ("%s: expected error, got none" , tc .In )
296
- continue
297
- }
298
- data , ok := m ["data" ]
299
- if ! ok {
300
- t .Errorf ("%s: decoded object missing data key: %#v" , tc .In , m )
301
- continue
302
- }
303
- if ! reflect .DeepEqual (tc .Data , data ) {
304
- t .Errorf ("%s: expected\n \t %#v (%v), got\n \t %#v (%v)" , tc .In , tc .Data , reflect .TypeOf (tc .Data ), data , reflect .TypeOf (data ))
305
- continue
283
+ for i , tc := range testCases {
284
+ t .Run (fmt .Sprintf ("%d_map" , i ), func (t * testing.T ) {
285
+ // decode the input as a map item
286
+ inputJSON := fmt .Sprintf (`{"data":%s}` , tc .In )
287
+ expectedJSON := fmt .Sprintf (`{"data":%s}` , tc .Out )
288
+ m := map [string ]interface {}{}
289
+ err := Unmarshal ([]byte (inputJSON ), & m )
290
+ if tc .Err && err != nil {
291
+ // Expected error
292
+ return
293
+ }
294
+ if err != nil {
295
+ t .Fatalf ("%s: error decoding: %v" , tc .In , err )
296
+ }
297
+ if tc .Err {
298
+ t .Fatalf ("%s: expected error, got none" , tc .In )
299
+ }
300
+ data , ok := m ["data" ]
301
+ if ! ok {
302
+ t .Fatalf ("%s: decoded object missing data key: %#v" , tc .In , m )
303
+ }
304
+ if ! reflect .DeepEqual (tc .Data , data ) {
305
+ t .Fatalf ("%s: expected\n \t %#v (%v), got\n \t %#v (%v)" , tc .In , tc .Data , reflect .TypeOf (tc .Data ), data , reflect .TypeOf (data ))
306
+ }
307
+
308
+ outputJSON , err := Marshal (m )
309
+ if err != nil {
310
+ t .Fatalf ("%s: error encoding: %v" , tc .In , err )
311
+ }
312
+
313
+ if expectedJSON != string (outputJSON ) {
314
+ t .Fatalf ("%s: expected\n \t %s, got\n \t %s" , tc .In , expectedJSON , string (outputJSON ))
315
+ }
316
+ })
317
+
318
+ t .Run (fmt .Sprintf ("%d_slice" , i ), func (t * testing.T ) {
319
+ // decode the input as an array item
320
+ inputJSON := fmt .Sprintf (`[0,%s]` , tc .In )
321
+ expectedJSON := fmt .Sprintf (`[0,%s]` , tc .Out )
322
+ m := []interface {}{}
323
+ err := Unmarshal ([]byte (inputJSON ), & m )
324
+ if tc .Err && err != nil {
325
+ // Expected error
326
+ return
327
+ }
328
+ if err != nil {
329
+ t .Fatalf ("%s: error decoding: %v" , tc .In , err )
330
+ }
331
+ if tc .Err {
332
+ t .Fatalf ("%s: expected error, got none" , tc .In )
333
+ }
334
+ if len (m ) != 2 {
335
+ t .Fatalf ("%s: decoded object wasn't the right length: %#v" , tc .In , m )
336
+ }
337
+ data := m [1 ]
338
+ if ! reflect .DeepEqual (tc .Data , data ) {
339
+ t .Fatalf ("%s: expected\n \t %#v (%v), got\n \t %#v (%v)" , tc .In , tc .Data , reflect .TypeOf (tc .Data ), data , reflect .TypeOf (data ))
340
+ }
341
+
342
+ outputJSON , err := Marshal (m )
343
+ if err != nil {
344
+ t .Fatalf ("%s: error encoding: %v" , tc .In , err )
345
+ }
346
+
347
+ if expectedJSON != string (outputJSON ) {
348
+ t .Fatalf ("%s: expected\n \t %s, got\n \t %s" , tc .In , expectedJSON , string (outputJSON ))
349
+ }
350
+ })
351
+
352
+ t .Run (fmt .Sprintf ("%d_raw" , i ), func (t * testing.T ) {
353
+ // decode the input as a standalone object
354
+ inputJSON := fmt .Sprintf (`%s` , tc .In )
355
+ expectedJSON := fmt .Sprintf (`%s` , tc .Out )
356
+ var m interface {}
357
+ err := Unmarshal ([]byte (inputJSON ), & m )
358
+ if tc .Err && err != nil {
359
+ // Expected error
360
+ return
361
+ }
362
+ if err != nil {
363
+ t .Fatalf ("%s: error decoding: %v" , tc .In , err )
364
+ }
365
+ if tc .Err {
366
+ t .Fatalf ("%s: expected error, got none" , tc .In )
367
+ }
368
+ data := m
369
+ if ! reflect .DeepEqual (tc .Data , data ) {
370
+ t .Fatalf ("%s: expected\n \t %#v (%v), got\n \t %#v (%v)" , tc .In , tc .Data , reflect .TypeOf (tc .Data ), data , reflect .TypeOf (data ))
371
+ }
372
+
373
+ outputJSON , err := Marshal (m )
374
+ if err != nil {
375
+ t .Fatalf ("%s: error encoding: %v" , tc .In , err )
376
+ }
377
+
378
+ if expectedJSON != string (outputJSON ) {
379
+ t .Fatalf ("%s: expected\n \t %s, got\n \t %s" , tc .In , expectedJSON , string (outputJSON ))
380
+ }
381
+ })
382
+ }
383
+ }
384
+
385
+ func TestUnmarshalNil (t * testing.T ) {
386
+ {
387
+ var v * interface {}
388
+ err := Unmarshal ([]byte (`0` ), v )
389
+ goerr := gojson .Unmarshal ([]byte (`0` ), v )
390
+ if err == nil || goerr == nil || err .Error () != goerr .Error () {
391
+ t .Fatalf ("expected error matching stdlib, got %v, %v" , err , goerr )
392
+ } else {
393
+ t .Log (err )
306
394
}
395
+ }
307
396
308
- outputJSON , err := Marshal (m )
309
- if err != nil {
310
- t .Errorf ("%s: error encoding: %v" , tc .In , err )
311
- continue
397
+ {
398
+ var v * []interface {}
399
+ err := Unmarshal ([]byte (`[]` ), v )
400
+ goerr := gojson .Unmarshal ([]byte (`[]` ), v )
401
+ if err == nil || goerr == nil || err .Error () != goerr .Error () {
402
+ t .Fatalf ("expected error matching stdlib, got %v, %v" , err , goerr )
403
+ } else {
404
+ t .Log (err )
312
405
}
406
+ }
313
407
314
- if expectedJSON != string (outputJSON ) {
315
- t .Errorf ("%s: expected\n \t %s, got\n \t %s" , tc .In , expectedJSON , string (outputJSON ))
316
- continue
408
+ {
409
+ var v * map [string ]interface {}
410
+ err := Unmarshal ([]byte (`{}` ), v )
411
+ goerr := gojson .Unmarshal ([]byte (`{}` ), v )
412
+ if err == nil || goerr == nil || err .Error () != goerr .Error () {
413
+ t .Fatalf ("expected error matching stdlib, got %v, %v" , err , goerr )
414
+ } else {
415
+ t .Log (err )
317
416
}
318
417
}
319
418
}
0 commit comments