2021-11-12 18:12:02 +01:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func genFakeTree() *Thread {
|
|
|
|
tree := &Thread{
|
|
|
|
Uid: 0,
|
|
|
|
}
|
|
|
|
var prevChild *Thread
|
|
|
|
for i := 1; i < 3; i++ {
|
|
|
|
child := &Thread{
|
|
|
|
Uid: uint32(i * 10),
|
|
|
|
Parent: tree,
|
|
|
|
PrevSibling: prevChild,
|
|
|
|
}
|
|
|
|
if prevChild != nil {
|
|
|
|
prevChild.NextSibling = child
|
|
|
|
} else if tree.FirstChild == nil {
|
|
|
|
tree.FirstChild = child
|
|
|
|
} else {
|
|
|
|
panic("unreachable")
|
|
|
|
}
|
|
|
|
prevChild = child
|
|
|
|
var prevSecond *Thread
|
|
|
|
for j := 1; j < 3; j++ {
|
|
|
|
second := &Thread{
|
|
|
|
Uid: child.Uid + uint32(j),
|
|
|
|
Parent: child,
|
|
|
|
PrevSibling: prevSecond,
|
|
|
|
}
|
|
|
|
if prevSecond != nil {
|
|
|
|
prevSecond.NextSibling = second
|
|
|
|
} else if child.FirstChild == nil {
|
|
|
|
child.FirstChild = second
|
|
|
|
} else {
|
|
|
|
panic("unreachable")
|
|
|
|
}
|
|
|
|
prevSecond = second
|
|
|
|
var prevThird *Thread
|
|
|
|
limit := 3
|
|
|
|
if j == 2 {
|
|
|
|
limit = 8
|
|
|
|
}
|
|
|
|
for k := 1; k < limit; k++ {
|
|
|
|
third := &Thread{
|
|
|
|
Uid: second.Uid*10 + uint32(k),
|
|
|
|
Parent: second,
|
|
|
|
PrevSibling: prevThird,
|
|
|
|
}
|
|
|
|
if prevThird != nil {
|
|
|
|
prevThird.NextSibling = third
|
|
|
|
} else if second.FirstChild == nil {
|
|
|
|
second.FirstChild = third
|
|
|
|
} else {
|
|
|
|
panic("unreachable")
|
|
|
|
}
|
|
|
|
prevThird = third
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tree
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNewWalk(t *testing.T) {
|
|
|
|
tree := genFakeTree()
|
|
|
|
var prefix []string
|
|
|
|
lastLevel := 0
|
|
|
|
tree.Walk(func(t *Thread, lvl int, e error) error {
|
|
|
|
// if t.Uid%2 != 0 {
|
|
|
|
// return ErrSkipThread
|
|
|
|
// }
|
|
|
|
if e != nil {
|
|
|
|
fmt.Printf("ERROR: %v\n", e)
|
|
|
|
}
|
|
|
|
if lvl > lastLevel && lvl > 1 {
|
|
|
|
// we actually just descended... so figure out what connector we need
|
|
|
|
// level 1 is flush to the root, so we avoid the indentation there
|
|
|
|
if t.Parent.NextSibling != nil {
|
|
|
|
prefix = append(prefix, "│ ")
|
|
|
|
} else {
|
|
|
|
prefix = append(prefix, " ")
|
|
|
|
}
|
|
|
|
} else if lvl < lastLevel {
|
2022-07-31 22:16:40 +02:00
|
|
|
// ascended, need to trim the prefix layers
|
2021-11-12 18:12:02 +01:00
|
|
|
diff := lastLevel - lvl
|
|
|
|
prefix = prefix[:len(prefix)-diff]
|
|
|
|
}
|
|
|
|
|
|
|
|
var arrow string
|
|
|
|
if t.Parent != nil {
|
|
|
|
if t.NextSibling != nil {
|
|
|
|
arrow = "├─>"
|
|
|
|
} else {
|
|
|
|
arrow = "└─>"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// format
|
|
|
|
fmt.Printf("%s%s%s\n", strings.Join(prefix, ""), arrow, t)
|
|
|
|
|
|
|
|
lastLevel = lvl
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
}
|