Skip to content

Commit

Permalink
feat: respect indentetion and comments
Browse files Browse the repository at this point in the history
  • Loading branch information
Youen Péron committed Nov 13, 2023
1 parent 40b7e75 commit 391a830
Show file tree
Hide file tree
Showing 6 changed files with 216 additions and 120 deletions.
66 changes: 47 additions & 19 deletions pkg/xixo/calback_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ import (
"github.com/stretchr/testify/assert"
)

const newChildContent = "newChildContent"
const (
newChildContent = "newChildContent"
rootXML = `<root>
<element1>Hello world !</element1>
<element2>Contenu2 </element2>
</root>`
)

func mapCallback(dict map[string]string) (map[string]string, error) {
dict["element1"] = newChildContent
Expand All @@ -20,19 +26,23 @@ func mapCallback(dict map[string]string) (map[string]string, error) {
func TestMapCallback(t *testing.T) {
t.Parallel()

element1 := createTree()
//nolint
assert.Equal(t, "<root>\n <element1>Hello world !</element1>\n <element2>Contenu2 </element2>\n</root>", element1.String())
element1 := createTreeFromXMLString(rootXML)

assert.Equal(t, rootXML, element1.String())

editedElement1, err := xixo.XMLElementToMapCallback(mapCallback)(element1)
assert.Nil(t, err)

text := editedElement1.FirstChild().InnerText

assert.Equal(t, "newChildContent", text)
assert.Equal(t, newChildContent, text)

//nolint
assert.Equal(t, "<root>\n <element1>newChildContent</element1>\n <element2>Contenu2 </element2>\n</root>", editedElement1.String())
expected := `<root>
<element1>newChildContent</element1>
<element2>Contenu2 </element2>
</root>`

assert.Equal(t, expected, editedElement1.String())
}

func jsonCallback(source string) (string, error) {
Expand All @@ -54,7 +64,7 @@ func jsonCallback(source string) (string, error) {
func TestJsonCallback(t *testing.T) {
t.Parallel()

root := createTree()
root := createTreeFromXMLString(rootXML)

editedRoot, err := xixo.XMLElementToJSONCallback(jsonCallback)(root)
assert.Nil(t, err)
Expand All @@ -73,7 +83,7 @@ func badJSONCallback(source string) (string, error) {
func TestBadJsonCallback(t *testing.T) {
t.Parallel()

element1 := createTree()
element1 := createTreeFromXMLString(rootXML)

_, err := xixo.XMLElementToJSONCallback(badJSONCallback)(element1)

Expand All @@ -83,9 +93,14 @@ func TestBadJsonCallback(t *testing.T) {
func TestMapCallbackWithAttributs(t *testing.T) {
t.Parallel()

element1 := createTreeWithAttribut()
//nolint
assert.Equal(t, "<root>\n <element1 age=\"22\">Hello world !</element1>\n <element2>Contenu2 </element2>\n</root>", element1.String())
rootXML := `<root>
<element1 age="22">Hello world !</element1>
<element2>Contenu2 </element2>
</root>`

element1 := createTreeFromXMLString(rootXML)

assert.Equal(t, rootXML, element1.String())

editedElement1, err := xixo.XMLElementToMapCallback(mapCallbackAttributs)(element1)
assert.Nil(t, err)
Expand All @@ -94,8 +109,12 @@ func TestMapCallbackWithAttributs(t *testing.T) {

assert.Equal(t, "newChildContent", text)

//nolint
assert.Equal(t, "<root>\n <element1 age=\"50\">newChildContent</element1>\n <element2>Contenu2 </element2>\n</root>", editedElement1.String())
expected := `<root>
<element1 age="50">newChildContent</element1>
<element2>Contenu2 </element2>
</root>`

assert.Equal(t, expected, editedElement1.String())
}

func mapCallbackAttributs(dict map[string]string) (map[string]string, error) {
Expand All @@ -108,9 +127,14 @@ func mapCallbackAttributs(dict map[string]string) (map[string]string, error) {
func TestMapCallbackWithAttributsParentAndChilds(t *testing.T) {
t.Parallel()

element1 := createTreeWithAttributParent()
//nolint
assert.Equal(t, "<root type=\"foo\">\n <element1 age=\"22\" sex=\"male\">Hello world !</element1>\n <element2>Contenu2 </element2>\n</root>", element1.String())
rootXML := `<root type="foo">
<element1 age="22" sex="male">Hello world !</element1>
<element2>Contenu2 </element2>
</root>`

element1 := createTreeFromXMLString(rootXML)

assert.Equal(t, rootXML, element1.String())

editedElement1, err := xixo.XMLElementToMapCallback(mapCallbackAttributsWithParent)(element1)
assert.Nil(t, err)
Expand All @@ -119,8 +143,12 @@ func TestMapCallbackWithAttributsParentAndChilds(t *testing.T) {

assert.Equal(t, "newChildContent", text)

//nolint
assert.Equal(t, "<root type=\"bar\">\n <element1 age=\"50\" sex=\"male\">newChildContent</element1>\n <element2 age=\"25\">Contenu2 </element2>\n</root>", editedElement1.String())
expected := `<root type="bar">
<element1 age="50" sex="male">newChildContent</element1>
<element2 age="25">Contenu2 </element2>
</root>`

assert.Equal(t, expected, editedElement1.String())
}

func mapCallbackAttributsWithParent(dict map[string]string) (map[string]string, error) {
Expand Down
22 changes: 10 additions & 12 deletions pkg/xixo/driver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func TestFuncDriverEdit(t *testing.T) {

assert.True(t, called)

expected := "<root>\n <element1>innerTextb</element1>\n</root>"
expected := "<root><element1>innerTextb</element1></root>"
assert.Equal(t, expected, writer.String())
}

Expand All @@ -59,7 +59,7 @@ func TestFuncDriverEditEmptyElement(t *testing.T) {

assert.True(t, called)

expected := "<root>\n <element1 nil=\"true\"></element1>\n</root>"
expected := "<root><element1 nil=\"true\"></element1></root>"
assert.Equal(t, expected, writer.String())
}

Expand All @@ -69,22 +69,24 @@ func TestFuncDriverEdit2subscribers(t *testing.T) {
// Create a reader with an XML string, an empty writer, a callback function, and a driver.
reader := bytes.NewBufferString(
`<root>
<root1><element1>innerTexta1</element1></root1>
<root2><element2>innerTexta2</element2></root2>
</root>`,
<root1><element1>innerTexta1</element1></root1>
<root2><element2>innerTexta2</element2></root2>
</root>`,
)
writer := bytes.Buffer{}
called1, called2 := false, false

subscribers := map[string]xixo.CallbackMap{
"root1": func(input map[string]string) (map[string]string, error) {
called1 = true
assert.Equal(t, input["element1"], "innerTexta1")
input["element1"] = "innerTextb1"

return input, nil
},
"root2": func(input map[string]string) (map[string]string, error) {
called2 = true
assert.Equal(t, "innerTexta2", input["element2"])
input["element2"] = "innerTextb2"

return input, nil
Expand All @@ -101,12 +103,8 @@ func TestFuncDriverEdit2subscribers(t *testing.T) {
assert.True(t, called2)

expected := `<root>
<root1>
<element1>innerTextb1</element1>
</root1>
<root2>
<element2>innerTextb2</element2>
</root2>
</root>`
<root1><element1>innerTextb1</element1></root1>
<root2><element2>innerTextb2</element2></root2>
</root>`
assert.Equal(t, expected, writer.String())
}
34 changes: 27 additions & 7 deletions pkg/xixo/element.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,32 @@ import (
"strings"
)

type CommentElement struct {
OuterTextBefore string
Comment string
}

func (c CommentElement) String() string {
return fmt.Sprintf("%s<!--%s-->", c.OuterTextBefore, c.Comment)
}

type XMLElement struct {
Name string
Attrs map[string]string
AttrKeys []string
InnerText string
Childs map[string][]XMLElement
Err error

// filled when xpath enabled
childs []*XMLElement
parent *XMLElement
attrs []*xmlAttr
localName string
prefix string

outerTextBefore string
comments []CommentElement
}

type xmlAttr struct {
Expand Down Expand Up @@ -91,11 +104,7 @@ func (n *XMLElement) String() string {
xmlChilds := ""

for node := n.FirstChild(); node != nil; node = node.NextSibling() {
xmlChilds += " " + node.String() + "\n"
}

if len(xmlChilds) > 0 {
xmlChilds = "\n" + xmlChilds
xmlChilds += node.String()
}

attributes := n.Name + " "
Expand All @@ -105,10 +114,17 @@ func (n *XMLElement) String() string {

attributes = strings.Trim(attributes, " ")

return fmt.Sprintf("<%s>%s%s</%s>",
commentsString := ""
for _, comment := range n.comments {
commentsString += comment.String()
}

return fmt.Sprintf("%s<%s>%s%s%s</%s>",
n.outerTextBefore,
attributes,
n.InnerText,
commentsString,
xmlChilds,
n.InnerText,
n.Name)
}

Expand All @@ -125,6 +141,10 @@ func (n *XMLElement) AddAttribute(name string, value string) {
n.Attrs[name] = value
}

func (n *XMLElement) AddComment(comment CommentElement) {
n.comments = append(n.comments, comment)
}

func NewXMLElement() *XMLElement {
return &XMLElement{
Name: "",
Expand Down
Loading

0 comments on commit 391a830

Please sign in to comment.