github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/json/jsonutil/unmarshal_test.go (about) 1 //go:build go1.7 2 // +build go1.7 3 4 package jsonutil_test 5 6 import ( 7 "bytes" 8 "reflect" 9 "testing" 10 "time" 11 12 "github.com/aavshr/aws-sdk-go/aws" 13 "github.com/aavshr/aws-sdk-go/private/protocol/json/jsonutil" 14 ) 15 16 func TestUnmarshalJSON_JSONNumber(t *testing.T) { 17 type input struct { 18 TimeField *time.Time `locationName:"timeField"` 19 IntField *int64 `locationName:"intField"` 20 FloatField *float64 `locationName:"floatField"` 21 } 22 23 cases := map[string]struct { 24 JSON string 25 Value input 26 Expected input 27 }{ 28 "seconds precision": { 29 JSON: `{"timeField":1597094942}`, 30 Expected: input{ 31 TimeField: func() *time.Time { 32 dt := time.Date(2020, 8, 10, 21, 29, 02, 00, time.UTC) 33 return &dt 34 }(), 35 }, 36 }, 37 "exact milliseconds precision": { 38 JSON: `{"timeField":1597094942.123}`, 39 Expected: input{ 40 TimeField: func() *time.Time { 41 dt := time.Date(2020, 8, 10, 21, 29, 02, int(123*time.Millisecond), time.UTC) 42 return &dt 43 }(), 44 }, 45 }, 46 "microsecond precision truncated": { 47 JSON: `{"timeField":1597094942.1235}`, 48 Expected: input{ 49 TimeField: func() *time.Time { 50 dt := time.Date(2020, 8, 10, 21, 29, 02, int(123*time.Millisecond), time.UTC) 51 return &dt 52 }(), 53 }, 54 }, 55 "nanosecond precision truncated": { 56 JSON: `{"timeField":1597094942.123456789}`, 57 Expected: input{ 58 TimeField: func() *time.Time { 59 dt := time.Date(2020, 8, 10, 21, 29, 02, int(123*time.Millisecond), time.UTC) 60 return &dt 61 }(), 62 }, 63 }, 64 "milliseconds precision as small exponent": { 65 JSON: `{"timeField":1.597094942123e9}`, 66 Expected: input{ 67 TimeField: func() *time.Time { 68 dt := time.Date(2020, 8, 10, 21, 29, 02, int(123*time.Millisecond), time.UTC) 69 return &dt 70 }(), 71 }, 72 }, 73 "milliseconds precision as large exponent": { 74 JSON: `{"timeField":1.597094942123E9}`, 75 Expected: input{ 76 TimeField: func() *time.Time { 77 dt := time.Date(2020, 8, 10, 21, 29, 02, int(123*time.Millisecond), time.UTC) 78 return &dt 79 }(), 80 }, 81 }, 82 "milliseconds precision as exponent with sign": { 83 JSON: `{"timeField":1.597094942123e+9}`, 84 Expected: input{ 85 TimeField: func() *time.Time { 86 dt := time.Date(2020, 8, 10, 21, 29, 02, int(123*time.Millisecond), time.UTC) 87 return &dt 88 }(), 89 }, 90 }, 91 "integer field": { 92 JSON: `{"intField":123456789}`, 93 Expected: input{ 94 IntField: aws.Int64(123456789), 95 }, 96 }, 97 "integer field truncated": { 98 JSON: `{"intField":123456789.123}`, 99 Expected: input{ 100 IntField: aws.Int64(123456789), 101 }, 102 }, 103 "float64 field": { 104 JSON: `{"floatField":123456789.123}`, 105 Expected: input{ 106 FloatField: aws.Float64(123456789.123), 107 }, 108 }, 109 } 110 111 for name, tt := range cases { 112 t.Run(name, func(t *testing.T) { 113 err := jsonutil.UnmarshalJSON(&tt.Value, bytes.NewReader([]byte(tt.JSON))) 114 if err != nil { 115 t.Errorf("expect no error, got %v", err) 116 } 117 if e, a := tt.Expected, tt.Value; !reflect.DeepEqual(e, a) { 118 t.Errorf("expect %v, got %v", e, a) 119 } 120 }) 121 } 122 }