tastty-core 0.1.0

Sans-IO core of the tastty terminal session library: VT parser, screen buffer, and byte encoders.
use super::*;

#[test]
fn decrqm_auto_wrap_default_set() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Query ?7 (auto-wrap), should be set by default
    process(&mut parser, b"\x1b[?7$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?7;1$y");
}

#[test]
fn decrqm_auto_wrap_after_reset() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Disable auto-wrap, then query
    process(&mut parser, b"\x1b[?7l\x1b[?7$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?7;2$y");
}

#[test]
fn decrqm_cursor_visible_default() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // ?25 should be set (cursor visible) by default
    process(&mut parser, b"\x1b[?25$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?25;1$y");
}

#[test]
fn decrqm_cursor_hidden() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Hide cursor, then query
    process(&mut parser, b"\x1b[?25l\x1b[?25$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?25;2$y");
}

#[test]
fn decrqm_bracketed_paste_off_by_default() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?2004$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2004;2$y");
}

#[test]
fn decrqm_bracketed_paste_on() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?2004h\x1b[?2004$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2004;1$y");
}

#[test]
fn decrqm_sync_update() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?2026$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2026;2$y");
    process(&mut parser, b"\x1b[?2026h\x1b[?2026$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2026;1$y");
}

#[test]
fn decrqm_focus_in_out() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?1004h\x1b[?1004$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1004;1$y");
}

#[test]
fn decrqm_mouse_modes() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Normal mouse (1000) off by default
    process(&mut parser, b"\x1b[?1000$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1000;2$y");
    // Enable and query
    process(&mut parser, b"\x1b[?1000h\x1b[?1000$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1000;1$y");
    // SGR mouse (1006)
    process(&mut parser, b"\x1b[?1006h\x1b[?1006$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1006;1$y");
}

#[test]
fn decrqm_alt_screen() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?1049$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1049;2$y");
    process(&mut parser, b"\x1b[?1049h\x1b[?1049$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1049;1$y");
}

#[test]
fn decrqm_unknown_mode() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Unknown mode 9999 should return 0 (not recognized)
    process(&mut parser, b"\x1b[?9999$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?9999;0$y");
}

#[test]
fn decrqm_color_scheme_updates() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Default: reset (2)
    process(&mut parser, b"\x1b[?2031$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2031;2$y");
    // Enable
    process(&mut parser, b"\x1b[?2031h\x1b[?2031$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2031;1$y");
    // Disable
    process(&mut parser, b"\x1b[?2031l\x1b[?2031$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2031;2$y");
}

#[test]
fn decrqm_in_band_resize() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?2048$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2048;2$y");
    process(&mut parser, b"\x1b[?2048h\x1b[?2048$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?2048;1$y");
}

#[test]
fn decrqm_sgr_pixel_mouse() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?1016$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1016;2$y");
    process(&mut parser, b"\x1b[?1016h\x1b[?1016$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?1016;1$y");
}

#[test]
fn ansi_mode_report_insert() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Query insert mode (4), off by default
    process(&mut parser, b"\x1b[4$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[4;2$y");
    // Enable insert mode, query again
    process(&mut parser, b"\x1b[4h\x1b[4$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[4;1$y");
}

#[test]
fn decrqm_reverse_video() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // ?5 reverse video: reset by default
    process(&mut parser, b"\x1b[?5$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?5;2$y");
    // Enable, query again
    process(&mut parser, b"\x1b[?5h\x1b[?5$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?5;1$y");
    // Disable, query again
    process(&mut parser, b"\x1b[?5l\x1b[?5$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?5;2$y");
}

#[test]
fn decrqm_mouse_x10() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // ?9 X10 mouse reporting: reset by default
    process(&mut parser, b"\x1b[?9$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?9;2$y");
    // Enable, query again
    process(&mut parser, b"\x1b[?9h\x1b[?9$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?9;1$y");
    // Disable, query again
    process(&mut parser, b"\x1b[?9l\x1b[?9$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?9;2$y");
}

#[test]
fn decrqm_backspace_bs() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // ?67 DECBKM (Backspace sends BS rather than DEL): reset by default
    process(&mut parser, b"\x1b[?67$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?67;2$y");
    // Enable, query again
    process(&mut parser, b"\x1b[?67h\x1b[?67$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?67;1$y");
    // Disable, query again
    process(&mut parser, b"\x1b[?67l\x1b[?67$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[?67;2$y");
}

#[test]
fn ansi_mode_report_lnm() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // ANSI mode 20 (LNM): reset by default
    process(&mut parser, b"\x1b[20$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[20;2$y");
    // Enable LNM via SM, query again
    process(&mut parser, b"\x1b[20h\x1b[20$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[20;1$y");
    // Disable LNM via RM, query again
    process(&mut parser, b"\x1b[20l\x1b[20$p");
    assert_eq!(drain_replies(&mut parser), b"\x1b[20;2$y");
}