package xmlparsing import ( "testing" ) type TestState struct { ParsedElements []string } func TestIterate_ValidXML(t *testing.T) { xmlData := ` Text ` state := TestState{} for tokenResult, err := range Iterate(xmlData, state) { if err != nil { t.Fatalf("Unexpected error: %v", err) } if tokenResult == nil { t.Fatal("Received nil token result") } state.ParsedElements = append(state.ParsedElements, tokenResult.Token.Name) } if len(state.ParsedElements) == 0 { t.Fatal("No elements were parsed") } } func TestIterate_InvalidXML(t *testing.T) { xmlData := `` state := TestState{} var global error for _, err := range Iterate(xmlData, state) { if err != nil { global = err } } if global == nil { t.Fatal("Expected error, but got nil") } } func TestIterate_EmptyXML(t *testing.T) { xmlData := "" state := TestState{} for _, err := range Iterate(xmlData, state) { if err != nil { t.Fatalf("Expected iter.ErrEnd, but got: %v", err) } } } func TestIterate_CharDataTracking(t *testing.T) { xmlData := ` First Second ` state := TestState{} charDataCount := 0 for tokenResult, err := range Iterate(xmlData, state) { if err != nil { t.Fatalf("Unexpected error: %v", err) } if tokenResult.Token.Name == "CharData" { charDataCount++ } } if charDataCount != 5 { t.Fatalf("Expected 2 CharData elements, got %d", charDataCount) } } func TestIterate_AttributeParsing(t *testing.T) { xmlData := ` Content ` state := TestState{} for tokenResult, err := range Iterate(xmlData, state) { if err != nil { t.Fatalf("Unexpected error: %v", err) } if tokenResult.Token.Name == "child" && tokenResult.Token.Type == StartElement { if tokenResult.Token.Attributes["attr1"] != "value1" || tokenResult.Token.Attributes["attr2"] != "value2" { t.Fatalf("Incorrect attributes parsed: %v", tokenResult.Token.Attributes) } } } }