mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Adds a method to Widget that allows moving a child of that widget within its list of children. Options are to move before or after a specific location, or a sibling widget. Seeks to implement #1121.
101 lines
3.8 KiB
Python
101 lines
3.8 KiB
Python
import pytest
|
|
|
|
from textual.app import App
|
|
from textual.widget import Widget, WidgetError
|
|
|
|
async def test_widget_move_child() -> None:
|
|
"""Test moving a widget in a child list."""
|
|
|
|
# Test calling move_child with no direction.
|
|
async with App().run_test() as pilot:
|
|
child = Widget(Widget())
|
|
await pilot.app.mount(child)
|
|
with pytest.raises(WidgetError):
|
|
pilot.app.screen.move_child(child)
|
|
|
|
# Test calling move_child with more than one direction.
|
|
async with App().run_test() as pilot:
|
|
child = Widget(Widget())
|
|
await pilot.app.mount(child)
|
|
with pytest.raises(WidgetError):
|
|
pilot.app.screen.move_child(child, before=1, after=2)
|
|
|
|
# Test attempting to move a child that isn't ours.
|
|
async with App().run_test() as pilot:
|
|
child = Widget(Widget())
|
|
await pilot.app.mount(child)
|
|
with pytest.raises(WidgetError):
|
|
pilot.app.screen.move_child(Widget(), before=child)
|
|
|
|
# Test attempting to move relative to a widget that isn't a child.
|
|
async with App().run_test() as pilot:
|
|
child = Widget(Widget())
|
|
await pilot.app.mount(child)
|
|
with pytest.raises(WidgetError):
|
|
pilot.app.screen.move_child(child, before=Widget())
|
|
|
|
# Make a background set of widgets.
|
|
widgets = [Widget(id=f"widget-{n}") for n in range( 10 )]
|
|
|
|
# Test attempting to move past the end of the child list.
|
|
async with App().run_test() as pilot:
|
|
container = Widget(*widgets)
|
|
await pilot.app.mount(container)
|
|
with pytest.raises(WidgetError):
|
|
container.move_child(widgets[0], before=len(widgets)+10)
|
|
|
|
# Test attempting to move before the end of the child list.
|
|
async with App().run_test() as pilot:
|
|
container = Widget(*widgets)
|
|
await pilot.app.mount(container)
|
|
with pytest.raises(WidgetError):
|
|
container.move_child(widgets[0], before=-(len(widgets)+10))
|
|
|
|
# Test the different permutations of moving one widget before another.
|
|
perms = (
|
|
( 1, 0 ),
|
|
( widgets[1], 0 ),
|
|
( 1, widgets[ 0 ] ),
|
|
( widgets[ 1 ], widgets[ 0 ])
|
|
)
|
|
for child, target in perms:
|
|
async with App().run_test() as pilot:
|
|
container = Widget(*widgets)
|
|
await pilot.app.mount(container)
|
|
container.move_child(child, before=target)
|
|
assert container.children[0].id == "widget-1"
|
|
assert container.children[1].id == "widget-0"
|
|
assert container.children[2].id == "widget-2"
|
|
|
|
# Test the different permutations of moving one widget after another.
|
|
perms = (
|
|
( 0, 1 ),
|
|
( widgets[0], 1 ),
|
|
( 0, widgets[ 1 ] ),
|
|
( widgets[ 0 ], widgets[ 1 ])
|
|
)
|
|
for child, target in perms:
|
|
async with App().run_test() as pilot:
|
|
container = Widget(*widgets)
|
|
await pilot.app.mount(container)
|
|
container.move_child(child, after=target)
|
|
assert container.children[0].id == "widget-1"
|
|
assert container.children[1].id == "widget-0"
|
|
assert container.children[2].id == "widget-2"
|
|
|
|
# Test moving after a child after the last child.
|
|
async with App().run_test() as pilot:
|
|
container = Widget(*widgets)
|
|
await pilot.app.mount(container)
|
|
container.move_child(widgets[0], after=widgets[-1])
|
|
assert container.children[0].id == "widget-1"
|
|
assert container.children[-1].id == "widget-0"
|
|
|
|
# Test moving after a child after the last child's numeric position.
|
|
async with App().run_test() as pilot:
|
|
container = Widget(*widgets)
|
|
await pilot.app.mount(container)
|
|
container.move_child(widgets[0], after=widgets[9])
|
|
assert container.children[0].id == "widget-1"
|
|
assert container.children[-1].id == "widget-0"
|