@@ -165,3 +165,100 @@ func TestStrictErrors(t *testing.T) {
165
165
})
166
166
}
167
167
}
168
+
169
+ func TestCaseSensitive (t * testing.T ) {
170
+ type Embedded1 struct {
171
+ C int `json:"c"`
172
+ D int
173
+ }
174
+ type Embedded2 struct {
175
+ E int `json:"e"`
176
+ F int
177
+ }
178
+
179
+ type Obj struct {
180
+ A int `json:"a"`
181
+ B int
182
+ Embedded1 `json:",inline"`
183
+ Embedded2
184
+ }
185
+
186
+ testcases := []struct {
187
+ name string
188
+ in string
189
+ to interface {}
190
+ expect interface {}
191
+ }{
192
+ {
193
+ name : "tagged" ,
194
+ in : `{"A":"1","A":2,"a":3,"A":4,"A":"5"}` ,
195
+ to : & Obj {},
196
+ expect : & Obj {A : 3 },
197
+ },
198
+ {
199
+ name : "untagged" ,
200
+ in : `{"b":"1","b":2,"B":3,"b":4,"b":"5"}` ,
201
+ to : & Obj {},
202
+ expect : & Obj {B : 3 },
203
+ },
204
+ {
205
+ name : "inline embedded tagged subfield" ,
206
+ in : `{"C":"1","C":2,"c":3,"C":4,"C":"5"}` ,
207
+ to : & Obj {},
208
+ expect : & Obj {Embedded1 : Embedded1 {C : 3 }},
209
+ },
210
+ {
211
+ name : "inline embedded untagged subfield" ,
212
+ in : `{"d":"1","d":2,"D":3,"d":4,"d":"5"}` ,
213
+ to : & Obj {},
214
+ expect : & Obj {Embedded1 : Embedded1 {D : 3 }},
215
+ },
216
+ {
217
+ name : "inline embedded field name" ,
218
+ in : `{"Embedded1":{"c":3}}` ,
219
+ to : & Obj {},
220
+ expect : & Obj {}, // inlined embedded is not addressable by field name
221
+ },
222
+ {
223
+ name : "inline embedded empty name" ,
224
+ in : `{"":{"c":3}}` ,
225
+ to : & Obj {},
226
+ expect : & Obj {}, // inlined embedded is not addressable by empty json field name
227
+ },
228
+ {
229
+ name : "untagged embedded tagged subfield" ,
230
+ in : `{"E":"1","E":2,"e":3,"E":4,"E":"5"}` ,
231
+ to : & Obj {},
232
+ expect : & Obj {Embedded2 : Embedded2 {E : 3 }},
233
+ },
234
+ {
235
+ name : "untagged embedded untagged subfield" ,
236
+ in : `{"f":"1","f":2,"F":3,"f":4,"f":"5"}` ,
237
+ to : & Obj {},
238
+ expect : & Obj {Embedded2 : Embedded2 {F : 3 }},
239
+ },
240
+ {
241
+ name : "untagged embedded field name" ,
242
+ in : `{"Embedded2":{"e":3}}` ,
243
+ to : & Obj {},
244
+ expect : & Obj {}, // untagged embedded is not addressable by field name
245
+ },
246
+ {
247
+ name : "untagged embedded empty name" ,
248
+ in : `{"":{"e":3}}` ,
249
+ to : & Obj {},
250
+ expect : & Obj {}, // untagged embedded is not addressable by empty json field name
251
+ },
252
+ }
253
+
254
+ for _ , tc := range testcases {
255
+ t .Run (tc .name , func (t * testing.T ) {
256
+ if err := Unmarshal ([]byte (tc .in ), & tc .to , CaseSensitive ); err != nil {
257
+ t .Fatal (err )
258
+ }
259
+ if ! reflect .DeepEqual (tc .expect , tc .to ) {
260
+ t .Fatalf ("expected\n %#v\n got\n %#v" , tc .expect , tc .to )
261
+ }
262
+ })
263
+ }
264
+ }
0 commit comments