package tree import ( "testing" ) func TestAddPath_single(t *testing.T) { root := &Node{IsDir: true, Children: make(map[string]*Node)} addPath(root, "README.md", false) node, ok := root.Children["README.md"] if !ok { t.Fatal("missing README.md child") } if node.IsDir { t.Error("README.md should not be a directory") } } func TestAddPath_nested(t *testing.T) { root := &Node{IsDir: true, Children: make(map[string]*Node)} addPath(root, "cmd/main.go", false) cmdNode, ok := root.Children["cmd"] if !ok { t.Fatal("missing cmd child") } if !cmdNode.IsDir { t.Error("cmd should be a directory") } if _, ok := cmdNode.Children["main.go"]; !ok { t.Fatal("missing main.go child under cmd") } } func TestAddPath_overwrite_annotation(t *testing.T) { root := &Node{IsDir: true, Children: make(map[string]*Node)} node := addPath(root, "cmd", true) node.Annotation = "ignored (default)" node2 := addPath(root, "cmd", true) if node2 != node { t.Error("addPath should return the same node for repeated path") } if node2.Annotation != "ignored (default)" { t.Errorf("annotation lost: %q", node2.Annotation) } } func TestSplitPath(t *testing.T) { tests := []struct { name string input string expect []string }{ {"root_file", "README.md", []string{"README.md"}}, {"two_parts", "cmd/main.go", []string{"cmd", "main.go"}}, {"three_parts", "internal/tree/node.go", []string{"internal", "tree", "node.go"}}, {"empty", "", nil}, {"only_slashes", "///", nil}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := splitPath(tt.input) if len(got) != len(tt.expect) { t.Errorf("splitPath(%q) = %v; want %v", tt.input, got, tt.expect) return } for i := range got { if got[i] != tt.expect[i] { t.Errorf("splitPath(%q)[%d] = %q; want %q", tt.input, i, got[i], tt.expect[i]) } } }) } } func TestRenderBreadcrumb_root(t *testing.T) { breadcrumb := RenderBreadcrumb("/home/user/project", "README.md") expected := "project/README.md" if breadcrumb != expected { t.Errorf("RenderBreadcrumb(...) = %q; want %q", breadcrumb, expected) } } func TestRenderBreadcrumb_nested(t *testing.T) { breadcrumb := RenderBreadcrumb("/home/user/project", "internal/tree/tree.go") expected := "project / internal / tree / tree.go" if breadcrumb != expected { t.Errorf("RenderBreadcrumb(...) = %q; want %q", breadcrumb, expected) } }