mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Up until now I've only been allowing tuples; mostly a hangover from the initial take on this. Things have drifted a bit now and I feel it makes sense to allow Selection instances in too.
90 lines
3.4 KiB
Python
90 lines
3.4 KiB
Python
"""Core selection list unit tests, aimed at testing basic list creation.
|
|
|
|
Note that the vast majority of the API *isn't* tested in here as
|
|
`SelectionList` inherits from `OptionList` and so that would be duplicated
|
|
effort. Instead these tests aim to just test the things that have been
|
|
changed or wrapped in some way.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
from rich.text import Text
|
|
|
|
from textual.app import App, ComposeResult
|
|
from textual.widgets import SelectionList
|
|
from textual.widgets.option_list import Option
|
|
from textual.widgets.selection_list import Selection, SelectionError
|
|
|
|
|
|
class SelectionListApp(App[None]):
|
|
"""Test selection list application."""
|
|
|
|
def compose(self) -> ComposeResult:
|
|
yield SelectionList[int](
|
|
("0", 0),
|
|
("1", 1, False),
|
|
("2", 2, True),
|
|
Selection("3", 3, id="3"),
|
|
Selection("4", 4, True, id="4"),
|
|
)
|
|
|
|
|
|
async def test_all_parameters_become_selctions() -> None:
|
|
"""All input parameters to a list should become selections."""
|
|
async with SelectionListApp().run_test() as pilot:
|
|
selections = pilot.app.query_one(SelectionList)
|
|
assert selections.option_count == 5
|
|
for n in range(5):
|
|
assert isinstance(selections.get_option_at_index(n), Selection)
|
|
|
|
|
|
async def test_get_selection_by_index() -> None:
|
|
"""It should be possible to get a selection by index."""
|
|
async with SelectionListApp().run_test() as pilot:
|
|
option_list = pilot.app.query_one(SelectionList)
|
|
for n in range(5):
|
|
assert option_list.get_option_at_index(n).prompt == Text(str(n))
|
|
assert option_list.get_option_at_index(-1).prompt == Text("4")
|
|
|
|
|
|
async def test_get_selection_by_id() -> None:
|
|
"""It should be possible to get a selection by ID."""
|
|
async with SelectionListApp().run_test() as pilot:
|
|
option_list = pilot.app.query_one(SelectionList)
|
|
assert option_list.get_option("3").prompt == Text("3")
|
|
assert option_list.get_option("4").prompt == Text("4")
|
|
|
|
|
|
async def test_add_later() -> None:
|
|
"""It should be possible to add more items to a selection list."""
|
|
async with SelectionListApp().run_test() as pilot:
|
|
selections = pilot.app.query_one(SelectionList)
|
|
assert selections.option_count == 5
|
|
selections.add_option(("5", 5))
|
|
assert selections.option_count == 6
|
|
selections.add_option(Selection("6", 6))
|
|
assert selections.option_count == 7
|
|
selections.add_options(
|
|
[Selection("7", 7), Selection("8", 8, True), ("9", 9), ("10", 10, True)]
|
|
)
|
|
assert selections.option_count == 11
|
|
selections.add_options([])
|
|
assert selections.option_count == 11
|
|
|
|
|
|
async def test_add_non_selections() -> None:
|
|
"""Adding options that aren't selections should result in errors."""
|
|
async with SelectionListApp().run_test() as pilot:
|
|
selections = pilot.app.query_one(SelectionList)
|
|
with pytest.raises(SelectionError):
|
|
selections.add_option(None)
|
|
with pytest.raises(SelectionError):
|
|
selections.add_option(Option("Nope"))
|
|
with pytest.raises(SelectionError):
|
|
selections.add_option("Nope")
|
|
with pytest.raises(SelectionError):
|
|
selections.add_option(("Nope",))
|
|
with pytest.raises(SelectionError):
|
|
selections.add_option(("Nope", 0, False, 23))
|