| 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") |
| } |
| } |
| } |