use super::compile_exclude;
fn excluded(patterns: &[&str], path: &[u8]) -> bool {
let owned: Vec<String> = patterns.iter().map(ToString::to_string).collect();
return compile_exclude(owned.as_slice())
.expect("compiles")
.excludes(path);
}
#[test]
fn a_directory_pattern_excludes_what_is_below_it() {
let patterns: &[&str] = &["package/ssg/"];
for (path, expected) in [
(&b"package/ssg/a.md"[..], true),
(b"package/ssg/deep/b.mdx", true),
(b"package/ssg.md", false),
(b"package/ssgx/a.md", false),
(b"other/package/ssg/a.md", false),
(b"a.md", false),
] {
assert_eq!(excluded(patterns, path), expected, "{path:?}");
}
}
#[test]
fn anchoring_follows_gitignore() {
assert!(excluded(&["*.mdx"], b"a/b/c.mdx"));
assert!(!excluded(&["*.mdx"], b"a/b/c.md"));
assert!(excluded(&["/top.md"], b"top.md"));
assert!(!excluded(&["/top.md"], b"sub/top.md"));
assert!(excluded(&["doc/**/draft.md"], b"doc/a/b/draft.md"));
assert!(excluded(&["doc/**/draft.md"], b"doc/draft.md"));
}
#[test]
fn negation_cannot_reach_below_an_excluded_directory() {
assert!(!excluded(&["*.md", "!keep.md"], b"keep.md"));
assert!(excluded(&["*.md", "!keep.md"], b"drop.md"));
assert!(excluded(&["!keep.md", "*.md"], b"keep.md"));
assert!(excluded(
&["package/ssg/", "!package/ssg/keep.md"],
b"package/ssg/keep.md"
));
}
#[test]
fn nothing_excludes_nothing() {
assert!(!excluded(&[], b"a.md"));
assert!(!excluded(&["# a.md", "", " "], b"a.md"));
assert!(excluded(&["*"], b"a.md"));
assert!(!excluded(&["*"], b""));
}
#[test]
fn a_name_that_is_not_utf8_is_matched_by_its_bytes() {
assert!(excluded(&["x/"], b"x/caf\xe9.md"));
assert!(excluded(&["*.md"], b"caf\xe9.md"));
assert!(!excluded(&["caf?.txt"], b"caf\xe9.md"));
}
#[test]
fn a_pattern_that_cannot_compile_is_reported() {
let refused: String =
compile_exclude(&[String::from("ok/"), String::from("a{b")]).expect_err("refused");
assert!(
refused.starts_with(
"cli-git could not compile the markdown/autofix exclude pattern \"a{b\": "
),
"{refused}"
);
}
#[test]
fn a_directory_only_pattern_never_excludes_a_file_of_that_name() {
assert!(!excluded(&["package/ssg/"], b"package/ssg"));
assert!(!excluded(&["ssg/"], b"a/ssg"));
assert!(excluded(&["ssg/"], b"a/ssg/b.md"));
}