vt100 0.3.1

Library for parsing terminal data
Documentation
#![allow(clippy::cognitive_complexity)]

#[test]
fn colors() {
    let mut parser = vt100::Parser::new(24, 80);
    assert_eq!(parser.screen().fgcolor(), vt100::Color::Default);
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Default);

    parser.process(b"foo\x1b[31mbar");

    assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "f");
    assert_eq!(
        parser.screen().cell(0, 0).unwrap().fgcolor(),
        vt100::Color::Default
    );
    assert_eq!(
        parser.screen().cell(0, 0).unwrap().bgcolor(),
        vt100::Color::Default
    );

    assert_eq!(parser.screen().cell(0, 3).unwrap().contents(), "b");
    assert_eq!(
        parser.screen().cell(0, 3).unwrap().fgcolor(),
        vt100::Color::Idx(1)
    );
    assert_eq!(
        parser.screen().cell(0, 3).unwrap().bgcolor(),
        vt100::Color::Default
    );

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Idx(1));
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Default);

    parser.process(b"\x1b[2D\x1b[45mab");

    assert_eq!(parser.screen().cell(0, 4).unwrap().contents(), "a");
    assert_eq!(
        parser.screen().cell(0, 4).unwrap().fgcolor(),
        vt100::Color::Idx(1)
    );
    assert_eq!(
        parser.screen().cell(0, 4).unwrap().bgcolor(),
        vt100::Color::Idx(5)
    );

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Idx(1));
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Idx(5));

    parser.process(b"\x1b[m");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Default);
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Default);

    parser.process(b"\x1b[15;15Hfoo\x1b[31mbar\x1b[m");

    assert_eq!(parser.screen().cell(14, 14).unwrap().contents(), "f");
    assert_eq!(
        parser.screen().cell(14, 14).unwrap().fgcolor(),
        vt100::Color::Default
    );
    assert_eq!(
        parser.screen().cell(14, 14).unwrap().bgcolor(),
        vt100::Color::Default
    );

    assert_eq!(parser.screen().cell(14, 17).unwrap().contents(), "b");
    assert_eq!(
        parser.screen().cell(14, 17).unwrap().fgcolor(),
        vt100::Color::Idx(1)
    );
    assert_eq!(
        parser.screen().cell(14, 17).unwrap().bgcolor(),
        vt100::Color::Default
    );

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Default);
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Default);

    parser.process(b"\x1b[2D\x1b[45mab");

    assert_eq!(parser.screen().cell(14, 18).unwrap().contents(), "a");
    assert_eq!(
        parser.screen().cell(14, 18).unwrap().fgcolor(),
        vt100::Color::Default
    );
    assert_eq!(
        parser.screen().cell(14, 18).unwrap().bgcolor(),
        vt100::Color::Idx(5)
    );

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Default);
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Idx(5));

    parser.process(b"\x1b[m\x1b[2J\x1b[H");
    parser.process(b"a\x1b[38;5;123mb\x1b[48;5;158mc");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Idx(123));
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Idx(158));

    assert_eq!(
        parser.screen().cell(0, 0).unwrap().fgcolor(),
        vt100::Color::Default
    );
    assert_eq!(
        parser.screen().cell(0, 0).unwrap().bgcolor(),
        vt100::Color::Default
    );

    assert_eq!(
        parser.screen().cell(0, 1).unwrap().fgcolor(),
        vt100::Color::Idx(123)
    );
    assert_eq!(
        parser.screen().cell(0, 1).unwrap().bgcolor(),
        vt100::Color::Default
    );

    assert_eq!(
        parser.screen().cell(0, 2).unwrap().fgcolor(),
        vt100::Color::Idx(123)
    );
    assert_eq!(
        parser.screen().cell(0, 2).unwrap().bgcolor(),
        vt100::Color::Idx(158)
    );

    parser.process(b"\x1b[38;2;50;75;100md\x1b[48;2;125;150;175me");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Rgb(50, 75, 100));
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Rgb(125, 150, 175));

    assert_eq!(
        parser.screen().cell(0, 3).unwrap().fgcolor(),
        vt100::Color::Rgb(50, 75, 100)
    );
    assert_eq!(
        parser.screen().cell(0, 3).unwrap().bgcolor(),
        vt100::Color::Idx(158)
    );

    assert_eq!(
        parser.screen().cell(0, 4).unwrap().fgcolor(),
        vt100::Color::Rgb(50, 75, 100)
    );
    assert_eq!(
        parser.screen().cell(0, 4).unwrap().bgcolor(),
        vt100::Color::Rgb(125, 150, 175)
    );

    parser.process(b"\x1b[m\x1b[2J\x1b[H");
    parser.process(b"\x1b[32;47mfoo");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Idx(2));
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Idx(7));

    assert_eq!(
        parser.screen().cell(0, 1).unwrap().fgcolor(),
        vt100::Color::Idx(2)
    );
    assert_eq!(
        parser.screen().cell(0, 1).unwrap().bgcolor(),
        vt100::Color::Idx(7)
    );

    parser.process(b"\x1b[2J\x1b[H");
    parser.process(b"\x1b[39mfoo");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Default);
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Idx(7));

    assert_eq!(
        parser.screen().cell(0, 1).unwrap().fgcolor(),
        vt100::Color::Default
    );
    assert_eq!(
        parser.screen().cell(0, 1).unwrap().bgcolor(),
        vt100::Color::Idx(7)
    );

    parser.process(b"\x1b[2J\x1b[H");
    parser.process(b"\x1b[49mfoo");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Default);
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Default);

    assert_eq!(
        parser.screen().cell(0, 1).unwrap().fgcolor(),
        vt100::Color::Default
    );
    assert_eq!(
        parser.screen().cell(0, 1).unwrap().bgcolor(),
        vt100::Color::Default
    );

    parser.process(b"\x1b[m\x1b[2J\x1b[H");
    parser.process(b"\x1b[92;107mfoo");

    assert_eq!(parser.screen().fgcolor(), vt100::Color::Idx(10));
    assert_eq!(parser.screen().bgcolor(), vt100::Color::Idx(15));

    assert_eq!(
        parser.screen().cell(0, 1).unwrap().fgcolor(),
        vt100::Color::Idx(10)
    );
    assert_eq!(
        parser.screen().cell(0, 1).unwrap().bgcolor(),
        vt100::Color::Idx(15)
    );
}

