use super::super::*;
use ratatui::{
Terminal,
backend::TestBackend,
widgets::{Paragraph, Wrap},
};
use std::cell::RefCell;
use tui_scrollview::ScrollViewState;
fn draw_reference(
frame: &mut Frame<'_>,
area: Rect,
text: &str,
scroll: &RefCell<ScrollViewState>,
theme: MissionControlTheme,
) {
let height = usize_to_u16_saturating(crate::tui::transcript::ratatui_wrapped_visual_rows(
text,
scroll_view_content_width(area).max(1),
));
render_scroll_view_persistent_state_with_theme(
frame,
area,
height,
Paragraph::new(text.to_owned())
.style(theme.pane())
.wrap(Wrap { trim: false }),
scroll,
theme,
);
}
fn large_text(label: &str) -> String {
let mut text = String::new();
for index in 0..400 {
text.push_str(&format!(
"{label}-{index:04} keep spaces\tand words 界 👩💻 e\u{301}\u{a0}together\r\n\
\n indented policy: abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ \n"
));
}
text.push_str("Last message line\n\n");
text
}
#[test]
#[ignore = "manual modal scrolling workload, not physical terminal latency; run with --release --ignored --nocapture"]
fn text_modal_large_document_workload() {
let text = large_text("system-prompt").repeat(4);
let scroll = RefCell::new(ScrollViewState::default());
let theme = MissionControlTheme::default();
let mut terminal = Terminal::new(TestBackend::new(120, 40)).unwrap();
let mut viewport_times = Vec::new();
let mut reference_times = Vec::new();
for offset in [0, 100, u16::MAX].into_iter().cycle().take(21) {
scroll.borrow_mut().set_offset(Position::new(0, offset));
let start = std::time::Instant::now();
terminal
.draw(|frame| {
render_text_scroll_view_with_theme(frame, frame.area(), &text, &scroll, theme);
})
.unwrap();
viewport_times.push(start.elapsed().as_micros());
let start = std::time::Instant::now();
terminal
.draw(|frame| {
draw_reference(frame, frame.area(), &text, &scroll, theme);
})
.unwrap();
reference_times.push(start.elapsed().as_micros());
}
viewport_times.sort_unstable();
reference_times.sort_unstable();
eprintln!(
"text_modal_large_document frames=21 viewport_median_us={} full_reference_median_us={} width=120 height=40 physical_terminal=false",
viewport_times[10], reference_times[10],
);
}