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 line_wrap_on_by_default() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Write 81 'A's, which should wrap to row 1
    let input: Vec<u8> = std::iter::repeat_n(b'A', 81).collect();
    process(&mut parser, &input);
    let screen = parser.screen();
    assert_eq!(screen.cell(0, 79).unwrap().contents(), "A");
    assert_eq!(screen.cell(1, 0).unwrap().contents(), "A");
    assert_eq!(screen.cursor(), Position { row: 1, col: 1 });
}

#[test]
fn line_wrap_off_clamps() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Disable line wrap, then write 81 'A's. Should stay on row 0
    process(&mut parser, b"\x1b[?7l");
    let input: Vec<u8> = std::iter::repeat_n(b'A', 81).collect();
    process(&mut parser, &input);
    let screen = parser.screen();
    assert_eq!(screen.cell(0, 79).unwrap().contents(), "A");
    assert!(!screen.cell(1, 0).unwrap().has_contents());
    assert_eq!(screen.cursor(), Position { row: 0, col: 79 });
}

#[test]
fn line_wrap_off_overwrites_last_col() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b[?7l");
    // Fill row with A, then write one more character. Last col should be B
    let mut input: Vec<u8> = std::iter::repeat_n(b'A', 80).collect();
    input.push(b'B');
    process(&mut parser, &input);
    let screen = parser.screen();
    assert_eq!(screen.cell(0, 79).unwrap().contents(), "B");
    assert_eq!(screen.cell(0, 78).unwrap().contents(), "A");
}

#[test]
fn line_wrap_reenable() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    // Disable then re-enable
    process(&mut parser, b"\x1b[?7l\x1b[?7h");
    let input: Vec<u8> = std::iter::repeat_n(b'A', 81).collect();
    process(&mut parser, &input);
    let screen = parser.screen();
    assert_eq!(screen.cell(1, 0).unwrap().contents(), "A");
}