use super::*;
use crate::output::{
ActivityEvent, ActivityId, ActivityKind, ActivityMetadata, ActivityStatus, OutputEvent,
ToolDisplaySummary, ToolStatus,
};
use ratatui::{backend::TestBackend, buffer::Buffer, style::Modifier};
use super::test_support::{find_text, find_text_in_area};
const TEST_PICKER_VISIBLE_ROWS: usize = crate::tui::input::DEFAULT_PICKER_VISIBLE_ROWS as usize;
fn rendered_text_in_area(buffer: &Buffer, area: Rect) -> String {
let mut rendered = String::new();
for y in area.y..area.y + area.height {
for x in area.x..area.x + area.width {
rendered.push_str(buffer[(x, y)].symbol());
}
rendered.push('\n');
}
rendered
}
fn assert_square_corners(buffer: &Buffer, area: Rect) {
assert_eq!(buffer[(area.x, area.y)].symbol(), "┌");
assert_eq!(buffer[(area.x + area.width - 1, area.y)].symbol(), "┐");
assert_eq!(buffer[(area.x, area.y + area.height - 1)].symbol(), "└");
assert_eq!(
buffer[(area.x + area.width - 1, area.y + area.height - 1)].symbol(),
"┘"
);
}
fn state_with_autocomplete() -> MissionControlState {
let mut state = MissionControlState {
input: "/n".to_string(),
prompt_cursor: 2,
focus_pane: crate::tui::state::TuiFocusPane::Prompt,
..Default::default()
};
state.recompute_autocomplete(&[
crate::tui::state::AutocompleteCandidate::slash_command("new", "start a new session"),
crate::tui::state::AutocompleteCandidate::slash_command("quit", "exit magi-code"),
]);
state
}
mod activity;
mod help;
mod layout;
mod misc;
mod modals;
mod prompt;
mod transcript;
#[test]
fn production_scroll_view_keeps_invariant_gutter_with_always_vertical_bar() {
use ratatui::{Terminal, widgets::Paragraph};
use std::cell::RefCell;
fn render(content_height: u16) -> Buffer {
let backend = TestBackend::new(6, 3);
let mut terminal = Terminal::new(backend).unwrap();
let scroll_state = RefCell::new(tui_scrollview::ScrollViewState::default());
terminal
.draw(|frame| {
render_scroll_view_persistent(
frame,
frame.area(),
0,
content_height,
Paragraph::new("one\ntwo\nthree\nfour"),
&scroll_state,
);
})
.unwrap();
terminal.backend().buffer().clone()
}
let without_overflow = render(3);
let with_overflow = render(4);
assert_eq!(without_overflow[(5, 1)].symbol(), "┃");
assert_eq!(without_overflow[(5, 1)].fg, MATRIX_GREEN.green_bright);
assert_eq!(without_overflow[(5, 1)].bg, ratatui::style::Color::Reset);
assert_eq!(with_overflow[(5, 1)].symbol(), "┃");
assert_eq!(with_overflow[(5, 1)].fg, MATRIX_GREEN.green_bright);
assert_eq!(with_overflow[(5, 1)].bg, ratatui::style::Color::Reset);
assert_eq!(with_overflow[(2, 2)].symbol(), "r");
}
#[test]
fn invariant_scroll_view_width_reserves_gutter_for_all_heights() {
let area = Rect::new(0, 0, 20, 4);
assert_eq!(scroll_view_content_width(area), 19);
assert_eq!(scroll_view_content_width(Rect::new(0, 0, 1, 4)), 0);
assert_eq!(scroll_view_content_width(Rect::new(0, 0, 0, 4)), 0);
}