1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
package dom
import (
"strings"
"testing"
"golang.org/x/net/html"
)
func TestContainsNode(t *testing.T) {
input := `<root><start><span><target></target></span><span><target></target></span></start></root><next></next>`
doc, err := html.Parse(strings.NewReader(input))
if err != nil {
t.Fatal(err)
}
node := FindFirstNode(doc, func(node *html.Node) bool {
return node.Data == "root"
})
var called1 int
res1 := ContainsNode(node.FirstChild, func(n *html.Node) bool {
if n.Data == "next" {
t.Error("the next node should not have been visited")
}
called1++
return n.Data == "target"
})
if res1 != true {
t.Error("expected true")
}
if called1 != 2 {
t.Error("expected fn to be called 2 times")
}
var called2 int
res2 := ContainsNode(node.FirstChild, func(n *html.Node) bool {
if n.Data == "next" {
t.Error("the next node should not have been visited")
}
called2++
return n.Data == "else"
})
if res2 != false {
t.Error("expected false")
}
if called2 != 4 {
t.Error("expected fn to be called 4 times")
}
}
func TestFindFirstNode(t *testing.T) {
input := `
<html>
<head></head>
<body>
<article>
<div>
<h3>Heading</h3>
<p>short description</p>
</div>
</article>
<section>
<h4>Heading</h4>
<p>another description</p>
</section>
</body>
</html>
`
doc, err := html.Parse(strings.NewReader(input))
if err != nil {
t.Fatal(err)
}
article := FindFirstNode(doc, func(node *html.Node) bool {
return NodeName(node) == "article"
})
if article == nil || article.Data != "article" {
t.Error("got different node")
}
h3 := FindFirstNode(article, func(node *html.Node) bool {
return NodeName(node) == "h3"
})
if h3 == nil || h3.Data != "h3" {
t.Error("got different node")
}
h4 := FindFirstNode(article, func(node *html.Node) bool {
return NodeName(node) == "h4"
})
if h4 != nil {
t.Error("expected nil node")
}
}
func TestFindAllNodes(t *testing.T) {
input := `
<html>
<head></head>
<body>
<article>
<div>
<h3>Heading</h3>
<p>short description</p>
</div>
</article>
<section>
<h4>Heading</h4>
<p>another description</p>
</section>
</body>
</html>
`
doc, err := html.Parse(strings.NewReader(input))
if err != nil {
t.Fatal(err)
}
paragraphs := FindAllNodes(doc, func(node *html.Node) bool {
return NodeName(node) == "p"
})
if len(paragraphs) != 2 {
t.Error("expected 2 nodes")
}
if paragraphs[0].Data != "p" || paragraphs[1].Data != "p" {
t.Error("expected paragraph nodes")
}
}
|