70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import curses
|
|
from band_aider.ui.report_ui import ReportUIState, handle_report_key
|
|
|
|
def test_report_ui_state_bounds():
|
|
# Test max_scroll_offset
|
|
state = ReportUIState(line_count=10, visible_line_count=3)
|
|
assert state.max_scroll_offset() == 7
|
|
|
|
state = ReportUIState(line_count=0, visible_line_count=3)
|
|
assert state.max_scroll_offset() == 0
|
|
|
|
state = ReportUIState(line_count=10, visible_line_count=0)
|
|
assert state.max_scroll_offset() == 9
|
|
|
|
state = ReportUIState(line_count=10, visible_line_count=10)
|
|
assert state.max_scroll_offset() == 0
|
|
|
|
# Test clamp_scroll_offset
|
|
state = ReportUIState(scroll_offset=15, line_count=10, visible_line_count=3)
|
|
state.clamp_scroll_offset()
|
|
assert state.scroll_offset == 7
|
|
|
|
state = ReportUIState(scroll_offset=-5, line_count=10, visible_line_count=3)
|
|
state.clamp_scroll_offset()
|
|
assert state.scroll_offset == 0
|
|
|
|
def test_handle_report_key_navigation():
|
|
state = ReportUIState(scroll_offset=5, line_count=10, visible_line_count=3)
|
|
|
|
# UP
|
|
exit_status, _ = handle_report_key(curses.KEY_UP, state)
|
|
assert not exit_status
|
|
assert state.scroll_offset == 4
|
|
|
|
# DOWN
|
|
exit_status, _ = handle_report_key(curses.KEY_DOWN, state)
|
|
assert not exit_status
|
|
assert state.scroll_offset == 5
|
|
|
|
# Test bounds for DOWN
|
|
state.scroll_offset = 7
|
|
handle_report_key(curses.KEY_DOWN, state)
|
|
assert state.scroll_offset == 7 # max_scroll_offset is 7
|
|
|
|
# Exit keys
|
|
for key in [ord("q"), ord("Q"), 27, 3]:
|
|
exit_status, _ = handle_report_key(key, state)
|
|
assert exit_status is True
|
|
|
|
# Other key
|
|
exit_status, _ = handle_report_key(ord("a"), state)
|
|
assert not exit_status
|
|
|
|
def test_report_ui_state_selects_the_visible_content_window() -> None:
|
|
"""Scroll state retains the exact window that a terminal renderer consumes."""
|
|
|
|
lines = [f"Line {i}" for i in range(10)]
|
|
state = ReportUIState(scroll_offset=2, line_count=len(lines), visible_line_count=6)
|
|
|
|
state.clamp_scroll_offset()
|
|
|
|
assert state.scroll_offset == 2
|
|
assert lines[state.scroll_offset : state.scroll_offset + state.visible_line_count] == [
|
|
"Line 2",
|
|
"Line 3",
|
|
"Line 4",
|
|
"Line 5",
|
|
"Line 6",
|
|
"Line 7",
|
|
]
|