112 lines
3.1 KiB
Python
112 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
from textual.app import App, ComposeResult
|
|
from textual.pilot import Pilot
|
|
from textual.widgets import Input
|
|
from textual_autocomplete import AutoComplete
|
|
|
|
|
|
class StyledAutocomplete(App[None]):
|
|
def compose(self) -> ComposeResult:
|
|
input = Input(placeholder="Search...")
|
|
input.cursor_blink = False
|
|
yield input
|
|
yield AutoComplete(target=input, candidates=["foo", "bar", "baz", "qux"])
|
|
|
|
|
|
def test_foreground_color_and_text_style(snap_compare):
|
|
"""Background color should not be impacted by the text foreground and style."""
|
|
StyledAutocomplete.CSS = """
|
|
AutoComplete {
|
|
& .autocomplete--highlight-match {
|
|
color: $text-accent;
|
|
text-style: bold italic underline;
|
|
}
|
|
}
|
|
"""
|
|
|
|
async def run_before(pilot: Pilot) -> None:
|
|
await pilot.press(*"ba")
|
|
|
|
assert snap_compare(StyledAutocomplete(), run_before=run_before)
|
|
|
|
|
|
def test_background_color_and_removed_style(snap_compare):
|
|
StyledAutocomplete.CSS = """
|
|
AutoComplete {
|
|
& .autocomplete--highlight-match {
|
|
color: $text-accent;
|
|
background: $success-muted;
|
|
text-style: not bold;
|
|
}
|
|
}
|
|
"""
|
|
|
|
async def run_before(pilot: Pilot) -> None:
|
|
await pilot.press(*"ba")
|
|
|
|
assert snap_compare(StyledAutocomplete(), run_before=run_before)
|
|
|
|
|
|
def test_max_height_and_scrolling(snap_compare):
|
|
"""We should be scrolled to qux, and the red scrollbar should reflect that."""
|
|
StyledAutocomplete.CSS = """
|
|
AutoComplete {
|
|
& AutoCompleteList {
|
|
scrollbar-color: red;
|
|
max-height: 2;
|
|
}
|
|
}
|
|
"""
|
|
|
|
async def run_before(pilot: Pilot) -> None:
|
|
await pilot.press("down", "down", "down", "down")
|
|
|
|
assert snap_compare(StyledAutocomplete(), run_before=run_before)
|
|
|
|
|
|
def test_dropdown_styles_match_textual_theme(snap_compare):
|
|
"""Dropdown styles should match the textual theme. In this test, we've swapped the theme to nord."""
|
|
StyledAutocomplete.CSS = """
|
|
AutoComplete {
|
|
& .autocomplete--highlight-match {
|
|
color: $text-accent;
|
|
}
|
|
}
|
|
"""
|
|
|
|
async def run_before(pilot: Pilot) -> None:
|
|
pilot.app.theme = "nord"
|
|
await pilot.press(*"ba")
|
|
|
|
assert snap_compare(StyledAutocomplete(), run_before=run_before)
|
|
|
|
|
|
def test_cursor_color_change_and_dropdown_background_change(snap_compare):
|
|
"""Checking various interactions between styles. See the test's CSS for info."""
|
|
StyledAutocomplete.CSS = """
|
|
AutoComplete {
|
|
|
|
& AutoCompleteList {
|
|
color: red;
|
|
background: $error-muted;
|
|
& > .option-list--option-highlighted {
|
|
color: $text-primary;
|
|
background: magenta;
|
|
text-style: italic;
|
|
}
|
|
}
|
|
|
|
& .autocomplete--highlight-match {
|
|
color: $text-success;
|
|
background: $success-muted;
|
|
text-style: underline;
|
|
}
|
|
|
|
}
|
|
"""
|
|
|
|
async def run_before(pilot: Pilot) -> None:
|
|
await pilot.press(*"ba")
|
|
|
|
assert snap_compare(StyledAutocomplete(), run_before=run_before)
|