-
Notifications
You must be signed in to change notification settings - Fork 0
/
find_test.go
135 lines (117 loc) · 2.48 KB
/
find_test.go
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")
}
}