123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package goquery
- import (
- "reflect"
- "sort"
- "strings"
- "testing"
- "golang.org/x/net/html"
- )
- var allNodes = `<!doctype html>
- <html>
- <head>
- <meta a="b">
- </head>
- <body>
- <p><!-- this is a comment -->
- This is some text.
- </p>
- <div></div>
- <h1 class="header"></h1>
- <h2 class="header"></h2>
- </body>
- </html>`
- func TestNodeName(t *testing.T) {
- doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
- if err != nil {
- t.Fatal(err)
- }
- n0 := doc.Nodes[0]
- nDT := n0.FirstChild
- sMeta := doc.Find("meta")
- nMeta := sMeta.Get(0)
- sP := doc.Find("p")
- nP := sP.Get(0)
- nComment := nP.FirstChild
- nText := nComment.NextSibling
- cases := []struct {
- node *html.Node
- typ html.NodeType
- want string
- }{
- {n0, html.DocumentNode, nodeNames[html.DocumentNode]},
- {nDT, html.DoctypeNode, "html"},
- {nMeta, html.ElementNode, "meta"},
- {nP, html.ElementNode, "p"},
- {nComment, html.CommentNode, nodeNames[html.CommentNode]},
- {nText, html.TextNode, nodeNames[html.TextNode]},
- }
- for i, c := range cases {
- got := NodeName(newSingleSelection(c.node, doc))
- if c.node.Type != c.typ {
- t.Errorf("%d: want type %v, got %v", i, c.typ, c.node.Type)
- }
- if got != c.want {
- t.Errorf("%d: want %q, got %q", i, c.want, got)
- }
- }
- }
- func TestNodeNameMultiSel(t *testing.T) {
- doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
- if err != nil {
- t.Fatal(err)
- }
- in := []string{"p", "h1", "div"}
- var out []string
- doc.Find(strings.Join(in, ", ")).Each(func(i int, s *Selection) {
- got := NodeName(s)
- out = append(out, got)
- })
- sort.Strings(in)
- sort.Strings(out)
- if !reflect.DeepEqual(in, out) {
- t.Errorf("want %v, got %v", in, out)
- }
- }
- func TestOuterHtml(t *testing.T) {
- doc, err := NewDocumentFromReader(strings.NewReader(allNodes))
- if err != nil {
- t.Fatal(err)
- }
- n0 := doc.Nodes[0]
- nDT := n0.FirstChild
- sMeta := doc.Find("meta")
- sP := doc.Find("p")
- nP := sP.Get(0)
- nComment := nP.FirstChild
- nText := nComment.NextSibling
- sHeaders := doc.Find(".header")
- cases := []struct {
- node *html.Node
- sel *Selection
- want string
- }{
- {nDT, nil, "<!DOCTYPE html>"}, // render makes DOCTYPE all caps
- {nil, sMeta, `<meta a="b"/>`}, // and auto-closes the meta
- {nil, sP, `<p><!-- this is a comment -->
- This is some text.
- </p>`},
- {nComment, nil, "<!-- this is a comment -->"},
- {nText, nil, `
- This is some text.
- `},
- {nil, sHeaders, `<h1 class="header"></h1>`},
- }
- for i, c := range cases {
- if c.sel == nil {
- c.sel = newSingleSelection(c.node, doc)
- }
- got, err := OuterHtml(c.sel)
- if err != nil {
- t.Fatal(err)
- }
- if got != c.want {
- t.Errorf("%d: want %q, got %q", i, c.want, got)
- }
- }
- }
|