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 bell_event_emitted_on_bel() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    assert!(parser.screen_mut().drain_events().is_empty());
    process(&mut parser, b"\x07");
    let events = parser.screen_mut().drain_events();
    assert!(events.contains(&ScreenEvent::Bell));
    assert!(parser.screen_mut().drain_events().is_empty());
}

#[test]
fn nel() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[20GA\x1bEB");
    let screen = parser.screen();
    assert_eq!(screen.cell(0, 19).unwrap().contents(), "A");
    // NEL should CR+LF: cursor at (1, 0), 'B' written there
    assert_eq!(screen.cell(1, 0).unwrap().contents(), "B");
}

#[test]
fn decaln() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 3, cols: 5 }, 0);
    process(&mut parser, b"\x1b#8");
    let screen = parser.screen();
    for row in 0..3 {
        for col in 0..5 {
            assert_eq!(screen.cell(row, col).unwrap().contents(), "E");
        }
    }
    assert_eq!(screen.cursor(), Position { row: 0, col: 0 });
}

#[test]
fn ed_mode_3_clears_scrollback() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 3, cols: 10 }, 100);
    // Fill 3 rows and scroll to build scrollback
    for _ in 0..5 {
        process(&mut parser, b"AAAAAAAAAA\n");
    }
    assert!(parser.screen().grid().scrollback() == 0);
    // Set some scrollback visible
    parser.screen_mut().set_scrollback(2);
    assert!(parser.screen().grid().scrollback() > 0);
    // CSI 3 J clears scrollback
    process(&mut parser, b"\x1b[3J");
    assert_eq!(parser.screen().grid().scrollback(), 0);
}