/*
* 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 org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
/**
* The test for {@link GitRefNameValidator}.
* Tests are based on the
* specification of valid Git references
*
* @author Kirill Likhodedov
*/
public class GitRefNameValidatorTest {
@DataProvider(name = "valid")
public 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" }
};
}
@DataProvider(name = "simple_invalid")
public 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" }
};
}
private static final String[] ILLEGAL_CHARS = { " ", "~", "^", ":", "?", "*", "[", "@{", "\\" };
@DataProvider(name = "invalid_chars")
public Object[][] createInvalidCharsData() {
return populateWithIllegalChars(ILLEGAL_CHARS, new Function() {
@Override public String fun(String s) {
return s;
}
});
}
private static final int CONTROL_CHARS_START = 5; // we can't test from 0 to 4 via @DataProvider due to TestNG limitations
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
}
@DataProvider(name = "invalid_control_chars")
public Object[][] createInvalidControlCharsData() {
return populateWithIllegalChars(CONTROL_CHARS, new Function() {
@Override public String fun(String s) {
Character c = s.charAt(0);
return "\\u00" + Integer.toHexString(c);
}
});
}
private static Object[][] populateWithIllegalChars(String[] illegalChars, Function 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;
}
@Test(dataProvider = "valid")
public void testValid(String testName, String branchName) {
assertValid(branchName);
}
@Test(dataProvider = "simple_invalid")
public void testSimpleInvalid(String testName, String branchName) {
assertInvalid(branchName);
}
@Test(dataProvider = "invalid_chars")
public void testInvalidChars(String testName, String branchName) {
assertInvalid(branchName);
}
@Test(dataProvider = "invalid_control_chars")
public void control_chars_are_invalid(String testName, String branchName) {
assertInvalid(branchName);
}
// \u0000 to \u0004 can't be passed to the TestNG DataProvider - see org.testng.remote.strprotocol.MessageHelper
@Test
public void control_chars_from_0_to_4_are_invalid() {
for (int i = 0; i < 5; i++) {
assertInvalid("bra" + (char)i + "nch");
}
}
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");
}
}