-
Notifications
You must be signed in to change notification settings - Fork 49
/
encoder_test.go
93 lines (83 loc) · 2 KB
/
encoder_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package json_test
import (
"github.com/aws/smithy-go/document"
"github.com/aws/smithy-go/document/internal/serde"
"github.com/aws/smithy-go/document/json"
"github.com/google/go-cmp/cmp"
"testing"
"time"
)
func TestEncoder_Encode(t *testing.T) {
t.Run("Object", func(t *testing.T) {
for name, tt := range sharedObjectTests {
t.Run(name, func(t *testing.T) {
testEncode(t, tt)
})
}
})
t.Run("Array", func(t *testing.T) {
for name, tt := range sharedArrayTestCases {
t.Run(name, func(t *testing.T) {
testEncode(t, tt)
})
}
})
t.Run("Number", func(t *testing.T) {
for name, tt := range sharedNumberTestCases {
t.Run(name, func(t *testing.T) {
testEncode(t, tt)
})
}
})
t.Run("String", func(t *testing.T) {
for name, tt := range sharedStringTests {
t.Run(name, func(t *testing.T) {
testEncode(t, tt)
})
}
})
}
func TestNewEncoderUnsupportedTypes(t *testing.T) {
type customTime time.Time
type noSerde = document.NoSerde
type NestedThing struct {
SomeThing string
noSerde
}
type Thing struct {
OtherThing string
NestedThing NestedThing
}
cases := []interface{}{
time.Now().UTC(),
customTime(time.Now().UTC()),
Thing{OtherThing: "foo", NestedThing: NestedThing{SomeThing: "bar"}},
}
encoder := json.NewEncoder()
for _, tt := range cases {
_, err := encoder.Encode(tt)
if err == nil {
t.Errorf("expect error, got nil")
}
}
}
func testEncode(t *testing.T, tt testCase) {
t.Helper()
e := json.NewEncoder(func(options *json.EncoderOptions) {
*options = tt.encoderOptions
})
encodeBytes, err := e.Encode(tt.actual)
if (err != nil) != tt.wantErr {
t.Errorf("Encode() error = %v, wantErr %v", err, tt.wantErr)
}
got := MustJSONUnmarshal(encodeBytes, !tt.disableJSONNumber)
if diff := cmp.Diff(
serde.PtrToValue(MustJSONUnmarshal(tt.json, !tt.disableJSONNumber)),
serde.PtrToValue(got),
cmp.AllowUnexported(StructA{}, StructB{}),
cmp.Comparer(cmpBigFloat()),
cmp.Comparer(cmpBigInt()),
); len(diff) > 0 {
t.Error(diff)
}
}