diff --git a/tests/tree/test_tree_expand_etc.py b/tests/tree/test_tree_expand_etc.py new file mode 100644 index 000000000..a55a44e98 --- /dev/null +++ b/tests/tree/test_tree_expand_etc.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +from textual.app import App, ComposeResult +from textual.widgets import Tree + + +class TreeApp(App[None]): + """Test tree app.""" + + def compose(self) -> ComposeResult: + yield Tree("Test") + + def on_mount(self) -> None: + tree = self.query_one(Tree) + for n in range(10): + tree.root.add(f"Trunk {n}") + node = tree.root.children[0] + for n in range(10): + node = node.add(str(n)) + + +async def test_tree_node_expand() -> None: + """Expanding one node should not expand all nodes.""" + async with TreeApp().run_test() as pilot: + pilot.app.query_one(Tree).root.expand() + assert pilot.app.query_one(Tree).root.is_expanded is True + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert any(child.is_expanded for child in check_node.children) is False + check_node = check_node.children[0] + + +async def test_tree_node_expand_all() -> None: + """Expanding all on a node should expand all child nodes too.""" + async with TreeApp().run_test() as pilot: + pilot.app.query_one(Tree).root.expand_all() + assert pilot.app.query_one(Tree).root.is_expanded is True + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert check_node.children[0].is_expanded is True + assert any(child.is_expanded for child in check_node.children[1:]) is False + check_node = check_node.children[0] + + +async def test_tree_node_collapse() -> None: + """Collapsing one node should not collapse all nodes.""" + async with TreeApp().run_test() as pilot: + pilot.app.query_one(Tree).root.expand_all() + pilot.app.query_one(Tree).root.children[0].collapse() + assert pilot.app.query_one(Tree).root.children[0].is_expanded is False + check_node = pilot.app.query_one(Tree).root.children[0].children[0] + while check_node.children: + assert all(child.is_expanded for child in check_node.children) is True + check_node = check_node.children[0] + + +async def test_tree_node_collapse_all() -> None: + """Collapsing all on a node should collapse all child noes too.""" + async with TreeApp().run_test() as pilot: + pilot.app.query_one(Tree).root.expand_all() + pilot.app.query_one(Tree).root.children[0].collapse_all() + assert pilot.app.query_one(Tree).root.children[0].is_expanded is False + check_node = pilot.app.query_one(Tree).root.children[0].children[0] + while check_node.children: + assert check_node.children[0].is_expanded is False + assert all(child.is_expanded for child in check_node.children[1:]) is True + check_node = check_node.children[0] + + +async def test_tree_node_toggle() -> None: + """Toggling one node should not toggle all nodes.""" + async with TreeApp().run_test() as pilot: + assert pilot.app.query_one(Tree).root.is_expanded is False + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert any(child.is_expanded for child in check_node.children) is False + check_node = check_node.children[0] + pilot.app.query_one(Tree).root.toggle() + assert pilot.app.query_one(Tree).root.is_expanded is True + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert any(child.is_expanded for child in check_node.children) is False + check_node = check_node.children[0] + + +async def test_tree_node_toggle_all() -> None: + """Toggling all on a node should toggle all child nodes too.""" + async with TreeApp().run_test() as pilot: + assert pilot.app.query_one(Tree).root.is_expanded is False + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert any(child.is_expanded for child in check_node.children) is False + check_node = check_node.children[0] + pilot.app.query_one(Tree).root.toggle_all() + assert pilot.app.query_one(Tree).root.is_expanded is True + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert check_node.children[0].is_expanded is True + assert any(child.is_expanded for child in check_node.children[1:]) is False + check_node = check_node.children[0] + pilot.app.query_one(Tree).root.toggle_all() + assert pilot.app.query_one(Tree).root.is_expanded is False + check_node = pilot.app.query_one(Tree).root.children[0] + while check_node.children: + assert any(child.is_expanded for child in check_node.children) is False + check_node = check_node.children[0]