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  }