rmux-core 0.9.1

Core session, pane, layout, format, hook, and buffer model for the RMUX terminal multiplexer.
Documentation
use std::collections::BTreeMap;

use super::{session_name, Session};
use crate::{SessionId, WINLINK_ACTIVITY, WINLINK_BELL};
use rmux_proto::TerminalSize;

fn grouped_sessions() -> (Session, Session) {
    let size = TerminalSize { cols: 80, rows: 24 };
    let mut source = Session::new(session_name("owner"), size);
    source.create_window(size).expect("second window");
    let peer = source.clone_as_group_member(
        session_name("peer"),
        session_name("owner"),
        SessionId::new(2),
    );
    (source, peer)
}

#[test]
fn group_sync_preserves_peer_local_winlink_alert_flags() {
    let (mut source, mut peer) = grouped_sessions();
    assert!(source.add_winlink_alert_flags(0, WINLINK_BELL));
    assert!(peer.add_winlink_alert_flags(1, WINLINK_ACTIVITY));

    peer.synchronize_group_from(&source);

    assert_eq!(peer.winlink_alert_flags(0), crate::AlertFlags::empty());
    assert_eq!(peer.winlink_alert_flags(1), WINLINK_ACTIVITY);
}

#[test]
fn group_sync_rekeys_peer_alert_flags_with_explicit_window_map() {
    let (mut source, mut peer) = grouped_sessions();
    assert!(peer.add_winlink_alert_flags(1, WINLINK_ACTIVITY));
    let index_map = source
        .reindex_windows_from(1)
        .expect("source window reindex succeeds");

    peer.synchronize_group_from_with_window_selection_map(&source, &index_map);

    assert_eq!(peer.winlink_alert_flags(1), crate::AlertFlags::empty());
    assert_eq!(peer.winlink_alert_flags(2), WINLINK_ACTIVITY);
}

#[test]
fn group_sync_duplicate_alias_removal_preserves_surviving_slot_flags() {
    let size = TerminalSize { cols: 80, rows: 24 };
    let mut source = Session::new(session_name("owner-duplicate"), size);
    let duplicate = source.window_at(0).expect("source window").clone();
    source
        .link_window(1, duplicate, false, false)
        .expect("duplicate alias insert succeeds");
    let mut peer = source.clone_as_group_member(
        session_name("peer-duplicate"),
        session_name("owner-duplicate"),
        SessionId::new(3),
    );
    assert!(peer.add_winlink_alert_flags(0, WINLINK_BELL));
    assert!(peer.add_winlink_alert_flags(1, WINLINK_ACTIVITY));
    source
        .remove_window(0)
        .expect("source duplicate alias removal succeeds");

    peer.synchronize_group_from(&source);

    assert_eq!(peer.winlink_alert_flags(1), WINLINK_ACTIVITY);
}

#[test]
fn group_sync_separates_peer_selection_from_duplicate_alias_alert_permutation() {
    let size = TerminalSize { cols: 80, rows: 24 };
    let mut source = Session::new(session_name("owner-swap-duplicate"), size);
    let duplicate = source.window_at(0).expect("source window").clone();
    source
        .link_window(1, duplicate, false, false)
        .expect("duplicate alias insert succeeds");
    let mut peer = source.clone_as_group_member(
        session_name("peer-swap-duplicate"),
        session_name("owner-swap-duplicate"),
        SessionId::new(4),
    );
    peer.select_window(1)
        .expect("peer selects the second winlink");
    assert!(peer.add_winlink_alert_flags(0, WINLINK_ACTIVITY));

    source.swap_windows(0, 1).expect("source aliases swap");
    peer.synchronize_group_from_with_window_selection_and_winlink_alert_maps(
        &source,
        &BTreeMap::new(),
        &BTreeMap::from([(0, 1), (1, 0)]),
    );

    assert_eq!(peer.active_window_index(), 1);
    assert_eq!(peer.last_window_index(), Some(0));
    assert_eq!(peer.winlink_alert_flags(0), crate::AlertFlags::empty());
    assert_eq!(peer.winlink_alert_flags(1), WINLINK_ACTIVITY);
}