package xml
import (
"bytes"
"strings"
"testing"
)
type testStruct struct {
XMLName struct{} `xml:"root"`
Name string `xml:"name"`
Value int `xml:"value"`
}
func TestEncoder(t *testing.T) {
t.Run("successful encode", func(t *testing.T) {
var buf bytes.Buffer
data := testStruct{Name: "test", Value: 42}
err := Encoder(&buf, data)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
result := buf.String()
if !strings.Contains(result, "test") {
t.Errorf("expected result to contain 'test', got %q", result)
}
if !strings.Contains(result, "42") {
t.Errorf("expected result to contain '42', got %q", result)
}
})
t.Run("encode slice", func(t *testing.T) {
type Item struct {
Value int `xml:"value"`
}
var buf bytes.Buffer
data := []Item{{Value: 1}, {Value: 2}}
err := Encoder(&buf, data)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
result := buf.String()
if !strings.Contains(result, "1") {
t.Error("expected result to contain first item")
}
if !strings.Contains(result, "2") {
t.Error("expected result to contain second item")
}
})
}
func TestDecoder(t *testing.T) {
t.Run("successful decode", func(t *testing.T) {
input := `test42`
reader := strings.NewReader(input)
var result testStruct
err := Decoder(reader, &result)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if result.Name != "test" {
t.Errorf("expected name 'test', got %q", result.Name)
}
if result.Value != 42 {
t.Errorf("expected value 42, got %d", result.Value)
}
})
t.Run("decode empty XML", func(t *testing.T) {
input := ``
reader := strings.NewReader(input)
var result testStruct
err := Decoder(reader, &result)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if result.Name != "" {
t.Errorf("expected empty name, got %q", result.Name)
}
if result.Value != 0 {
t.Errorf("expected zero value, got %d", result.Value)
}
})
t.Run("decode invalid XML", func(t *testing.T) {
input := ``
reader := strings.NewReader(input)
var result testStruct
err := Decoder(reader, &result)
if err == nil {
t.Fatal("expected error for invalid XML, got nil")
}
})
t.Run("decode empty input", func(t *testing.T) {
reader := strings.NewReader("")
var result testStruct
err := Decoder(reader, &result)
if err == nil {
t.Fatal("expected error for empty input, got nil")
}
})
}