Documentation
pub mod ans;
pub mod canvas;
pub mod color;
pub mod css;
pub mod html;
pub mod image;
pub mod lex;
pub mod node;
pub mod svg;
pub mod text;
pub mod theme;

#[cfg(test)]
mod test {
    use crate::{canvas::Canvas, lex::parse_ansi};
    use insta::assert_debug_snapshot;
    #[test]
    fn test_plain() {
        let s = "ansi";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test() {
        let s = "\x1b[0;5;35;45m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_reset() {
        let s = "\x1b[m\x1b";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_starship_title() {
        let s = "\x1b[?2004h\x1b]0;/c/wt\x1b[30m\x1b(B\x1b[m\x1b[J\x1b[K";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_starship_prompt() {
        let s = "\x1b[38;2;218;98;125m\x1b[48;2;218;98;125;30mwin\x1b[38;2;218;98;125m\x1b[30mC:/wt \x1b[48;2;252;161;125;38;2;218;98;125m\x1b[48;2;134;187;216;38;2;252;161;125m\x1b[48;2;6;150;154;38;2;134;187;216m\x1b[48;2;51;101;138;38;2;6;150;154m\x1b[0m\x1b[K";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_vitest_bench() {
        let s = "\x1b[36m\x1b[7m\x1b[1m BENCH \x1b[22m\x1b[27m\x1b[39m \x1b[36mSummary\x1b[39m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_fastfetch() {
        let s = "\x1b[1G\x1b[19A\x1b[47C";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_color256() {
        let s = "\x1b[38;5;99ma\x1b[48;5;99mb";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_color24() {
        let s = "\x1b[38;2;0;0;114m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_base() {
        let s =
            "\x1b[30mblack\x1b[0m    \x1b[90mbright black\x1b[0m     \x1b[40mblack\x1b[0m    \x1b[100mbright black\x1b[0m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_link() {
        let s =
            "\x1b]8;;file:///Users/xxx/src/new-nu-parser/Cargo.toml\x1b\\Cargo.toml\x1b]8;;\x1b";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_link_hide() {
        let s = "\x1b[8mhttp://example.com/how_about_me\x1b[m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_link_id() {
        let s = "\x1b]8;id=1;http://example.com/id\x1b\\twice\x1b]8;;\x1b\\";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_empty_link() {
        let s = "\x1b]8;;\x1b\\";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_link_soft_reset() {
        let s = "\x1b]8;;http://example.com/softreset\\\x1b[3;31mfoo[!pbar";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_link_no_close() {
        let s = "\x1b]8;;http://example.com/foo\x1b\\foo\x1b]8;;http://example.com/foo\x1b\\foo\x1b]8;;\x1b\\ \x1b]8;;http://example.com/foo\x1b\\foo\x1b]8;;http://example.com/bar\x1b\\bar\x1b]8;;\x1b\\";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_link_ll() {
        let s = "]8;;file://win/c/code/ansi2/targettarget]8;;";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_sgr6() {
        let s = "\x1b[48;5;186;38;5;16m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_style() {
        let s =
            "aaa\x1b[1mbold\x1b[0m \x1b[2mdim\x1b[0m \x1b[3mitalic\x1b[3m \x1b[4munderline\x1b[4m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_dim() {
        let s = "NUSHELL";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_sgr4() {
        let s = "aaa";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }
    #[test]
    fn test_vitest() {
        let s = " BENCH  Summary";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_svg2() {
        let s = " 39;40m  39;41m";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);

        let canvas = Canvas::new(s, None);
        assert_debug_snapshot!(canvas);
        assert_debug_snapshot!(canvas.minify());
    }

    #[test]
    fn test_starship() {
        let s =
            "]7;file://win/c/code/ansi2]0;/c/c/ansi2(B]133;A;special_key=1";
        let r = parse_ansi(s).unwrap();
        assert_debug_snapshot!(r);
    }
}