1package goquery 2 3import ( 4 "reflect" 5 "sort" 6 "strings" 7 "testing" 8 9 "golang.org/x/net/html" 10) 11 12var 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 27func 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 65func 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 84func 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>"}, // render makes DOCTYPE all caps 105 {nil, sMeta, `<meta a="b"/>`}, // and auto-closes the meta 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