blob: cca7f82f54148c76565cd62e06157580af0a74b7 [file] [log] [blame]
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.23
package html
import (
"strings"
"testing"
)
func TestNode_ChildNodes(t *testing.T) {
tests := []struct {
in string
want string
}{
{"", ""},
{"<a></a>", "a"},
{"a", "a"},
{"<a></a><!--b-->", "a b"},
{"a<b></b>c", "a b c"},
{"a<b><!--c--></b>d", "a b d"},
{"<a><b>c<!--d-->e</b></a>f<!--g--><h>i</h>", "a f g h"},
}
for _, test := range tests {
doc, err := Parse(strings.NewReader(test.in))
if err != nil {
t.Fatal(err)
}
// Drill to <html><head></head><body>
n := doc.FirstChild.FirstChild.NextSibling
var results []string
for c := range n.ChildNodes() {
results = append(results, c.Data)
}
if got := strings.Join(results, " "); got != test.want {
t.Errorf("ChildNodes = %q, want %q", got, test.want)
}
}
}
func TestNode_Descendants(t *testing.T) {
tests := []struct {
in string
want string
}{
{"", ""},
{"<a></a>", "a"},
{"<a><b></b></a>", "a b"},
{"<a>b</a>", "a b"},
{"<a><!--b--></a>", "a b"},
{"<a>b<c></c>d</a>", "a b c d"},
{"<a>b<c><!--d--></c>e</a>", "a b c d e"},
{"<a><b><c>d<!--e-->f</c></b>g<!--h--><i>j</i></a>", "a b c d e f g h i j"},
}
for _, test := range tests {
doc, err := Parse(strings.NewReader(test.in))
if err != nil {
t.Fatal(err)
}
// Drill to <html><head></head><body>
n := doc.FirstChild.FirstChild.NextSibling
var results []string
for c := range n.Descendants() {
results = append(results, c.Data)
}
if got := strings.Join(results, " "); got != test.want {
t.Errorf("Descendants = %q; want: %q", got, test.want)
}
}
}
func TestNode_Ancestors(t *testing.T) {
for _, size := range []int{0, 1, 2, 10, 100, 10_000} {
n := buildChain(size)
nParents := 0
for _ = range n.Ancestors() {
nParents++
}
if nParents != size {
t.Errorf("number of Ancestors = %d; want: %d", nParents, size)
}
}
}
func buildChain(size int) *Node {
child := new(Node)
for range size {
parent := child
child = new(Node)
parent.AppendChild(child)
}
return child
}