Skip to content

Commit 4aa949a

Browse files
committed
test: add suggested cases from #668
1 parent ae23f7a commit 4aa949a

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed

yaml_test.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,160 @@ c:
352352
checkJSONRawValue(t, m4["b"], "asdf")
353353
checkJSONRawValue(t, m4["c"], map[string]string{"foo": "bar"})
354354
}
355+
356+
type rawYAMLWrapper struct {
357+
StaticField string `json:"staticField" yaml:"staticField"`
358+
DynamicField yaml.RawMessage `json:"dynamicField" yaml:"dynamicField"`
359+
}
360+
361+
type rawJSONWrapper struct {
362+
StaticField string `json:"staticField" yaml:"staticField"`
363+
DynamicField json.RawMessage `json:"dynamicField" yaml:"dynamicField"`
364+
}
365+
366+
func (w rawJSONWrapper) Equals(o *rawJSONWrapper) bool {
367+
if w.StaticField != o.StaticField {
368+
return false
369+
}
370+
return reflect.DeepEqual(w.DynamicField, o.DynamicField)
371+
}
372+
373+
type dynamicField struct {
374+
A int `json:"a" yaml:"a"`
375+
B string `json:"b" yaml:"b"`
376+
C map[string]string `json:"c" yaml:"c"`
377+
}
378+
379+
func (t dynamicField) Equals(o *dynamicField) bool {
380+
if t.A != o.A {
381+
return false
382+
}
383+
if t.B != o.B {
384+
return false
385+
}
386+
if len(t.C) != len(o.C) {
387+
return false
388+
}
389+
for k, v := range t.C {
390+
ov, exists := o.C[k]
391+
if !exists {
392+
return false
393+
}
394+
if v != ov {
395+
return false
396+
}
397+
}
398+
return true
399+
}
400+
401+
func TestRawMessageJSONCompatibility(t *testing.T) {
402+
rawData := []byte(`staticField: value
403+
dynamicField:
404+
a: 1
405+
b: abcd
406+
c:
407+
foo: bar
408+
something: else
409+
`)
410+
411+
expectedDynamicFieldValue := &dynamicField{
412+
A: 1,
413+
B: "abcd",
414+
C: map[string]string{
415+
"foo": "bar",
416+
"something": "else",
417+
},
418+
}
419+
420+
t.Run("UseJSONUnmarshaler and json.RawMessage", func(t *testing.T) {
421+
var wrapper rawJSONWrapper
422+
if err := yaml.UnmarshalWithOptions(rawData, &wrapper, yaml.UseJSONUnmarshaler()); err != nil {
423+
t.Fatal(err)
424+
}
425+
if wrapper.StaticField != "value" {
426+
t.Fatalf("unexpected wrapper static field value: %s", wrapper.StaticField)
427+
}
428+
var dynamicFieldValue dynamicField
429+
if err := yaml.Unmarshal(wrapper.DynamicField, &dynamicFieldValue); err != nil {
430+
t.Fatal(err)
431+
}
432+
if !dynamicFieldValue.Equals(expectedDynamicFieldValue) {
433+
t.Fatalf("unexpected dynamic field value: %v", dynamicFieldValue)
434+
}
435+
})
436+
437+
t.Run("UseJSONUnmarshaler and yaml.RawMessage", func(t *testing.T) {
438+
var wrapper rawYAMLWrapper
439+
if err := yaml.UnmarshalWithOptions(rawData, &wrapper, yaml.UseJSONUnmarshaler()); err != nil {
440+
t.Fatal(err)
441+
}
442+
if wrapper.StaticField != "value" {
443+
t.Fatalf("unexpected wrapper static field value: %s", wrapper.StaticField)
444+
}
445+
var dynamicFieldValue dynamicField
446+
if err := yaml.Unmarshal(wrapper.DynamicField, &dynamicFieldValue); err != nil {
447+
t.Fatal(err)
448+
}
449+
if !dynamicFieldValue.Equals(expectedDynamicFieldValue) {
450+
t.Fatalf("unexpected dynamic field value: %v", dynamicFieldValue)
451+
}
452+
})
453+
454+
t.Run("UseJSONMarshaler and json.RawMessage", func(t *testing.T) {
455+
dynamicFieldBytes, err := yaml.Marshal(expectedDynamicFieldValue)
456+
if err != nil {
457+
t.Fatal(err)
458+
}
459+
wrapper := rawJSONWrapper{
460+
StaticField: "value",
461+
DynamicField: json.RawMessage(dynamicFieldBytes),
462+
}
463+
wrapperBytes, err := yaml.MarshalWithOptions(&wrapper, yaml.UseJSONMarshaler())
464+
if err != nil {
465+
t.Fatal(err)
466+
}
467+
var unmarshaledWrapper rawJSONWrapper
468+
if err := yaml.UnmarshalWithOptions(wrapperBytes, &unmarshaledWrapper, yaml.UseJSONUnmarshaler()); err != nil {
469+
t.Fatal(err)
470+
}
471+
if unmarshaledWrapper.StaticField != wrapper.StaticField {
472+
t.Fatalf("unexpected unmarshaled static field value: %s", unmarshaledWrapper.StaticField)
473+
}
474+
var unmarshaledDynamicFieldValue dynamicField
475+
if err := yaml.UnmarshalWithOptions(unmarshaledWrapper.DynamicField, &unmarshaledDynamicFieldValue, yaml.UseJSONUnmarshaler()); err != nil {
476+
t.Fatal(err)
477+
}
478+
if !unmarshaledDynamicFieldValue.Equals(expectedDynamicFieldValue) {
479+
t.Fatalf("unexpected unmarshaled dynamic field value: %v", unmarshaledDynamicFieldValue)
480+
}
481+
})
482+
483+
t.Run("UseJSONMarshaler and yaml.RawMessage", func(t *testing.T) {
484+
dynamicFieldBytes, err := yaml.Marshal(expectedDynamicFieldValue)
485+
if err != nil {
486+
t.Fatal(err)
487+
}
488+
wrapper := rawYAMLWrapper{
489+
StaticField: "value",
490+
DynamicField: yaml.RawMessage(dynamicFieldBytes),
491+
}
492+
wrapperBytes, err := yaml.MarshalWithOptions(&wrapper, yaml.UseJSONMarshaler())
493+
if err != nil {
494+
t.Fatal(err)
495+
}
496+
var unmarshaledWrapper rawYAMLWrapper
497+
if err := yaml.UnmarshalWithOptions(wrapperBytes, &unmarshaledWrapper, yaml.UseJSONUnmarshaler()); err != nil {
498+
t.Fatal(err)
499+
}
500+
if unmarshaledWrapper.StaticField != wrapper.StaticField {
501+
t.Fatalf("unexpected unmarshaled static field value: %s", unmarshaledWrapper.StaticField)
502+
}
503+
var unmarshaledDynamicFieldValue dynamicField
504+
if err := yaml.UnmarshalWithOptions(unmarshaledWrapper.DynamicField, &unmarshaledDynamicFieldValue, yaml.UseJSONUnmarshaler()); err != nil {
505+
t.Fatal(err)
506+
}
507+
if !unmarshaledDynamicFieldValue.Equals(expectedDynamicFieldValue) {
508+
t.Fatalf("unexpected unmarshaled dynamic field value: %v", unmarshaledDynamicFieldValue)
509+
}
510+
})
511+
}

0 commit comments

Comments
 (0)