#[test]
fn attrs() {
    let mut parser = vt100::Parser::new(24, 80);
    assert!(!parser.screen().bold());
    assert!(!parser.screen().italic());
    assert!(!parser.screen().underline());
    assert!(!parser.screen().inverse());

    parser.process(b"f\x1b[1mo\x1b[3mo\x1b[4mo\x1b[7mo");
    assert!(parser.screen().bold());
    assert!(parser.screen().italic());
    assert!(parser.screen().underline());
    assert!(parser.screen().inverse());
    assert!(!parser.screen().cell(0, 0).unwrap().bold());
    assert!(!parser.screen().cell(0, 0).unwrap().italic());
    assert!(!parser.screen().cell(0, 0).unwrap().underline());
    assert!(!parser.screen().cell(0, 0).unwrap().inverse());
    assert!(parser.screen().cell(0, 1).unwrap().bold());
    assert!(!parser.screen().cell(0, 1).unwrap().italic());
    assert!(!parser.screen().cell(0, 1).unwrap().underline());
    assert!(!parser.screen().cell(0, 1).unwrap().inverse());
    assert!(parser.screen().cell(0, 2).unwrap().bold());
    assert!(parser.screen().cell(0, 2).unwrap().italic());
    assert!(!parser.screen().cell(0, 2).unwrap().underline());
    assert!(!parser.screen().cell(0, 2).unwrap().inverse());
    assert!(parser.screen().cell(0, 3).unwrap().bold());
    assert!(parser.screen().cell(0, 3).unwrap().italic());
    assert!(parser.screen().cell(0, 3).unwrap().underline());
    assert!(!parser.screen().cell(0, 3).unwrap().inverse());
    assert!(parser.screen().cell(0, 4).unwrap().bold());
    assert!(parser.screen().cell(0, 4).unwrap().italic());
    assert!(parser.screen().cell(0, 4).unwrap().underline());
    assert!(parser.screen().cell(0, 4).unwrap().inverse());

    parser.process(b"\x1b[m");
    assert!(!parser.screen().bold());
    assert!(!parser.screen().italic());
    assert!(!parser.screen().underline());
    assert!(!parser.screen().inverse());

    parser.process(b"\x1b[2J\x1b[H");
    parser.process(b"\x1b[1;4mf");
    assert!(parser.screen().bold());
    assert!(!parser.screen().italic());
    assert!(parser.screen().underline());
    assert!(!parser.screen().inverse());
    assert!(parser.screen().cell(0, 0).unwrap().bold());
    assert!(!parser.screen().cell(0, 0).unwrap().italic());
    assert!(parser.screen().cell(0, 0).unwrap().underline());
    assert!(!parser.screen().cell(0, 0).unwrap().inverse());

    parser.process(b"\x1b[22mo\x1b[24mo");
    assert!(!parser.screen().bold());
    assert!(!parser.screen().italic());
    assert!(!parser.screen().underline());
    assert!(!parser.screen().inverse());
    assert!(!parser.screen().cell(0, 1).unwrap().bold());
    assert!(!parser.screen().cell(0, 1).unwrap().italic());
    assert!(parser.screen().cell(0, 1).unwrap().underline());
    assert!(!parser.screen().cell(0, 1).unwrap().inverse());
    assert!(!parser.screen().cell(0, 2).unwrap().bold());
    assert!(!parser.screen().cell(0, 2).unwrap().italic());
    assert!(!parser.screen().cell(0, 2).unwrap().underline());
    assert!(!parser.screen().cell(0, 2).unwrap().inverse());

    parser.process(b"\x1b[1;3;4;7mo");
    assert!(parser.screen().bold());
    assert!(parser.screen().italic());
    assert!(parser.screen().underline());
    assert!(parser.screen().inverse());
    assert!(parser.screen().cell(0, 3).unwrap().bold());
    assert!(parser.screen().cell(0, 3).unwrap().italic());
    assert!(parser.screen().cell(0, 3).unwrap().underline());
    assert!(parser.screen().cell(0, 3).unwrap().inverse());
}