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 initial_state() {
    let screen = make_screen(24, 80);
    assert_eq!(screen.size(), TerminalSize { rows: 24, cols: 80 });
    assert_eq!(screen.cursor(), Position { row: 0, col: 0 });
    assert!(!screen.mode(TerminalMode::HideCursor));
    assert!(!screen.mode(TerminalMode::AlternateScreen));
}

#[test]
fn text_and_cursor() {
    let mut screen = make_screen(24, 80);
    screen.text('H');
    screen.text('i');
    assert_eq!(screen.cursor(), Position { row: 0, col: 2 });
    let cell = screen.cell(0, 0).unwrap();
    assert_eq!(cell.contents(), "H");
    let cell = screen.cell(0, 1).unwrap();
    assert_eq!(cell.contents(), "i");
}

#[test]
fn cursor_movement_csi() {
    let mut screen = make_screen(24, 80);
    screen.cup((5, 10));
    assert_eq!(screen.cursor(), Position { row: 4, col: 9 });
}

#[test]
fn erase_display() {
    let mut screen = make_screen(24, 80);
    screen.text('A');
    screen.ed(2); // erase all
    assert!(!screen.cell(0, 0).unwrap().has_contents());
}

#[test]
fn linefeed_and_cr() {
    let mut screen = make_screen(24, 80);
    screen.text('A');
    screen.cr();
    assert_eq!(screen.cursor(), Position { row: 0, col: 0 });
    screen.lf();
    assert_eq!(screen.cursor(), Position { row: 1, col: 0 });
}

#[test]
fn reset() {
    let mut screen = make_screen(24, 80);
    screen.text('X');
    screen.cup((5, 5));
    assert!(screen.drain_events().is_empty());
    screen.ris();
    assert_eq!(screen.cursor(), Position { row: 0, col: 0 });
    assert!(!screen.cell(0, 0).unwrap().has_contents());
    let events = screen.drain_events();
    assert!(events.contains(&ScreenEvent::ScreenCleared));
    assert!(screen.drain_events().is_empty());
}

#[test]
fn clear_pending_on_ed2() {
    let mut screen = make_screen(24, 80);
    screen.text('A');
    assert!(screen.drain_events().is_empty());
    screen.ed(2);
    let events = screen.drain_events();
    assert!(events.contains(&ScreenEvent::ScreenCleared));
    assert!(screen.drain_events().is_empty());

    // ED 0 (erase forward) should not emit ScreenCleared
    screen.text('B');
    screen.ed(0);
    assert!(!screen.drain_events().contains(&ScreenEvent::ScreenCleared));
}

#[cfg(feature = "widget")]
#[test]
fn tui_term_screen_trait() {
    let mut screen = make_screen(24, 80);
    screen.text('Z');
    let cell: Option<&crate::cell::Cell> = tui_term::widget::Screen::cell(&screen, 0, 0);
    assert!(cell.is_some());
}