blob: c7da36abec88efd4d7337a215b008bd8f5aec711 [file] [log] [blame]
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package git4idea.validators;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Collection;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
/**
* The test for {@link GitRefNameValidator}.
* Tests are based on the <a href="http://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html">
* specification of valid Git references</a>
*/
@RunWith(Parameterized.class)
public class GitRefNameValidatorTest {
private static final String[] ILLEGAL_CHARS = { " ", "~", "^", ":", "?", "*", "[", "@{", "\\" };
private static final int CONTROL_CHARS_START = 0;
private static final int CONTROL_CHARS_END = 31;
private static final int CONTROL_CHARS_SIZE = CONTROL_CHARS_END - CONTROL_CHARS_START + 1;
private static final String[] CONTROL_CHARS = new String[CONTROL_CHARS_SIZE + 1]; // + DEL
static {
for (int i = CONTROL_CHARS_START; i <= CONTROL_CHARS_END; i++) {
CONTROL_CHARS[i-CONTROL_CHARS_START] = String.valueOf((char)i);
}
CONTROL_CHARS[CONTROL_CHARS_SIZE] = "\u007F"; // DEL
}
private final String myRefNameToTest;
private final boolean myIsExpectedValid;
private static Object[][] createValidData() {
return new Object[][] {
{ "WORD", "branch" },
{ "UNDERSCORED_WORD", "new_branch" },
{ "HIERARCHY", "user/branch" },
{ "HIERARCHY_2", "user/branch/sub_branch" },
{ "BEGINS_WITH_SLASH", "/branch" }, // actual branch name will be with trimmed slash
{ "NON_CONS_DOTS", "complex.branch.name" }
};
}
private static Object[][] createInvalidData() {
return new Object[][] {
{ "BEGIN_WITH_DOT", ".branch" },
{ "ONLY_DOT", "." },
{ "ENDS_WITH_SLASH", "branch/" },
{ "ENDS_WITH_DOT", "branch." },
{ "ENDS_WITH_LOCK", "branch.lock" },
{ "TWO_DOTS_1", "branch..name" },
{ "TWO_DOTS_2", "..name" },
{ "TWO_DOTS_3", "..branch" }
};
}
public static Object[][] createInvalidCharsData() {
return populateWithIllegalChars(ILLEGAL_CHARS, new Function<String, String>() {
@Override public String fun(String s) {
return s;
}
});
}
public static Object[][] createInvalidControlCharsData() {
return populateWithIllegalChars(CONTROL_CHARS, new Function<String, String>() {
@Override public String fun(String s) {
Character c = s.charAt(0);
return "\\u00" + Integer.toHexString(c);
}
});
}
private static Object[][] populateWithIllegalChars(String[] illegalChars, Function<String, String> toString) {
Object[][] data = new Object[illegalChars.length][];
for (int i = 0; i < illegalChars.length; i++) {
data[i] = new Object[]{
toString.fun(illegalChars[i]), "bra" + illegalChars[i] + "nch"
};
}
return data;
}
@Parameterized.Parameters(name = "{0}")
public static Collection<Object[]> data() {
Collection<Object[]> data = ContainerUtil.newArrayList();
populateData(data, createValidData(), true);
populateData(data, createInvalidData(), false);
populateData(data, createInvalidCharsData(), false);
populateData(data, createInvalidControlCharsData(), false);
return data;
}
private static void populateData(Collection<Object[]> data, Object[][] source, boolean valid) {
for (Object[] testCase : source) {
data.add(new Object[] {testCase[0], testCase[1], valid});
}
}
@SuppressWarnings("UnusedParameters")
public GitRefNameValidatorTest(String name, String refNameToTest, boolean valid) {
myRefNameToTest = refNameToTest;
myIsExpectedValid = valid;
}
@Test
public void testAll() {
if (myIsExpectedValid) {
assertValid(myRefNameToTest);
}
else {
assertInvalid(myRefNameToTest);
}
}
private static void assertValid(String branchName) {
assertTrue(GitRefNameValidator.getInstance().checkInput(branchName), "Should be valid");
assertTrue(GitRefNameValidator.getInstance().canClose(branchName), "Should be valid");
}
private static void assertInvalid(String branchName) {
assertFalse(GitRefNameValidator.getInstance().checkInput(branchName), "Should be invalid");
assertFalse(GitRefNameValidator.getInstance().canClose(branchName), "Should be invalid");
}
}