use super::*;
#[test]
fn scroll_up_down() {
let mut parser = crate::Parser::new(TerminalSize { rows: 3, cols: 80 }, 10);
for i in 0..6 {
process(&mut parser, format!("line{i}\r\n").as_bytes());
}
assert!(parser.screen().scrollback_available() > 0);
assert_eq!(parser.screen().scrollback(), 0);
parser.screen_mut().scroll_up(2);
assert_eq!(
parser.screen().scrollback(),
2,
"scroll_up(2) should advance the scrollback offset by 2",
);
parser.screen_mut().scroll_down(1);
assert_eq!(
parser.screen().scrollback(),
1,
"scroll_down(1) should walk the offset back toward live by 1",
);
parser.screen_mut().scroll_reset();
assert_eq!(
parser.screen().scrollback(),
0,
"scroll_reset must drop back to the live view (offset 0)",
);
}
#[test]
fn scroll_clamp() {
let mut parser = crate::Parser::new(TerminalSize { rows: 3, cols: 80 }, 10);
for i in 0..6 {
process(&mut parser, format!("line{i}\r\n").as_bytes());
}
let available = parser.screen().scrollback_available();
parser.screen_mut().scroll_up(100);
assert_eq!(
parser.screen().scrollback(),
available,
"scroll_up beyond capacity must clamp to scrollback_available, not overflow",
);
parser.screen_mut().scroll_down(200);
assert_eq!(
parser.screen().scrollback(),
0,
"scroll_down past live must clamp to 0, not wrap underneath",
);
}
#[test]
fn scroll_to_absolute() {
let mut parser = crate::Parser::new(TerminalSize { rows: 3, cols: 10 }, 100);
for i in 0..10 {
parser.process(format!("line {i}\r\n").as_bytes());
}
let available = parser.screen().scrollback_available();
assert!(available > 0);
parser.screen_mut().scroll_to(available);
assert_eq!(
parser.screen().scrollback(),
available,
"scroll_to(available) should pin the view at the oldest visible row",
);
parser.screen_mut().scroll_to(0);
assert_eq!(
parser.screen().scrollback(),
0,
"scroll_to(0) should snap back to the live view",
);
parser.screen_mut().scroll_to(9999);
assert_eq!(
parser.screen().scrollback(),
available,
"scroll_to(out-of-range) must clamp to available rather than panic or overshoot",
);
}