rmux-server 0.10.0

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use super::render_pane_screen;
use rmux_core::input::InputParser;
use rmux_core::{GridRenderOptions, OptionStore, Screen, ScreenCaptureRange, Session};
use rmux_proto::{SessionName, TerminalSize};

const PANE_SIZE: TerminalSize = TerminalSize { cols: 8, rows: 6 };

fn parsed_screen(bytes: &[u8], size: TerminalSize) -> Screen {
    let mut screen = Screen::new(size, 100);
    let mut parser = InputParser::new();
    parser.parse(bytes, &mut screen);
    screen
}

fn visible_transcript(screen: &Screen) -> Vec<u8> {
    screen.capture_transcript(ScreenCaptureRange::default(), GridRenderOptions::default())
}

#[test]
fn attached_render_keeps_the_blank_row_created_by_complete_continuation_erase() {
    let terminal_size = TerminalSize { cols: 8, rows: 7 };
    let session = Session::new(
        SessionName::new("alpha").expect("valid session name"),
        terminal_size,
    );
    let pane = session.window().pane(0).expect("pane 0");
    let screen = parsed_screen(b"abcdefghijkl\x1b[2;1H\x1b[2K\x1b[3;1HNEXT", PANE_SIZE);

    let frame = render_pane_screen(&session, &OptionStore::new(), pane, &screen);
    assert_eq!(visible_transcript(&screen), b"abcdefgh\n\nNEXT\n\n\n\n");
    let first = frame
        .windows(b"\x1b[1;1H\x1b[0mabcdefgh".len())
        .position(|bytes| bytes == b"\x1b[1;1H\x1b[0mabcdefgh")
        .expect("attached frame paints the wrapped predecessor");
    let blank = frame
        .windows(b"\x1b[2;1H\x1b[0m\x1b[K".len())
        .position(|bytes| bytes == b"\x1b[2;1H\x1b[0m\x1b[K")
        .expect("attached frame clears the erased continuation row");
    let next = frame
        .windows(b"\x1b[3;1H\x1b[0mNEXT".len())
        .position(|bytes| bytes == b"\x1b[3;1H\x1b[0mNEXT")
        .expect("attached frame paints the following hard line");
    assert!(first < blank && blank < next);
}