diff options
Diffstat (limited to 'worker/types/thread_test.go')
-rw-r--r-- | worker/types/thread_test.go | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/worker/types/thread_test.go b/worker/types/thread_test.go new file mode 100644 index 0000000..e79dddd --- /dev/null +++ b/worker/types/thread_test.go @@ -0,0 +1,108 @@ +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 { + //ascended, need to trim the prefix layers + 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 + }) +} |