////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2017 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////
package com.puppycrawl.tools.checkstyle.checks;
import static com.puppycrawl.tools.checkstyle.checks.DescendantTokenCheck.MSG_KEY_MAX;
import static com.puppycrawl.tools.checkstyle.checks.DescendantTokenCheck.MSG_KEY_MIN;
import static com.puppycrawl.tools.checkstyle.checks.DescendantTokenCheck.MSG_KEY_SUM_MAX;
import static com.puppycrawl.tools.checkstyle.checks.DescendantTokenCheck.MSG_KEY_SUM_MIN;
import java.io.File;
import java.io.IOException;
import org.junit.Test;
import com.puppycrawl.tools.checkstyle.BaseCheckTestSupport;
import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
public class DescendantTokenCheckTest extends BaseCheckTestSupport {
@Override
protected String getPath(String filename) throws IOException {
return super.getPath("checks" + File.separator + filename);
}
@Test
public void testDefault()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testMaximumNumber()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_NATIVE");
checkConfig.addAttribute("limitedTokens", "LITERAL_NATIVE");
checkConfig.addAttribute("maximumNumber", "0");
final String[] expected = {
"17:12: " + getCheckMessage(MSG_KEY_MAX, 1, 0, "LITERAL_NATIVE", "LITERAL_NATIVE"),
};
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testMessage()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_NATIVE");
checkConfig.addAttribute("limitedTokens", "LITERAL_NATIVE");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumMessage", "Using ''native'' is not allowed.");
final String[] expected = {
"17:12: Using 'native' is not allowed.",
};
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testMinimumNumber()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_SWITCH");
checkConfig.addAttribute("limitedTokens", "LITERAL_DEFAULT");
checkConfig.addAttribute("minimumNumber", "2");
final String[] expected = {
"8:9: " + getCheckMessage(MSG_KEY_MIN, 1, 2, "LITERAL_SWITCH", "LITERAL_DEFAULT"),
};
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testMinimumDepth()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_SWITCH");
checkConfig.addAttribute("limitedTokens", "LITERAL_DEFAULT");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("minimumDepth", "3");
final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testMaximumDepth()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_SWITCH");
checkConfig.addAttribute("limitedTokens", "LITERAL_DEFAULT");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumDepth", "1");
final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testEmptyStatements()
throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "EMPTY_STAT");
checkConfig.addAttribute("limitedTokens", "EMPTY_STAT");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumDepth", "0");
checkConfig.addAttribute("maximumMessage", "Empty statement.");
final String[] expected = {
"7:7: Empty statement.",
"12:7: Empty statement.",
"17:19: Empty statement.",
"21:10: Empty statement.",
"24:16: Empty statement.",
"28:10: Empty statement.",
"38:10: Empty statement.",
"44:13: Empty statement.",
"46:13: Empty statement.",
"49:19: Empty statement.",
"53:10: Empty statement.",
"56:9: Empty statement.",
"61:10: Empty statement.",
"67:10: Empty statement.",
"71:10: Empty statement.",
"75:10: Empty statement.",
};
verify(checkConfig, getPath("InputEmptyStatement.java"), expected);
}
@Test
public void testMissingSwitchDefault() throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_SWITCH");
checkConfig.addAttribute("limitedTokens", "LITERAL_DEFAULT");
checkConfig.addAttribute("minimumNumber", "1");
checkConfig.addAttribute("maximumDepth", "2");
checkConfig.addAttribute("minimumMessage", "switch without \"default\" clause.");
final String[] expected = {
"17:9: switch without \"default\" clause.",
};
verify(checkConfig, getPath("InputMissingSwitchDefault.java"), expected);
}
@Test
public void testStringLiteralEquality() throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "EQUAL,NOT_EQUAL");
checkConfig.addAttribute("limitedTokens", "STRING_LITERAL");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumDepth", "1");
checkConfig.addAttribute("maximumMessage",
"Literal Strings should be compared using equals(), not ''==''.");
final String[] expected = {
"7:18: Literal Strings should be compared using equals(), not '=='.",
"12:20: Literal Strings should be compared using equals(), not '=='.",
"17:22: Literal Strings should be compared using equals(), not '=='.",
};
verify(checkConfig, getPath("InputStringLiteralEquality.java"), expected);
}
@Test
public void testIllegalTokenDefault() throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_SWITCH, POST_INC, POST_DEC");
checkConfig.addAttribute("limitedTokens", "LITERAL_SWITCH, POST_INC, POST_DEC");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumDepth", "0");
checkConfig.addAttribute("maximumMessage", "Using ''{2}'' is not allowed.");
final String[] expected = {
"8:9: Using 'LITERAL_SWITCH' is not allowed.",
"11:18: Using 'POST_DEC' is not allowed.",
"12:18: Using 'POST_INC' is not allowed.",
};
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testIllegalTokenNative() throws Exception {
final DefaultConfiguration checkConfig =
createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_NATIVE");
checkConfig.addAttribute("limitedTokens", "LITERAL_NATIVE");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumDepth", "0");
checkConfig.addAttribute("maximumMessage", "Using ''{2}'' is not allowed.");
final String[] expected = {
"17:12: Using 'LITERAL_NATIVE' is not allowed.",
};
verify(checkConfig, getPath("InputIllegalTokens.java"), expected);
}
@Test
public void testReturnFromCatch() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_CATCH");
checkConfig.addAttribute("limitedTokens", "LITERAL_RETURN");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumMessage", "Return from catch is not allowed.");
final String[] expected = {
"7:11: Return from catch is not allowed.",
"15:11: Return from catch is not allowed.",
};
verify(checkConfig, getPath("InputReturnFromCatch.java"), expected);
}
@Test
public void testReturnFromFinally() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "LITERAL_FINALLY");
checkConfig.addAttribute("limitedTokens", "LITERAL_RETURN");
checkConfig.addAttribute("maximumNumber", "0");
checkConfig.addAttribute("maximumMessage", "Return from finally is not allowed.");
final String[] expected = {
"7:11: Return from finally is not allowed.",
"15:11: Return from finally is not allowed.",
};
verify(checkConfig, getPath("InputReturnFromFinally.java"), expected);
}
@Test
public void testNoSum() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL");
checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL");
checkConfig.addAttribute("maximumNumber", "1");
checkConfig.addAttribute("maximumMessage", "What are you doing?");
final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
verify(checkConfig, getPath("InputReturnFromFinally.java"), expected);
}
@Test
public void testWithSumCustomMsg() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL");
checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL");
checkConfig.addAttribute("maximumNumber", "1");
checkConfig.addAttribute("maximumDepth", "1");
checkConfig.addAttribute("maximumMessage", "this cannot be null.");
checkConfig.addAttribute("sumTokenCounts", "true");
final String[] expected = {
"22:32: this cannot be null.",
"22:50: this cannot be null.",
"23:33: this cannot be null.",
"23:51: this cannot be null.",
};
verify(checkConfig, getPath("InputReturnFromFinally.java"), expected);
}
@Test
public void testWithSumDefaultMsg() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL");
checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL");
checkConfig.addAttribute("maximumNumber", "1");
checkConfig.addAttribute("maximumDepth", "1");
checkConfig.addAttribute("sumTokenCounts", "true");
final String[] expected = {
"22:32: " + getCheckMessage(MSG_KEY_SUM_MAX, 2, 1, "EQUAL"),
"22:50: " + getCheckMessage(MSG_KEY_SUM_MAX, 2, 1, "EQUAL"),
"23:33: " + getCheckMessage(MSG_KEY_SUM_MAX, 2, 1, "NOT_EQUAL"),
"23:51: " + getCheckMessage(MSG_KEY_SUM_MAX, 2, 1, "NOT_EQUAL"),
};
verify(checkConfig, getPath("InputReturnFromFinally.java"), expected);
}
@Test
public void testWithSumLessThenMinDefMsg() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL");
checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL");
checkConfig.addAttribute("minimumNumber", "3");
checkConfig.addAttribute("sumTokenCounts", "true");
final String[] expected = {
"16:44: " + getCheckMessage(MSG_KEY_SUM_MIN, 0, 3, "EQUAL"),
"22:32: " + getCheckMessage(MSG_KEY_SUM_MIN, 2, 3, "EQUAL"),
"22:50: " + getCheckMessage(MSG_KEY_SUM_MIN, 2, 3, "EQUAL"),
"23:33: " + getCheckMessage(MSG_KEY_SUM_MIN, 2, 3, "NOT_EQUAL"),
"23:51: " + getCheckMessage(MSG_KEY_SUM_MIN, 2, 3, "NOT_EQUAL"),
"24:54: " + getCheckMessage(MSG_KEY_SUM_MIN, 2, 3, "EQUAL"),
"24:77: " + getCheckMessage(MSG_KEY_SUM_MIN, 1, 3, "EQUAL"),
};
verify(checkConfig, getPath("InputReturnFromFinally.java"), expected);
}
@Test
public void testWithSumLessThenMinCustomMsg() throws Exception {
final DefaultConfiguration checkConfig = createCheckConfig(DescendantTokenCheck.class);
checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL");
checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL");
checkConfig.addAttribute("minimumNumber", "3");
checkConfig.addAttribute("sumTokenCounts", "true");
checkConfig.addAttribute("minimumMessage", "custom message");
final String[] expected = {
"16:44: custom message",
"22:32: custom message",
"22:50: custom message",
"23:33: custom message",
"23:51: custom message",
"24:54: custom message",
"24:77: custom message",
};
verify(checkConfig, getPath("InputReturnFromFinally.java"), expected);
}
}