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 osc_0_sets_title_and_icon_name() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]0;my-title\x07");
    assert_eq!(parser.screen().title(), "my-title");
    assert_eq!(parser.screen().icon_name(), "my-title");
}

#[test]
fn osc_1_sets_icon_name_only() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]1;my-icon\x07");
    assert_eq!(parser.screen().title(), "");
    assert_eq!(parser.screen().icon_name(), "my-icon");
}

#[test]
fn osc_2_sets_title_only() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]2;my-window\x07");
    assert_eq!(parser.screen().title(), "my-window");
    assert_eq!(parser.screen().icon_name(), "");
}

#[test]
fn osc_st_terminator() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]0;st-title\x1b\\");
    assert_eq!(parser.screen().title(), "st-title");
}

#[test]
fn osc_title_overwrite() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]0;first\x07");
    assert_eq!(parser.screen().title(), "first");
    process(&mut parser, b"\x1b]2;second\x07");
    assert_eq!(parser.screen().title(), "second");
    assert_eq!(
        parser.screen().icon_name(),
        "first",
        "OSC 2 sets only the title, so the OSC 0 icon name must survive",
    );
}

#[test]
fn osc_title_reset_by_ris() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]0;hello\x07");
    assert_eq!(parser.screen().title(), "hello");
    process(&mut parser, b"\x1bc");
    assert_eq!(parser.screen().title(), "");
    assert_eq!(parser.screen().icon_name(), "");
}

#[test]
fn title_changed_event_osc_0() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    assert!(parser.screen_mut().drain_events().is_empty());
    process(&mut parser, b"\x1b]0;hello\x07");
    let events = parser.screen_mut().drain_events();
    assert!(events.contains(&ScreenEvent::TitleChanged));
    assert!(parser.screen_mut().drain_events().is_empty());
}

#[test]
fn title_changed_event_osc_1() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]1;icon\x07");
    let events = parser.screen_mut().drain_events();
    assert!(events.contains(&ScreenEvent::TitleChanged));
    assert!(parser.screen_mut().drain_events().is_empty());
}

#[test]
fn title_changed_event_osc_2() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]2;window\x07");
    let events = parser.screen_mut().drain_events();
    assert!(events.contains(&ScreenEvent::TitleChanged));
    assert!(parser.screen_mut().drain_events().is_empty());
}

#[test]
fn title_changed_event_ris_with_prior_title() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1b]0;hello\x07");
    let _ = parser.screen_mut().drain_events();
    process(&mut parser, b"\x1bc");
    let events = parser.screen_mut().drain_events();
    assert!(events.contains(&ScreenEvent::TitleChanged));
}

#[test]
fn title_changed_event_ris_no_prior_title() {
    let mut parser = crate::Parser::new(TerminalSize { rows: 24, cols: 80 }, 0);
    process(&mut parser, b"\x1bc");
    let events = parser.screen_mut().drain_events();
    assert!(!events.contains(&ScreenEvent::TitleChanged));
}