143 lines
4.6 KiB
Python
143 lines
4.6 KiB
Python
import pytest
|
|
from textual.app import App
|
|
from textual_textarea import TextEditor
|
|
from textual_textarea.find_input import FindInput
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_find(app: App) -> None:
|
|
async with app.run_test() as pilot:
|
|
ta = app.query_one("#ta", expect_type=TextEditor)
|
|
ta.text = "foo bar\n" * 50
|
|
await pilot.pause()
|
|
assert ta.selection.start == ta.selection.end == (0, 0)
|
|
await pilot.press("ctrl+f")
|
|
|
|
find_input = app.query_one(FindInput)
|
|
assert find_input
|
|
assert find_input.has_focus
|
|
assert "Find" in find_input.placeholder
|
|
|
|
await pilot.press("b")
|
|
assert find_input.has_focus
|
|
assert ta.selection.start == (0, 4)
|
|
assert ta.selection.end == (0, 5)
|
|
|
|
await pilot.press("a")
|
|
assert find_input.has_focus
|
|
assert ta.selection.start == (0, 4)
|
|
assert ta.selection.end == (0, 6)
|
|
|
|
await pilot.press("enter")
|
|
assert find_input.has_focus
|
|
assert ta.selection.start == (1, 4)
|
|
assert ta.selection.end == (1, 6)
|
|
|
|
await pilot.press("escape")
|
|
assert ta.text_input
|
|
assert ta.text_input.has_focus
|
|
assert ta.selection.start == (1, 4)
|
|
assert ta.selection.end == (1, 6)
|
|
|
|
await pilot.press("ctrl+f")
|
|
|
|
find_input = app.query_one(FindInput)
|
|
await pilot.press("f")
|
|
assert find_input.has_focus
|
|
assert ta.selection.start == (2, 0)
|
|
assert ta.selection.end == (2, 1)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_find_history(app: App) -> None:
|
|
async with app.run_test() as pilot:
|
|
ta = app.query_one("#ta", expect_type=TextEditor)
|
|
ta.text = "foo bar\n" * 50
|
|
await pilot.pause()
|
|
|
|
# add an item to the history by pressing enter
|
|
await pilot.press("ctrl+f")
|
|
await pilot.press("a")
|
|
await pilot.press("enter")
|
|
await pilot.press("escape")
|
|
|
|
# re-open the find input and navigate the one-item
|
|
# history
|
|
await pilot.press("ctrl+f")
|
|
find_input = app.query_one(FindInput)
|
|
assert find_input.value == ""
|
|
await pilot.press("up")
|
|
assert find_input.value == "a"
|
|
await pilot.press("down")
|
|
assert find_input.value == ""
|
|
await pilot.press("up")
|
|
await pilot.press("up")
|
|
assert find_input.value == "a"
|
|
await pilot.press("down")
|
|
assert find_input.value == ""
|
|
|
|
# add an item to the history by closing the find input
|
|
await pilot.press("b")
|
|
await pilot.press("escape")
|
|
|
|
# navigate the two-item history
|
|
await pilot.press("ctrl+f")
|
|
find_input = app.query_one(FindInput)
|
|
assert find_input.value == ""
|
|
await pilot.press("up")
|
|
assert find_input.value == "b"
|
|
await pilot.press("down")
|
|
assert find_input.value == ""
|
|
await pilot.press("up")
|
|
assert find_input.value == "b"
|
|
await pilot.press("up")
|
|
assert find_input.value == "a"
|
|
await pilot.press("up")
|
|
assert find_input.value == "a"
|
|
await pilot.press("down")
|
|
assert find_input.value == "b"
|
|
await pilot.press("down")
|
|
assert find_input.value == ""
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_find_with_f3(app: App) -> None:
|
|
async with app.run_test() as pilot:
|
|
ta = app.query_one("#ta", expect_type=TextEditor)
|
|
ta.text = "foo bar\n" * 50
|
|
await pilot.pause()
|
|
assert ta.selection.start == ta.selection.end == (0, 0)
|
|
|
|
# pressing f3 with no history brings up an empty find box
|
|
await pilot.press("f3")
|
|
find_input = app.query_one(FindInput)
|
|
assert find_input
|
|
assert find_input.has_focus
|
|
assert find_input.value == ""
|
|
|
|
await pilot.press("b")
|
|
assert find_input.has_focus
|
|
assert ta.selection.start == (0, 4)
|
|
assert ta.selection.end == (0, 5)
|
|
|
|
# pressing f3 from the find input finds the next match
|
|
await pilot.press("f3")
|
|
assert find_input.has_focus
|
|
assert ta.selection.start == (1, 4)
|
|
assert ta.selection.end == (1, 5)
|
|
|
|
# close the find input and navigate up one line
|
|
await pilot.press("escape")
|
|
await pilot.press("up")
|
|
|
|
# pressing f3 with history prepopulates the find input
|
|
await pilot.press("f3")
|
|
find_input = app.query_one(FindInput)
|
|
assert find_input.value == "b"
|
|
assert ta.selection.start == (1, 4)
|
|
assert ta.selection.end == (1, 5)
|
|
|
|
# pressing again advances to the next match
|
|
await pilot.press("f3")
|
|
assert ta.selection.start == (2, 4)
|
|
assert ta.selection.end == (2, 5)
|