rmux-server 0.1.0

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use super::*;

#[test]
fn render_visible_item_hides_single_pane_branch_marker_in_window_tree() {
    let state = HandlerState::default();
    let utf8 = Utf8Config::default();
    let mut mode = test_mode(10);
    mode.key_format.clear();
    mode.tree_depth = TreeDepth::Window;
    let item = ModeTreeItem {
        id: "window".to_owned(),
        parent: Some("session".to_owned()),
        children: vec!["pane".to_owned()],
        depth: 1,
        line: "1: shell".to_owned(),
        search_text: String::new(),
        preview: Vec::new(),
        no_tag: false,
        action: ModeTreeAction::None,
    };
    let build = ModeTreeBuild {
        items: BTreeMap::from([
            (
                "session".to_owned(),
                ModeTreeItem {
                    id: "session".to_owned(),
                    parent: None,
                    children: vec!["window".to_owned()],
                    depth: 0,
                    line: String::new(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
            (item.id.clone(), item.clone()),
            (
                "pane".to_owned(),
                ModeTreeItem {
                    id: "pane".to_owned(),
                    parent: Some("window".to_owned()),
                    children: Vec::new(),
                    depth: 2,
                    line: String::new(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
        ]),
        roots: vec!["session".to_owned()],
        order: vec!["session".to_owned(), "window".to_owned(), "pane".to_owned()],
        visible: vec!["session".to_owned(), "window".to_owned()],
        no_matches: false,
    };

    let rendered = render_visible_item(&state, &mode, &build, &item, 1, 0, &utf8);

    assert_eq!(rendered, "└─>   1: shell");
}

#[test]
fn render_visible_item_keeps_branch_marker_for_multi_pane_window_tree_item() {
    let state = HandlerState::default();
    let utf8 = Utf8Config::default();
    let mut mode = test_mode(10);
    mode.key_format.clear();
    mode.tree_depth = TreeDepth::Window;
    let item = ModeTreeItem {
        id: "window".to_owned(),
        parent: Some("session".to_owned()),
        children: vec!["pane0".to_owned(), "pane1".to_owned()],
        depth: 1,
        line: "0: shell*".to_owned(),
        search_text: String::new(),
        preview: Vec::new(),
        no_tag: false,
        action: ModeTreeAction::None,
    };
    let build = ModeTreeBuild {
        items: BTreeMap::from([
            (
                "session".to_owned(),
                ModeTreeItem {
                    id: "session".to_owned(),
                    parent: None,
                    children: vec!["window".to_owned()],
                    depth: 0,
                    line: String::new(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
            (item.id.clone(), item.clone()),
        ]),
        roots: vec!["session".to_owned()],
        order: vec!["session".to_owned(), "window".to_owned()],
        visible: vec!["session".to_owned(), "window".to_owned()],
        no_matches: false,
    };

    let rendered = render_visible_item(&state, &mode, &build, &item, 1, 0, &utf8);

    assert_eq!(rendered, "└─> + 0: shell*");
}

#[test]
fn render_visible_item_omits_extra_leaf_padding_for_flat_pane_lists() {
    let state = HandlerState::default();
    let utf8 = Utf8Config::default();
    let mut mode = test_mode(10);
    mode.key_format.clear();
    mode.tree_depth = TreeDepth::Pane;
    let item = ModeTreeItem {
        id: "pane0".to_owned(),
        parent: Some("window".to_owned()),
        children: Vec::new(),
        depth: 2,
        line: "0: bash".to_owned(),
        search_text: String::new(),
        preview: Vec::new(),
        no_tag: false,
        action: ModeTreeAction::None,
    };
    let build = ModeTreeBuild {
        items: BTreeMap::from([
            (
                "session0".to_owned(),
                ModeTreeItem {
                    id: "session0".to_owned(),
                    parent: None,
                    children: vec!["window".to_owned()],
                    depth: 0,
                    line: String::new(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
            (
                "session1".to_owned(),
                ModeTreeItem {
                    id: "session1".to_owned(),
                    parent: None,
                    children: Vec::new(),
                    depth: 0,
                    line: String::new(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
            (
                "window".to_owned(),
                ModeTreeItem {
                    id: "window".to_owned(),
                    parent: Some("session0".to_owned()),
                    children: vec!["pane0".to_owned(), "pane1".to_owned()],
                    depth: 1,
                    line: String::new(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
            (item.id.clone(), item.clone()),
            (
                "pane1".to_owned(),
                ModeTreeItem {
                    id: "pane1".to_owned(),
                    parent: Some("window".to_owned()),
                    children: Vec::new(),
                    depth: 2,
                    line: "1: bash".to_owned(),
                    search_text: String::new(),
                    preview: Vec::new(),
                    no_tag: false,
                    action: ModeTreeAction::None,
                },
            ),
        ]),
        roots: vec!["session0".to_owned(), "session1".to_owned()],
        order: vec![
            "session0".to_owned(),
            "window".to_owned(),
            "pane0".to_owned(),
            "pane1".to_owned(),
            "session1".to_owned(),
        ],
        visible: vec![
            "session0".to_owned(),
            "window".to_owned(),
            "pane0".to_owned(),
            "pane1".to_owned(),
            "session1".to_owned(),
        ],
        no_matches: false,
    };

    let rendered = render_visible_item(&state, &mode, &build, &item, 2, 0, &utf8);

    assert_eq!(rendered, "│   ├─> 0: bash");
}

#[test]
fn render_mode_tree_overlay_keeps_cursor_hidden_while_active() {
    let mut state = HandlerState::default();
    state
        .sessions
        .create_session(
            SessionName::new("test").expect("valid session"),
            rmux_proto::TerminalSize { cols: 80, rows: 24 },
        )
        .expect("session create succeeds");
    let mut mode = test_mode(10);
    mode.selected_id = Some("root".to_owned());
    let build = flat_build(&["root"]);

    let frame = render_mode_tree_overlay(&state, &mode, &build);

    let rendered = String::from_utf8_lossy(&frame);
    assert!(rendered.contains("\u{1b}[?25l"));
    assert!(!rendered.contains("\u{1b}[?25h"));
}