use super::*;
#[test]
fn deccolm_set_erases_screen_and_homes_cursor() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
process(&mut parser, b"\x1b[?40h");
process(&mut parser, b"hello");
process(&mut parser, b"\x1b[10;20H");
process(&mut parser, b"\x1b[5;10r");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
process(&mut parser, b"\x1b[?3h");
assert!(!parser.screen().cell(0, 0).unwrap().has_contents());
assert_eq!(parser.screen().cursor(), Position { row: 0, col: 0 });
process(&mut parser, b"\x1b[24;1H\n");
assert_eq!(parser.screen().cursor().row, 23);
}
#[test]
fn deccolm_reset_also_erases_and_homes() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
process(&mut parser, b"\x1b[?40h");
process(&mut parser, b"\x1b[?3h");
process(&mut parser, b"hello");
process(&mut parser, b"\x1b[10;20H");
process(&mut parser, b"\x1b[5;10r");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
process(&mut parser, b"\x1b[?3l");
assert!(!parser.screen().cell(0, 0).unwrap().has_contents());
assert_eq!(parser.screen().cursor(), Position { row: 0, col: 0 });
process(&mut parser, b"\x1b[24;1H\n");
assert_eq!(parser.screen().cursor().row, 23);
}
#[test]
fn deccolm_idempotent_set_does_not_re_erase() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
process(&mut parser, b"\x1b[?40h");
process(&mut parser, b"\x1b[?3h");
process(&mut parser, b"hello");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
process(&mut parser, b"\x1b[?3h");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
process(&mut parser, b"\x1b[?3l");
process(&mut parser, b"world");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "w");
process(&mut parser, b"\x1b[?3l");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "w");
}
#[test]
fn deccolm_emits_screen_cleared_event() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
process(&mut parser, b"\x1b[?40h");
let _ = parser.screen_mut().drain_events();
process(&mut parser, b"\x1b[?3h");
let events = parser.screen_mut().drain_events();
assert!(events.contains(&ScreenEvent::ScreenCleared));
process(&mut parser, b"\x1b[?3l");
let events = parser.screen_mut().drain_events();
assert!(events.contains(&ScreenEvent::ScreenCleared));
}
#[test]
fn deccolm_set_no_op_when_dec40_unset() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
process(&mut parser, b"hello");
process(&mut parser, b"\x1b[10;20H");
process(&mut parser, b"\x1b[5;10r");
let cursor_before = parser.screen().cursor();
let _ = parser.screen_mut().drain_events();
process(&mut parser, b"\x1b[?3h");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
assert_eq!(parser.screen().cursor(), cursor_before);
assert!(!parser.screen().has_mode_bit(MODE_DECCOLM));
let events = parser.screen_mut().drain_events();
assert!(!events.contains(&ScreenEvent::ScreenCleared));
process(&mut parser, b"\x1b[?3l");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
assert_eq!(parser.screen().cursor(), cursor_before);
assert!(!parser.screen().has_mode_bit(MODE_DECCOLM));
let events = parser.screen_mut().drain_events();
assert!(!events.contains(&ScreenEvent::ScreenCleared));
}
#[test]
fn deccolm_set_runs_side_effects_when_dec40_set() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
process(&mut parser, b"hello");
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "h");
process(&mut parser, b"\x1b[?40h\x1b[?3h");
assert!(!parser.screen().cell(0, 0).unwrap().has_contents());
assert_eq!(parser.screen().cursor(), Position { row: 0, col: 0 });
assert!(parser.screen().has_mode_bit(MODE_DECCOLM));
}
#[test]
fn dec40_round_trip_via_decset_decrst() {
let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
assert!(!parser.screen().has_mode_bit(MODE_DEC_ALLOW_80_132));
process(&mut parser, b"\x1b[?40h");
assert!(parser.screen().has_mode_bit(MODE_DEC_ALLOW_80_132));
process(&mut parser, b"\x1b[?40l");
assert!(!parser.screen().has_mode_bit(MODE_DEC_ALLOW_80_132));
}