1 package goquery
2
3 import (
4 "reflect"
5 "sort"
6 "strings"
7 "testing"
8
9 "golang.org/x/net/html"
10 )
11
12 var allNodes = `<!doctype html>
13 <html>
14 <head>
15 <meta a="b">
16 </head>
17 <body>
18 <p><!-- this is a comment -->
19 This is some text.
20 </p>
21 <div></div>
22 <h1 class="header"></h1>
23 <h2 class="header"></h2>
24 </body>
25 </html>`
26
27 func TestNodeName(t *testing.T) {
28 doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
29 if err != nil {
30 t.Fatal(err)
31 }
32
33 n0 := doc.Nodes[0]
34 nDT := n0.FirstChild
35 sMeta := doc.Find("meta")
36 nMeta := sMeta.Get(0)
37 sP := doc.Find("p")
38 nP := sP.Get(0)
39 nComment := nP.FirstChild
40 nText := nComment.NextSibling
41
42 cases := []struct {
43 node *html.Node
44 typ html.NodeType
45 want string
46 }{
47 {n0, html.DocumentNode, nodeNames[html.DocumentNode]},
48 {nDT, html.DoctypeNode, "html"},
49 {nMeta, html.ElementNode, "meta"},
50 {nP, html.ElementNode, "p"},
51 {nComment, html.CommentNode, nodeNames[html.CommentNode]},
52 {nText, html.TextNode, nodeNames[html.TextNode]},
53 }
54 for i, c := range cases {
55 got := NodeName(newSingleSelection(c.node, doc))
56 if c.node.Type != c.typ {
57 t.Errorf("%d: want type %v, got %v", i, c.typ, c.node.Type)
58 }
59 if got != c.want {
60 t.Errorf("%d: want %q, got %q", i, c.want, got)
61 }
62 }
63 }
64
65 func TestNodeNameMultiSel(t *testing.T) {
66 doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
67 if err != nil {
68 t.Fatal(err)
69 }
70
71 in := []string{"p", "h1", "div"}
72 var out []string
73 doc.Find(strings.Join(in, ", ")).Each(func(i int, s *Selection) {
74 got := NodeName(s)
75 out = append(out, got)
76 })
77 sort.Strings(in)
78 sort.Strings(out)
79 if !reflect.DeepEqual(in, out) {
80 t.Errorf("want %v, got %v", in, out)
81 }
82 }
83
84 func TestOuterHtml(t *testing.T) {
85 doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
86 if err != nil {
87 t.Fatal(err)
88 }
89
90 n0 := doc.Nodes[0]
91 nDT := n0.FirstChild
92 sMeta := doc.Find("meta")
93 sP := doc.Find("p")
94 nP := sP.Get(0)
95 nComment := nP.FirstChild
96 nText := nComment.NextSibling
97 sHeaders := doc.Find(".header")
98
99 cases := []struct {
100 node *html.Node
101 sel *Selection
102 want string
103 }{
104 {nDT, nil, "<!DOCTYPE html>"},
105 {nil, sMeta, `<meta a="b"/>`},
106 {nil, sP, `<p><!-- this is a comment -->
107 This is some text.
108 </p>`},
109 {nComment, nil, "<!-- this is a comment -->"},
110 {nText, nil, `
111 This is some text.
112 `},
113 {nil, sHeaders, `<h1 class="header"></h1>`},
114 }
115 for i, c := range cases {
116 if c.sel == nil {
117 c.sel = newSingleSelection(c.node, doc)
118 }
119 got, err := OuterHtml(c.sel)
120 if err != nil {
121 t.Fatal(err)
122 }
123
124 if got != c.want {
125 t.Errorf("%d: want %q, got %q", i, c.want, got)
126 }
127 }
128 }
129
View as plain text