|
|
package bounded_tree
import ( "fmt" "testing"
"github.com/stretchr/testify/assert"
"github.com/chrislusf/seaweedfs/weed/util" )
var ( visitFn = func(path util.FullPath) (childDirectories []string, err error) { fmt.Printf(" visit %v ...\n", path) switch path { case "/": return []string{"a", "g", "h"}, nil case "/a": return []string{"b", "f"}, nil case "/a/b": return []string{"c", "e"}, nil case "/a/b/c": return []string{"d"}, nil case "/a/b/c/d": return []string{"i", "j"}, nil case "/a/b/c/d/i": return []string{}, nil case "/a/b/c/d/j": return []string{}, nil case "/a/b/e": return []string{}, nil case "/a/f": return []string{}, nil } return nil, nil }
printMap = func(m map[string]*Node) { for k := range m { println(" >", k) } } )
func TestBoundedTree(t *testing.T) {
// a/b/c/d/i
// a/b/c/d/j
// a/b/c/d
// a/b/e
// a/f
// g
// h
tree := NewBoundedTree(util.FullPath("/"))
tree.EnsureVisited(util.FullPath("/a/b/c"), visitFn)
assert.Equal(t, true, tree.HasVisited(util.FullPath("/a/b"))) assert.Equal(t, true, tree.HasVisited(util.FullPath("/a/b/c"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/a/b/c/d"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/a/b/e"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/a/f"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/g"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/h"))) assert.Equal(t, true, tree.HasVisited(util.FullPath("/"))) assert.Equal(t, true, tree.HasVisited(util.FullPath("/x"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/a/b/e/x")))
printMap(tree.root.Children)
a := tree.root.getChild("a")
b := a.getChild("b") if !b.isVisited() { t.Errorf("expect visited /a/b") } c := b.getChild("c") if !c.isVisited() { t.Errorf("expect visited /a/b/c") }
d := c.getChild("d") if d.isVisited() { t.Errorf("expect unvisited /a/b/c/d") }
tree.EnsureVisited(util.FullPath("/a/b/c/d"), visitFn) tree.EnsureVisited(util.FullPath("/a/b/c/d/i"), visitFn) tree.EnsureVisited(util.FullPath("/a/b/c/d/j"), visitFn) tree.EnsureVisited(util.FullPath("/a/b/e"), visitFn) tree.EnsureVisited(util.FullPath("/a/f"), visitFn)
printMap(tree.root.Children)
}
func TestEmptyBoundedTree(t *testing.T) {
// g
// h
tree := NewBoundedTree(util.FullPath("/"))
visitFn := func(path util.FullPath) (childDirectories []string, err error) { fmt.Printf(" visit %v ...\n", path) switch path { case "/": return []string{"g", "h"}, nil } t.Fatalf("expected visit %s", path) return nil, nil }
tree.EnsureVisited(util.FullPath("/a/b"), visitFn)
tree.EnsureVisited(util.FullPath("/a/b"), visitFn)
printMap(tree.root.Children)
assert.Equal(t, true, tree.HasVisited(util.FullPath("/a/b"))) assert.Equal(t, true, tree.HasVisited(util.FullPath("/a"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/g"))) assert.Equal(t, false, tree.HasVisited(util.FullPath("/g/x")))
}
|