Skip to main content

wowlab_tidy/
glob.rs

1#[cfg(test)]
2use googletest::prelude::*;
3
4/// Return `true` if the relative path matches any of the given glob patterns.
5pub(crate) fn matches_ignore(rel: &str, patterns: &[impl AsRef<str>]) -> bool {
6    patterns
7        .iter()
8        .any(|pat| glob_match::glob_match(pat.as_ref(), rel))
9}
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14
15    #[gtest]
16    fn literal_path() -> Result<()> {
17        verify_true!(matches_ignore(
18            "crates/common/src/parsers/dbc/rows.rs",
19            &["crates/common/src/parsers/dbc/rows.rs"]
20        ))?;
21
22        Ok(())
23    }
24
25    #[gtest]
26    fn double_star_prefix() -> Result<()> {
27        verify_true!(matches_ignore("crates/cli/src/main.rs", &["**/main.rs"]))?;
28        verify_true!(matches_ignore("main.rs", &["**/main.rs"]))?;
29
30        Ok(())
31    }
32
33    #[gtest]
34    fn double_star_suffix() -> Result<()> {
35        verify_true!(matches_ignore(
36            "crates/cli/src/commands/foo.rs",
37            &["crates/cli/**"]
38        ))?;
39        verify_false!(matches_ignore(
40            "crates/common/src/lib.rs",
41            &["crates/cli/**"]
42        ))?;
43
44        Ok(())
45    }
46
47    #[gtest]
48    fn star_extension() -> Result<()> {
49        verify_true!(matches_ignore("crates/engine/build.rs", &["**/build.rs"]))?;
50
51        Ok(())
52    }
53
54    #[gtest]
55    fn no_match() -> Result<()> {
56        verify_false!(matches_ignore("crates/engine/src/lib.rs", &["**/main.rs"]))?;
57
58        Ok(())
59    }
60
61    #[gtest]
62    fn empty_patterns() -> Result<()> {
63        let empty: &[&str] = &[];
64
65        verify_false!(matches_ignore("anything.rs", empty))?;
66
67        Ok(())
68    }
69
70    #[gtest]
71    fn mixed_patterns() -> Result<()> {
72        let patterns = &["**/main.rs", "crates/cli/**", "**/build.rs"];
73
74        verify_true!(matches_ignore("crates/sentinel/src/main.rs", patterns))?;
75        verify_true!(matches_ignore("crates/cli/src/commands/foo.rs", patterns))?;
76        verify_true!(matches_ignore("crates/engine/build.rs", patterns))?;
77        verify_false!(matches_ignore("crates/engine/src/lib.rs", patterns))?;
78
79        Ok(())
80    }
81
82    #[gtest]
83    fn string_vec_patterns() -> Result<()> {
84        let patterns = vec!["**/main.rs".to_string(), "crates/cli/**".to_string()];
85
86        verify_true!(matches_ignore("crates/cli/src/main.rs", &patterns))?;
87        verify_false!(matches_ignore("crates/engine/src/lib.rs", &patterns))?;
88
89        Ok(())
90    }
91}