@@ -136,21 +136,85 @@ func TestEncodeRenamedByteSlice(t *testing.T) {
136
136
}
137
137
}
138
138
139
- var unsupportedValues = []any {
140
- math .NaN (),
141
- math .Inf (- 1 ),
142
- math .Inf (1 ),
139
+ type SamePointerNoCycle struct {
140
+ Ptr1 , Ptr2 * SamePointerNoCycle
141
+ }
142
+
143
+ var samePointerNoCycle = & SamePointerNoCycle {}
144
+
145
+ type PointerCycle struct {
146
+ Ptr * PointerCycle
147
+ }
148
+
149
+ var pointerCycle = & PointerCycle {}
150
+
151
+ type PointerCycleIndirect struct {
152
+ Ptrs []any
153
+ }
154
+
155
+ type RecursiveSlice []RecursiveSlice
156
+
157
+ var (
158
+ pointerCycleIndirect = & PointerCycleIndirect {}
159
+ mapCycle = make (map [string ]any )
160
+ sliceCycle = []any {nil }
161
+ sliceNoCycle = []any {nil , nil }
162
+ recursiveSliceCycle = []RecursiveSlice {nil }
163
+ )
164
+
165
+ func init () {
166
+ ptr := & SamePointerNoCycle {}
167
+ samePointerNoCycle .Ptr1 = ptr
168
+ samePointerNoCycle .Ptr2 = ptr
169
+
170
+ pointerCycle .Ptr = pointerCycle
171
+ pointerCycleIndirect .Ptrs = []any {pointerCycleIndirect }
172
+
173
+ mapCycle ["x" ] = mapCycle
174
+ sliceCycle [0 ] = sliceCycle
175
+ sliceNoCycle [1 ] = sliceNoCycle [:1 ]
176
+ for i := startDetectingCyclesAfter ; i > 0 ; i -- {
177
+ sliceNoCycle = []any {sliceNoCycle }
178
+ }
179
+ recursiveSliceCycle [0 ] = recursiveSliceCycle
180
+ }
181
+
182
+ func TestSamePointerNoCycle (t * testing.T ) {
183
+ if _ , err := Marshal (samePointerNoCycle ); err != nil {
184
+ t .Fatalf ("Marshal error: %v" , err )
185
+ }
186
+ }
187
+
188
+ func TestSliceNoCycle (t * testing.T ) {
189
+ if _ , err := Marshal (sliceNoCycle ); err != nil {
190
+ t .Fatalf ("Marshal error: %v" , err )
191
+ }
143
192
}
144
193
145
194
func TestUnsupportedValues (t * testing.T ) {
146
- for _ , v := range unsupportedValues {
147
- if _ , err := Marshal (v ); err != nil {
148
- if _ , ok := err .(* UnsupportedValueError ); ! ok {
149
- t .Errorf ("for %v, got %T want UnsupportedValueError" , v , err )
195
+ tests := []struct {
196
+ CaseName
197
+ in any
198
+ }{
199
+ {Name ("" ), math .NaN ()},
200
+ {Name ("" ), math .Inf (- 1 )},
201
+ {Name ("" ), math .Inf (1 )},
202
+ {Name ("" ), pointerCycle },
203
+ {Name ("" ), pointerCycleIndirect },
204
+ {Name ("" ), mapCycle },
205
+ {Name ("" ), sliceCycle },
206
+ {Name ("" ), recursiveSliceCycle },
207
+ }
208
+ for _ , tt := range tests {
209
+ t .Run (tt .Name , func (t * testing.T ) {
210
+ if _ , err := Marshal (tt .in ); err != nil {
211
+ if _ , ok := err .(* UnsupportedValueError ); ! ok {
212
+ t .Errorf ("%s: Marshal error:\n \t got: %T\n \t want: %T" , tt .Where , err , new (UnsupportedValueError ))
213
+ }
214
+ } else {
215
+ t .Errorf ("%s: Marshal error: got nil, want non-nil" , tt .Where )
150
216
}
151
- } else {
152
- t .Errorf ("for %v, expected error" , v )
153
- }
217
+ })
154
218
}
155
219
}
156
220
0 commit comments