package org.smoothbuild.builtin.file.match; import static org.junit.Assert.assertEquals; import static org.smoothbuild.builtin.file.match.PathMatcher.pathMatcher; import static org.smoothbuild.io.fs.base.Path.path; import java.util.function.Predicate; import org.junit.Test; import org.smoothbuild.io.fs.base.Path; public class PathMatcherTest { @Test public void one_part_pattern_without_wildcards() throws Exception { assertPatternMatches("abc", "abc"); assertPatternDoesNotMatch("abc", "abcabc"); assertPatternDoesNotMatch("abc", "abbc"); assertPatternDoesNotMatch("abc", "abc/abc"); } @Test public void pattern_without_wildcards() throws Exception { assertPatternMatches("abc/def/ghi", "abc/def/ghi"); assertPatternDoesNotMatch("abc/def/ghi", "abcdefghi"); assertPatternDoesNotMatch("abc/def/ghi", "abcdef/ghi"); assertPatternDoesNotMatch("abc/def/ghi", "bc/def/ghi"); assertPatternDoesNotMatch("abc/def/ghi", "abc/def/gh"); assertPatternDoesNotMatch("abc/def/ghi", "abc/ghi"); assertPatternDoesNotMatch("abc/def/ghi", "abc/def/ghi/ghi"); assertPatternDoesNotMatch("abc/def/ghi", "abc/abc/def/ghi"); assertPatternDoesNotMatch("abc/def/ghi", "abc/def/def/ghi"); } @Test public void single_star_alone() throws Exception { assertPatternMatches("*", "abc"); assertPatternMatches("*", "abcghi"); assertPatternDoesNotMatch("*", "abc/def"); assertPatternDoesNotMatch("*", "abc/def/ghi"); } @Test public void single_star_as_whole_part_prefix() throws Exception { assertPatternMatches("*/abc/def", "xxx/abc/def"); assertPatternDoesNotMatch("*/abc/def", "abc/def"); assertPatternDoesNotMatch("*/abc/def", "xxx/yyy/abc/def"); assertPatternDoesNotMatch("*/abc/def", "abc/xxx/def"); } @Test public void single_star_as_whole_part_suffix() throws Exception { assertPatternMatches("abc/def/*", "abc/def/xxx"); assertPatternDoesNotMatch("abc/def/*", "abc/def"); assertPatternDoesNotMatch("abc/def/*", "abc/def/xxx/yyy"); assertPatternDoesNotMatch("abc/def/*", "abc/xxx/def"); } @Test public void single_star_as_whole_part_prefix_and_suffix() throws Exception { assertPatternMatches("*/abc/*", "xxx/abc/yyy"); assertPatternDoesNotMatch("*/abc/*", "abc"); assertPatternDoesNotMatch("*/abc/*", "abc/yyy"); assertPatternDoesNotMatch("*/abc/*", "xxx/abc"); assertPatternDoesNotMatch("*/abc/*", "xxx/zzz/abc/yyy"); assertPatternDoesNotMatch("*/abc/*", "xxx/abc/yyy/zzz"); assertPatternDoesNotMatch("*/abc/*", "xxx/abcabc/yyy"); assertPatternDoesNotMatch("*/abc/*", "xxx/abc/abc/yyy"); } @Test public void single_star_in_the_middle_as_whole_part() throws Exception { assertPatternMatches("abc/*/def", "abc/xxx/def"); assertPatternDoesNotMatch("abc/*/def", "abcdef"); assertPatternDoesNotMatch("abc/*/def", "abc/def"); assertPatternDoesNotMatch("abc/*/def", "abc/xxx/yyy/def"); } @Test public void single_star_twice() throws Exception { assertPatternMatches("*/*", "abc/def"); assertPatternDoesNotMatch("*/*", "abc"); assertPatternDoesNotMatch("*/*", "abc/def/ghi"); } @Test public void single_star_in_the_middle_of_only_part() throws Exception { assertPatternMatches("abc*def", "abcdef"); assertPatternMatches("abc*def", "abcxxxdef"); assertPatternDoesNotMatch("abc*def", "abc/def"); assertPatternDoesNotMatch("abc*def", "abdef"); assertPatternDoesNotMatch("abc/xxx/def", "abc/def"); } @Test public void single_star_twice_in_the_middle_of_only_part() throws Exception { assertPatternMatches("abc*def*ghi", "abcdefghi"); assertPatternMatches("abc*def*ghi", "abcxxxdefghi"); assertPatternMatches("abc*def*ghi", "abcdefyyyghi"); assertPatternMatches("abc*def*ghi", "abcxxxdefyyyghi"); assertPatternDoesNotMatch("abc*def*ghi", "abc/def/ghi"); assertPatternDoesNotMatch("abc*def*ghi", "abcdefgh"); } @Test public void double_star_as_prefix() throws Exception { assertPatternMatches("**/abc", "abc"); assertPatternMatches("**/abc", "xxx/abc"); assertPatternMatches("**/abc", "xxx/yyy/abc"); assertPatternDoesNotMatch("**/abc", "xxx/yyyabc"); assertPatternDoesNotMatch("**/abc", "xxx/abc/xxx"); } @Test public void double_star_as_suffix() throws Exception { assertPatternMatches("abc/**", "abc/xxx"); assertPatternMatches("abc/**", "abc/xxx/yyy"); assertPatternDoesNotMatch("abc/**", "abc"); assertPatternDoesNotMatch("abc/**", "abcxxx/yyy"); assertPatternDoesNotMatch("abc/**", "xxx/abc/xxx"); } @Test public void double_star_as_prefix_and_suffix() throws Exception { assertPatternMatches("**/abc/**", "abc/xxx"); assertPatternMatches("**/abc/**", "abc/xxx/yyy"); assertPatternMatches("**/abc/**", "xxx/abc/yyy"); assertPatternMatches("**/abc/**", "xxx/zzz/abc/yyy"); assertPatternDoesNotMatch("**/abc/**", "xxx/abc"); assertPatternDoesNotMatch("**/abc/**", "xxx/yyy/abc"); assertPatternDoesNotMatch("**/abc/**", "abc"); } @Test public void double_star_in_the_middle() throws Exception { assertPatternMatches("abc/**/def", "abc/def"); assertPatternMatches("abc/**/def", "abc/xxx/def"); assertPatternMatches("abc/**/def", "abc/xxx/yyy/def"); assertPatternMatches("abc/**/def", "abc/xxx/yyy/zzz/def"); assertPatternMatches("abc/**/def", "abc/abc/def"); assertPatternMatches("abc/**/def", "abc/def/def"); assertPatternMatches("abc/**/def", "abc/abc/def/def"); assertPatternMatches("abc/**/def", "abc/def/abc/def"); assertPatternDoesNotMatch("abc/**/def", "abcdef"); assertPatternDoesNotMatch("abc/**/def", "abc/xxx/zzz"); assertPatternDoesNotMatch("abc/**/def", "xxx/zzz/def"); assertPatternDoesNotMatch("abc/**/def", "abc"); assertPatternDoesNotMatch("abc/**/def", "def"); } private static void assertPatternMatches(String pattern, String path) { assertMatchingResult(pattern, path, true); } private static void assertPatternDoesNotMatch(String pattern, String path) { assertMatchingResult(pattern, path, false); } private static void assertMatchingResult(String pattern, String path, boolean expected) { Predicate<Path> matcher = pathMatcher(pattern); assertEquals(matcher.test(path(path)), expected); } }