band-aider-pub/tests/ui/test_report_ui.py
2026-10-17 11:57:37 -07:00

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",
]