feat(ui): add ExpandAll, CollapseAll, RevealNode to TreeView (R12, R13)

This commit is contained in:
Joseph Doherty
2026-03-23 02:30:53 -04:00
parent d3a6ed5f68
commit f127efe6ea
2 changed files with 164 additions and 0 deletions

View File

@@ -383,4 +383,77 @@ public class TreeViewTests : BunitContext
var labels = cut.FindAll(".node-label");
Assert.DoesNotContain(labels, l => l.TextContent == "Alpha-1");
}
[Fact]
public void ExpandAll_ExpandsAllBranches()
{
var cut = RenderTreeView();
// Everything collapsed initially
Assert.Equal(2, cut.FindAll(".node-label").Count);
cut.InvokeAsync(() => cut.Instance.ExpandAll());
var labels = cut.FindAll(".node-label");
Assert.Contains(labels, l => l.TextContent == "Alpha-1");
Assert.Contains(labels, l => l.TextContent == "Alpha-2");
Assert.Contains(labels, l => l.TextContent == "Alpha-2-X");
}
[Fact]
public void CollapseAll_CollapsesAllBranches()
{
var cut = RenderTreeView(initiallyExpanded: _ => true);
// Verify deep content is visible
var labels = cut.FindAll(".node-label");
Assert.Contains(labels, l => l.TextContent == "Alpha-2-X");
cut.InvokeAsync(() => cut.Instance.CollapseAll());
// Only roots should be visible
labels = cut.FindAll(".node-label");
Assert.Equal(2, labels.Count);
Assert.DoesNotContain(labels, l => l.TextContent == "Alpha-1");
}
[Fact]
public void RevealNode_ExpandsAncestors()
{
var cut = RenderTreeView();
// Everything collapsed initially
Assert.Equal(2, cut.FindAll(".node-label").Count);
cut.InvokeAsync(() => cut.Instance.RevealNode("a2x"));
// Alpha-2-X should now be visible (Alpha and Alpha-2 expanded)
var labels = cut.FindAll(".node-label");
Assert.Contains(labels, l => l.TextContent == "Alpha-2-X");
Assert.Contains(labels, l => l.TextContent == "Alpha-1"); // sibling also visible since Alpha is expanded
Assert.Contains(labels, l => l.TextContent == "Alpha-2");
}
[Fact]
public void RevealNode_WithSelect_SelectsNode()
{
object? selected = null;
var cut = RenderTreeView(selectable: true, onSelectedKeyChanged: k => selected = k);
cut.InvokeAsync(() => cut.Instance.RevealNode("a2x", select: true));
Assert.Equal("a2x", selected);
}
[Fact]
public void RevealNode_UnknownKey_NoOp()
{
var cut = RenderTreeView();
cut.InvokeAsync(() => cut.Instance.RevealNode("nonexistent"));
// Alpha should still be collapsed
var labels = cut.FindAll(".node-label");
Assert.Equal(2, labels.Count);
}
}