treer 0.1.2

Simple tree command written in rust.
Documentation
use std::path::Path;

use treer::cmd::{root::Opts, traversal::print_tree_with_writer};

#[test]
fn test_print_default() {
    let opts: Opts = Default::default();
    let path = Path::new("tests/sample-directory");

    let mut buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
├──  sub-dir-lv1
│   ├──  sub-dir-lv2
│   │   ├──  sub-dir-lv3
│   │   │   └── 󰈔 file5.abc
│   │   └── 󰈔 file4
│   └── 󱁻 file3.toml
├── 󰈙 file1.md
└── 󰈙 file2.txt

3 directories, 5 files
"#;
    assert_eq!(result, expected);
}

#[test]
fn test_print_hidden() {
    let path = Path::new("tests/sample-directory");
    let mut opts: Opts = Default::default();
    opts.show_hidden = true;

    let mut buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
├──  .hidden
├──  sub-dir-lv1
│   ├──  sub-dir-lv2
│   │   ├──  sub-dir-lv3
│   │   │   └── 󰈔 file5.abc
│   │   ├── 󰈙 .hidden2.txt
│   │   └── 󰈔 file4
│   └── 󱁻 file3.toml
├── 󱆄 .hidden.lock
├── 󰈙 file1.md
└── 󰈙 file2.txt

4 directories, 7 files
"#;
    assert_eq!(result, expected);
}

#[test]
fn test_match_pattern() {
    let path = Path::new("tests/sample-directory");
    let mut opts: Opts = Default::default();
    opts.patterns = vec![glob::Pattern::new("*1*").unwrap()];

    let mut buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = "sample-directory\n├── \u{1b}[1;31m\u{e5fe} sub-dir-lv1\u{1b}[0m\n│   \u{1b}[31m├── \u{1b}[0m\u{e5fe} sub-dir-lv2\n│   \u{1b}[31m│   \u{1b}[0m\u{1b}[31m├── \u{1b}[0m\u{e5fe} sub-dir-lv3\n│   \u{1b}[31m│   \u{1b}[0m\u{1b}[31m│   \u{1b}[0m\u{1b}[31m└── \u{1b}[0m\u{f0214} file5.abc\n│   \u{1b}[31m│   \u{1b}[0m\u{1b}[31m└── \u{1b}[0m\u{f0214} file4\n│   \u{1b}[31m└── \u{1b}[0m\u{f107b} file3.toml\n└── \u{1b}[1;31m\u{f0219} file1.md\u{1b}[0m\n\n3 directories, 4 files\n";
    assert_eq!(result, expected);

    opts.patterns.push(glob::Pattern::new("*lv*").unwrap());
    buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = "sample-directory\n├── \u{1b}[1;31m\u{e5fe} sub-dir-lv1\u{1b}[0m\n│   \u{1b}[31m├── \u{1b}[0m\u{1b}[1;31m\u{e5fe} sub-dir-lv2\u{1b}[0m\n│   \u{1b}[31m│   \u{1b}[0m\u{1b}[31m├── \u{1b}[0m\u{1b}[1;31m\u{e5fe} sub-dir-lv3\u{1b}[0m\n│   \u{1b}[31m│   \u{1b}[0m\u{1b}[31m│   \u{1b}[0m\u{1b}[31m└── \u{1b}[0m\u{f0214} file5.abc\n│   \u{1b}[31m│   \u{1b}[0m\u{1b}[31m└── \u{1b}[0m\u{f0214} file4\n│   \u{1b}[31m└── \u{1b}[0m\u{f107b} file3.toml\n└── \u{1b}[1;31m\u{f0219} file1.md\u{1b}[0m\n\n3 directories, 4 files\n";
    assert_eq!(result, expected);
}

#[test]
fn test_exclude_patterns() {
    let path = Path::new("tests/sample-directory");
    let mut opts: Opts = Default::default();
    opts.exclude_patterns = vec![glob::Pattern::new("*2*").unwrap()];

    let mut buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
├──  sub-dir-lv1
│   └── 󱁻 file3.toml
└── 󰈙 file1.md

1 directory, 2 files
"#;
    assert_eq!(result, expected);

    opts.exclude_patterns = vec![
        glob::Pattern::new("*2.txt").unwrap(),
        glob::Pattern::new("*3*").unwrap(),
    ];
    buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
├──  sub-dir-lv1
│   └──  sub-dir-lv2
│       └── 󰈔 file4
└── 󰈙 file1.md

2 directories, 2 files
"#;
    assert_eq!(result, expected);
}

#[test]
fn test_max_level() {
    let path = Path::new("tests/sample-directory");
    let mut opts: Opts = Default::default();
    opts.level = Some(3);

    let mut buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
├──  sub-dir-lv1
│   ├──  sub-dir-lv2
│   │   ├──  sub-dir-lv3
│   │   └── 󰈔 file4
│   └── 󱁻 file3.toml
├── 󰈙 file1.md
└── 󰈙 file2.txt

3 directories, 4 files
"#;
    assert_eq!(result, expected);

    opts.level = Some(2);
    buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
├──  sub-dir-lv1
│   ├──  sub-dir-lv2
│   └── 󱁻 file3.toml
├── 󰈙 file1.md
└── 󰈙 file2.txt

2 directories, 3 files
"#;
    assert_eq!(result, expected);
}

#[test]
fn test_combination() {
    let path = Path::new("tests/sample-directory");
    let mut opts: Opts = Default::default();
    opts.show_hidden = true;
    opts.ascii = true;
    opts.level = Some(3);
    opts.exclude_patterns = vec![
        glob::Pattern::new("*2.txt").unwrap(),
        glob::Pattern::new("*3*").unwrap(),
    ];

    let mut buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = r#"sample-directory
|--- .hidden
|--- sub-dir-lv1
|   +--- sub-dir-lv2
|       +---󰈔 file4
|---󱆄 .hidden.lock
+---󰈙 file1.md

3 directories, 3 files
"#;
    assert_eq!(result, expected);

    opts.patterns = vec![glob::Pattern::new("*lv*").unwrap()];
    buffer = Vec::new();
    let _ = print_tree_with_writer(path, &opts, &mut buffer);

    let result = String::from_utf8(buffer).expect("Not valid UTF-8");
    let expected = "sample-directory\n+---\u{1b}[1;31m\u{e5fe} sub-dir-lv1\u{1b}[0m\n    \u{1b}[31m+---\u{1b}[0m\u{1b}[1;31m\u{e5fe} sub-dir-lv2\u{1b}[0m\n        \u{1b}[31m+---\u{1b}[0m\u{f0214} file4\n\n2 directories, 1 file\n";
    assert_eq!(result, expected);
}