154 lines
3.4 KiB
Go
154 lines
3.4 KiB
Go
package html_test
|
|
|
|
import (
|
|
"bytes"
|
|
"code.squareroundforest.org/arpio/html"
|
|
. "code.squareroundforest.org/arpio/html/tag"
|
|
"testing"
|
|
)
|
|
|
|
func TestWrap(t *testing.T) {
|
|
t.Run("write error", func(t *testing.T) {
|
|
ew := &errorWriter{failAfter: 9}
|
|
if err := html.WriteIndent(
|
|
ew,
|
|
html.Indentation{Indent: "\t", PWidth: 12},
|
|
Span(Span("foo"), Span("bar"), Span("baz")),
|
|
); err == nil {
|
|
t.Fatal()
|
|
}
|
|
})
|
|
|
|
t.Run("write error in text", func(t *testing.T) {
|
|
ew := &errorWriter{}
|
|
if err := html.WriteIndent(
|
|
ew,
|
|
html.Indentation{Indent: "\t", PWidth: 2},
|
|
Span("foo", "bar", "baz"),
|
|
); err == nil {
|
|
t.Fatal()
|
|
}
|
|
})
|
|
|
|
t.Run("write error on line feed", func(t *testing.T) {
|
|
ew := &errorWriter{failAfter: 7}
|
|
if err := html.WriteIndent(
|
|
ew,
|
|
html.Indentation{Indent: "\t", PWidth: 3},
|
|
Span("foo"),
|
|
); err == nil {
|
|
t.Fatal()
|
|
}
|
|
})
|
|
|
|
t.Run("write error on indentation", func(t *testing.T) {
|
|
ew := &errorWriter{failAfter: 15}
|
|
if err := html.WriteIndent(
|
|
ew,
|
|
html.Indentation{Indent: "\t", PWidth: 3},
|
|
Div(Span("foo")),
|
|
); err == nil {
|
|
t.Fatal()
|
|
}
|
|
})
|
|
|
|
t.Run("write error on flush", func(t *testing.T) {
|
|
ew := &errorWriter{}
|
|
if err := html.Write(
|
|
ew,
|
|
Span(Span("foo"), Span("bar"), Span("baz")),
|
|
); err == nil {
|
|
t.Fatal()
|
|
}
|
|
})
|
|
|
|
t.Run("write error on flush during line feed", func(t *testing.T) {
|
|
ew := &errorWriter{}
|
|
if err := html.WriteIndent(
|
|
ew,
|
|
html.Indentation{Indent: "\t", PWidth: 10},
|
|
Span("foo bar", Div),
|
|
); err == nil {
|
|
t.Fatal()
|
|
}
|
|
})
|
|
|
|
t.Run("null write", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
if err := html.WriteRaw(&buf, Div("")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if buf.String() != "<div></div>" {
|
|
t.Fatal(buf.String())
|
|
}
|
|
})
|
|
|
|
t.Run("multiple words", func(t *testing.T) {
|
|
span := Span("foo bar baz")
|
|
|
|
var buf bytes.Buffer
|
|
if err := html.WriteIndent(&buf, html.Indentation{Indent: "\t", PWidth: 2}, span); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
expect := "<span>\nfoo\nbar\nbaz\n</span>"
|
|
if buf.String() != expect {
|
|
printBytes(buf.String(), expect)
|
|
t.Fatal(buf.String())
|
|
}
|
|
})
|
|
|
|
t.Run("tag not split", func(t *testing.T) {
|
|
span := Span("foo ", Span("bar", Attr("qux", 42)), " baz")
|
|
|
|
var buf bytes.Buffer
|
|
if err := html.WriteIndent(&buf, html.Indentation{Indent: "X", PWidth: 2}, span); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if buf.String() != "<span>\nfoo\n<span qux=\"42\">\nbar\n</span>\nbaz\n</span>" {
|
|
t.Fatal(buf.String())
|
|
}
|
|
})
|
|
|
|
t.Run("normal text", func(t *testing.T) {
|
|
div := Div(Span("foo bar baz qux quux corge"))
|
|
|
|
var buf bytes.Buffer
|
|
if err := html.WriteIndent(&buf, html.Indentation{Indent: "\t", PWidth: 15}, div); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if buf.String() != "<div>\n\t<span>\n\tfoo bar\n\tbaz qux\n\tquux\n\tcorge\n\t</span>\n</div>" {
|
|
t.Fatal(buf.String())
|
|
}
|
|
})
|
|
|
|
t.Run("inline space preserved", func(t *testing.T) {
|
|
div := Div(Span("foo"), " ", Span("bar"))
|
|
|
|
var buf bytes.Buffer
|
|
if err := html.Write(&buf, div); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if buf.String() != "<div>\n\t<span>foo</span> <span>bar</span>\n</div>" {
|
|
t.Fatal(buf.String())
|
|
}
|
|
})
|
|
|
|
t.Run("special whitespace characters", func(t *testing.T) {
|
|
div := Div("foo\nbar\tbaz")
|
|
|
|
var buf bytes.Buffer
|
|
if err := html.Write(&buf, div); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if buf.String() != "<div>\n\tfoo bar baz\n</div>" {
|
|
t.Fatal(buf.String())
|
|
}
|
|
})
|
|
}
|