package xml import ( "reflect" "strings" "testing" ) type Plain struct { V interface{} } type NestedOrder struct { XMLName struct{} `xml:"result"` Field1 string `xml:"parent>c"` Field2 string `xml:"parent>b"` Field3 string `xml:"parent>a"` } func TestCodec_Marshal(t *testing.T) { tests := []struct { Value interface{} ExpectXML string }{ // Test value types {Value: &Plain{true}, ExpectXML: `true`}, {Value: &Plain{false}, ExpectXML: `false`}, {Value: &Plain{42}, ExpectXML: `42`}, { Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, ExpectXML: `` + `` + `C` + `B` + `A` + `` + ``, }, } for _, tt := range tests { data, err := (codec{}).Marshal(tt.Value) if err != nil { t.Errorf("marshal(%#v): %s", tt.Value, err) } if got, want := string(data), tt.ExpectXML; got != want { if strings.Contains(want, "\n") { t.Errorf("marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", tt.Value, got, want) } else { t.Errorf("marshal(%#v):\nhave %#q\nwant %#q", tt.Value, got, want) } } } } func TestCodec_Unmarshal(t *testing.T) { tests := []struct { want interface{} InputXML string }{ { want: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, InputXML: `` + `` + `C` + `B` + `A` + `` + ``, }, } for _, tt := range tests { vt := reflect.TypeOf(tt.want) dest := reflect.New(vt.Elem()).Interface() data := []byte(tt.InputXML) err := (codec{}).Unmarshal(data, dest) if err != nil { t.Errorf("unmarshal(%#v, %#v): %s", tt.InputXML, dest, err) } if got, want := dest, tt.want; !reflect.DeepEqual(got, want) { t.Errorf("unmarshal(%q):\nhave %#v\nwant %#v", tt.InputXML, got, want) } } } func TestCodec_NilUnmarshal(t *testing.T) { tests := []struct { want interface{} InputXML string }{ { want: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, InputXML: `` + `` + `C` + `B` + `A` + `` + ``, }, } for _, tt := range tests { s := struct { A string `xml:"a"` B *NestedOrder }{A: "a"} data := []byte(tt.InputXML) err := (codec{}).Unmarshal(data, &s.B) if err != nil { t.Errorf("unmarshal(%#v, %#v): %s", tt.InputXML, s.B, err) } if got, want := s.B, tt.want; !reflect.DeepEqual(got, want) { t.Errorf("unmarshal(%q):\nhave %#v\nwant %#v", tt.InputXML, got, want) } } }