// 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 b"},
{"ac", "a b c"},
{"ad", "a b d"},
{"cefi", "a f g h"},
}
for _, test := range tests {
doc, err := Parse(strings.NewReader(test.in))
if err != nil {
t.Fatal(err)
}
// Drill to
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 b"},
{"b", "a b"},
{"", "a b"},
{"bd", "a b c d"},
{"be", "a b c d e"},
{"dfgj", "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
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
}