110 lines
1.5 KiB
Go
110 lines
1.5 KiB
Go
|
package jsonutil_test
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/aws/aws-sdk-go/private/protocol/json/jsonutil"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
func S(s string) *string {
|
||
|
return &s
|
||
|
}
|
||
|
|
||
|
func D(s int64) *int64 {
|
||
|
return &s
|
||
|
}
|
||
|
|
||
|
func F(s float64) *float64 {
|
||
|
return &s
|
||
|
}
|
||
|
|
||
|
func T(s time.Time) *time.Time {
|
||
|
return &s
|
||
|
}
|
||
|
|
||
|
type J struct {
|
||
|
S *string
|
||
|
SS []string
|
||
|
D *int64
|
||
|
F *float64
|
||
|
T *time.Time
|
||
|
}
|
||
|
|
||
|
var zero = 0.0
|
||
|
|
||
|
var jsonTests = []struct {
|
||
|
in interface{}
|
||
|
out string
|
||
|
err string
|
||
|
}{
|
||
|
{
|
||
|
J{},
|
||
|
`{}`,
|
||
|
``,
|
||
|
},
|
||
|
{
|
||
|
J{
|
||
|
S: S("str"),
|
||
|
SS: []string{"A", "B", "C"},
|
||
|
D: D(123),
|
||
|
F: F(4.56),
|
||
|
T: T(time.Unix(987, 0)),
|
||
|
},
|
||
|
`{"S":"str","SS":["A","B","C"],"D":123,"F":4.56,"T":987}`,
|
||
|
``,
|
||
|
},
|
||
|
{
|
||
|
J{
|
||
|
S: S(`"''"`),
|
||
|
},
|
||
|
`{"S":"\"''\""}`,
|
||
|
``,
|
||
|
},
|
||
|
{
|
||
|
J{
|
||
|
S: S("\x00føø\u00FF\n\\\"\r\t\b\f"),
|
||
|
},
|
||
|
`{"S":"\u0000føøÿ\n\\\"\r\t\b\f"}`,
|
||
|
``,
|
||
|
},
|
||
|
{
|
||
|
J{
|
||
|
F: F(4.56 / zero),
|
||
|
},
|
||
|
"",
|
||
|
`json: unsupported value: +Inf`,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
func TestBuildJSON(t *testing.T) {
|
||
|
for _, test := range jsonTests {
|
||
|
out, err := jsonutil.BuildJSON(test.in)
|
||
|
if test.err != "" {
|
||
|
assert.Error(t, err)
|
||
|
assert.Contains(t, err.Error(), test.err)
|
||
|
} else {
|
||
|
assert.NoError(t, err)
|
||
|
assert.Equal(t, string(out), test.out)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkBuildJSON(b *testing.B) {
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
for _, test := range jsonTests {
|
||
|
jsonutil.BuildJSON(test.in)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkStdlibJSON(b *testing.B) {
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
for _, test := range jsonTests {
|
||
|
json.Marshal(test.in)
|
||
|
}
|
||
|
}
|
||
|
}
|