|  | package jsonutils | 
|  |  | 
|  | import ( | 
|  | "encoding/json" | 
|  | "testing" | 
|  | "time" | 
|  |  | 
|  | "github.com/stretchr/testify/assert" | 
|  | "github.com/stretchr/testify/require" | 
|  |  | 
|  | "go.skia.org/infra/go/testutils" | 
|  | ) | 
|  |  | 
|  | func TestNumber(t *testing.T) { | 
|  | type testCase struct { | 
|  | in  string | 
|  | out int64 | 
|  | err string | 
|  | } | 
|  | cases := []testCase{ | 
|  | { | 
|  | in:  "abc", | 
|  | out: 0, | 
|  | err: "invalid character 'a' looking for beginning of value", | 
|  | }, | 
|  | { | 
|  | in:  "0", | 
|  | out: 0, | 
|  | err: "", | 
|  | }, | 
|  | { | 
|  | in:  "\"0\"", | 
|  | out: 0, | 
|  | err: "", | 
|  | }, | 
|  | { | 
|  | in:  "9.345", | 
|  | out: 0, | 
|  | err: "parsing \"9.345\": invalid syntax", | 
|  | }, | 
|  | { | 
|  | in:  "2147483647", | 
|  | out: 2147483647, | 
|  | err: "", | 
|  | }, | 
|  | { | 
|  | in:  "2147483648", | 
|  | out: 2147483648, | 
|  | err: "", | 
|  | }, | 
|  | { | 
|  | in:  "9223372036854775807", | 
|  | out: 9223372036854775807, | 
|  | err: "", | 
|  | }, | 
|  | { | 
|  | in:  "\"9223372036854775807\"", | 
|  | out: 9223372036854775807, | 
|  | err: "", | 
|  | }, | 
|  | { | 
|  | in:  "9223372036854775808", | 
|  | out: 0, | 
|  | err: "parsing \"9223372036854775808\": value out of range", | 
|  | }, | 
|  | } | 
|  | for _, tc := range cases { | 
|  | var got Number | 
|  | err := json.Unmarshal([]byte(tc.in), &got) | 
|  | if tc.err != "" { | 
|  | require.Error(t, err) | 
|  | require.Contains(t, err.Error(), tc.err) | 
|  | } else { | 
|  | require.NoError(t, err) | 
|  | require.Equal(t, tc.out, int64(got)) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestTime(t *testing.T) { | 
|  | type testCase struct { | 
|  | in  time.Time | 
|  | out string | 
|  | } | 
|  | cases := []testCase{ | 
|  | { | 
|  | in:  time.Unix(0, 0), | 
|  | out: "0", | 
|  | }, | 
|  | { | 
|  | in:  time.Unix(1475508449, 0), | 
|  | out: "1475508449000000", | 
|  | }, | 
|  | } | 
|  | for _, tc := range cases { | 
|  | inp := Time(tc.in) | 
|  | b, err := json.Marshal(&inp) | 
|  | require.NoError(t, err) | 
|  | require.Equal(t, []byte(tc.out), b) | 
|  | var got Time | 
|  | err = json.Unmarshal(b, &got) | 
|  | require.NoError(t, err) | 
|  | require.Equal(t, tc.in.UTC(), time.Time(got).UTC()) | 
|  | } | 
|  | } | 
|  | func TestMarshalStringMap_NonEmptyMap_MatchesBuiltInImpl(t *testing.T) { | 
|  | input := map[string]string{} | 
|  | testutils.ReadJSONFile(t, "mediumparams.json", &input) | 
|  | require.Len(t, input, 50) | 
|  | actual := MarshalStringMap(input) | 
|  | expected, err := json.Marshal(input) | 
|  | require.NoError(t, err) | 
|  | assert.Equal(t, expected, actual, "%s != %s", string(expected), string(actual)) | 
|  |  | 
|  | input2 := map[string]string{} | 
|  | testutils.ReadJSONFile(t, "smallparams.json", &input2) | 
|  | require.Len(t, input2, 10) | 
|  | actual = MarshalStringMap(input2) | 
|  | expected, err = json.Marshal(input2) | 
|  | require.NoError(t, err) | 
|  | assert.Equal(t, expected, actual, "%s != %s", string(expected), string(actual)) | 
|  | } | 
|  |  | 
|  | func TestMarshalStringMap_EmptyMap_MatchesBuiltInImpl(t *testing.T) { | 
|  | input := map[string]string{} | 
|  | actual := MarshalStringMap(input) | 
|  | expected, err := json.Marshal(input) | 
|  | require.NoError(t, err) | 
|  | assert.Equal(t, expected, actual, "%s != %s", string(expected), string(actual)) | 
|  | } | 
|  |  | 
|  | func TestMarshalStringMap_NilMap_MatchesBuiltInImpl(t *testing.T) { | 
|  | var input map[string]string | 
|  | actual := MarshalStringMap(input) | 
|  | expected, err := json.Marshal(input) | 
|  | require.NoError(t, err) | 
|  | assert.Equal(t, expected, actual, "%s != %s", string(expected), string(actual)) | 
|  | } | 
|  |  | 
|  | func BenchmarkMarshalStringMap_10Items(b *testing.B) { | 
|  | input := map[string]string{} | 
|  | testutils.ReadJSONFile(b, "smallparams.json", &input) | 
|  | b.ResetTimer() | 
|  | for i := 0; i < b.N; i++ { | 
|  | b := MarshalStringMap(input) | 
|  | if b[0] == 'N' { | 
|  | panic("this is to keep the call from being optimized out") | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkMarshalStringMap_50Items(b *testing.B) { | 
|  | input := map[string]string{} | 
|  | testutils.ReadJSONFile(b, "mediumparams.json", &input) | 
|  | b.ResetTimer() | 
|  | for i := 0; i < b.N; i++ { | 
|  | b := MarshalStringMap(input) | 
|  | if b[0] == 'N' { | 
|  | panic("this is to keep the call from being optimized out") | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkBuiltInJSONMarshal_10Items(b *testing.B) { | 
|  | input := map[string]string{} | 
|  | testutils.ReadJSONFile(b, "smallparams.json", &input) | 
|  | b.ResetTimer() | 
|  | for i := 0; i < b.N; i++ { | 
|  | b, _ := json.Marshal(input) | 
|  | if b[0] == 'N' { | 
|  | panic("this is to keep the call from being optimized out") | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func BenchmarkBuiltInJSONMarshal_50Items(b *testing.B) { | 
|  | input := map[string]string{} | 
|  | testutils.ReadJSONFile(b, "mediumparams.json", &input) | 
|  | b.ResetTimer() | 
|  | for i := 0; i < b.N; i++ { | 
|  | b, _ := json.Marshal(input) | 
|  | if b[0] == 'N' { | 
|  | panic("this is to keep the call from being optimized out") | 
|  | } | 
|  | } | 
|  | } |