import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
import java.util.Arrays;
+import org.eclipse.jgit.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
}
@Test
- public void testTrailingSlash() {
+ public void testDirModeAndNoRegex() {
String pattern = "/src/";
assertMatched(pattern, "/src/");
assertMatched(pattern, "/src/new");
assertMatched(pattern, "/src/new/a.c");
assertMatched(pattern, "/src/a.c");
+ // no match as a "file" pattern, because rule is for directories only
assertNotMatched(pattern, "/src");
assertNotMatched(pattern, "/srcA/");
}
+ @Test
+ public void testDirModeAndRegex1() {
+ // IgnoreRule was buggy for some cases below, therefore using "Assume"
+ Boolean assume = useOldRule;
+
+ String pattern = "a/*/src/";
+ assertMatched(pattern, "a/b/src/");
+ assertMatched(pattern, "a/b/src/new");
+ assertMatched(pattern, "a/b/src/new/a.c");
+ assertMatched(pattern, "a/b/src/a.c");
+ // no match as a "file" pattern, because rule is for directories only
+ assertNotMatched(pattern, "a/b/src", assume);
+ assertNotMatched(pattern, "a/b/srcA/");
+ }
+
+ @Test
+ public void testDirModeAndRegex2() {
+ // IgnoreRule was buggy for some cases below, therefore using "Assume"
+ Boolean assume = useOldRule;
+
+ String pattern = "a/[a-b]/src/";
+ assertMatched(pattern, "a/b/src/");
+ assertMatched(pattern, "a/b/src/new");
+ assertMatched(pattern, "a/b/src/new/a.c");
+ assertMatched(pattern, "a/b/src/a.c");
+ // no match as a "file" pattern, because rule is for directories only
+ assertNotMatched(pattern, "a/b/src", assume);
+ assertNotMatched(pattern, "a/b/srcA/");
+ }
+
+ @Test
+ public void testDirModeAndRegex3() {
+ // IgnoreRule was buggy for some cases below, therefore using "Assume"
+ Boolean assume = useOldRule;
+
+ String pattern = "**/src/";
+ assertMatched(pattern, "a/b/src/", assume);
+ assertMatched(pattern, "a/b/src/new", assume);
+ assertMatched(pattern, "a/b/src/new/a.c", assume);
+ assertMatched(pattern, "a/b/src/a.c", assume);
+ // no match as a "file" pattern, because rule is for directories only
+ assertNotMatched(pattern, "a/b/src", assume);
+ assertNotMatched(pattern, "a/b/srcA/", assume);
+ }
+
@Test
public void testNameOnlyMatches() {
/*
* Pattern as it would appear in a .gitignore file
* @param target
* Target file path relative to repository's GIT_DIR
+ * @param assume
*/
- public void assertMatched(String pattern, String target) {
+ public void assertMatched(String pattern, String target, Boolean... assume) {
boolean value = match(pattern, target);
- assertTrue("Expected a match for: " + pattern + " with: " + target,
- value);
+ if (assume.length == 0 || !assume[0].booleanValue())
+ assertTrue("Expected a match for: " + pattern + " with: " + target,
+ value);
+ else
+ assumeTrue("Expected a match for: " + pattern + " with: " + target,
+ value);
}
/**
* Pattern as it would appear in a .gitignore file
* @param target
* Target file path relative to repository's GIT_DIR
+ * @param assume
*/
- public void assertNotMatched(String pattern, String target) {
+ public void assertNotMatched(String pattern, String target,
+ Boolean... assume) {
boolean value = match(pattern, target);
- assertFalse("Expected no match for: " + pattern + " with: " + target,
- value);
+ if (assume.length == 0 || !assume[0].booleanValue())
+ assertFalse("Expected no match for: " + pattern + " with: "
+ + target, value);
+ else
+ assumeFalse("Expected no match for: " + pattern + " with: "
+ + target, value);
}
/**
*/
private boolean match(String pattern, String target) {
boolean isDirectory = target.endsWith("/");
+ boolean match;
+ if (useOldRule.booleanValue()) {
+ IgnoreRule r = new IgnoreRule(pattern);
+ match = r.isMatch(target, isDirectory);
+ } else {
+ FastIgnoreRule r = new FastIgnoreRule(pattern);
+ match = r.isMatch(target, isDirectory);
+ }
+
+ if (isDirectory) {
+ boolean noTrailingSlash = matchAsDir(pattern,
+ target.substring(0, target.length() - 1));
+ if (match != noTrailingSlash) {
+ String message = "Difference in result for directory pattern: "
+ + pattern + " with: " + target
+ + " if target is given without trailing slash";
+ Assert.assertEquals(message, match, noTrailingSlash);
+ }
+ }
+ return match;
+ }
+
+ /**
+ *
+ * @param target
+ * must not ends with a slash!
+ * @param pattern
+ * same as {@link #match(String, String)}
+ * @return same as {@link #match(String, String)}
+ */
+ private boolean matchAsDir(String pattern, String target) {
+ assertFalse(target.endsWith("/"));
if (useOldRule.booleanValue()) {
IgnoreRule r = new IgnoreRule(pattern);
- // If speed of this test is ever an issue, we can use a presetRule
- // field
- // to avoid recompiling a pattern each time.
- return r.isMatch(target, isDirectory);
+ return r.isMatch(target, true);
}
FastIgnoreRule r = new FastIgnoreRule(pattern);
- // If speed of this test is ever an issue, we can use a presetRule field
- // to avoid recompiling a pattern each time.
- return r.isMatch(target, isDirectory);
+ return r.isMatch(target, true);
}
}