blob: 0a4c755723b5b5b296af87913b26f8fbd28ebc49 [file] [log] [blame]
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")
}
}
}