//////////////////////////////////////////////////////////////////////////////// // 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.github.sevntu.checkstyle.checks.design; import static com.github.sevntu.checkstyle.checks.design.ForbidWildcardAsReturnTypeCheck.MSG_KEY; import java.util.Arrays; import java.util.SortedSet; import java.util.TreeSet; import org.junit.Test; import com.github.sevntu.checkstyle.BaseCheckTestSupport; import com.puppycrawl.tools.checkstyle.DefaultConfiguration; import com.puppycrawl.tools.checkstyle.utils.CommonUtils; /** * Test class for ForbidWildcardInReturnTypeCheck. * @author <a href='mailto:barataliba@gmail.com'>Baratali Izmailov</a> */ public class ForbidWildcardAsReturnTypeCheckTest extends BaseCheckTestSupport { /** * Line numbers with methods which have wildcard in return type. */ private static final SortedSet<Integer> LINES = new TreeSet<>(); /** * Line numbers with public methods which have wildcard in return type. */ private static final SortedSet<Integer> LINES_WITH_PUBLIC_METHODS = newSetOfLines(new Integer[] {9, 29, 54, 59, 64, 104, 109, 114, 119, 124, 129, 134, 228, 242, 280, 281, 282, 283, 284, 285, 286, 294, 304, 307, 310, 313, 328, }); /** * Line numbers with private methods which have wildcard in return type. */ private static final SortedSet<Integer> LINES_WITH_PRIVATE_METHODS = newSetOfLines(new Integer[] {24, 44, 49, 234, 297, }); /** * Line numbers with protected methods which have wildcard in return type. */ private static final SortedSet<Integer> LINES_WITH_PROTECTED_METHODS = newSetOfLines(new Integer[] {19, 39, 231, 243, }); /** * Line numbers with package methods which have wildcard in return type. */ private static final SortedSet<Integer> LINES_WITH_PACKAGE_METHODS = newSetOfLines(new Integer[] {14, 34, 147, 152, 157, 162, 164, 169, 174, 179, 189, 202, 207, 214, 218, 221, 244, 248, 251, 254, 264, 267, 270, 291, }); /** * Line numbers with methods which have upper bounded wildcard in return * type. */ private static final SortedSet<Integer> LINES_WITH_EXTENDS = newSetOfLines(new Integer[] {29, 34, 39, 44, 49, 54, 104, 114, 129, 134, 164, 169, 174, 179, 189, 202, 214, 218, 228, 242, 248, 264, 282, 283, 286, 291, }); /** * Line numbers with methods which have lower bounded wildcard in return * type. */ private static final SortedSet<Integer> LINES_WITH_SUPER = newSetOfLines(new Integer[] {9, 14, 19, 24, 59, 119, 189, 207, 231, 243, 251, 267, 284, 285, 286, 294, }); /** * Line numbers with override methods. */ private static final SortedSet<Integer> LINES_WITH_OVERRIDE = newSetOfLines(new Integer[] {307, 313, }); /** * Line numbers with override methods. */ private static final SortedSet<Integer> LINES_WITH_DEPRECATED = newSetOfLines(new Integer[] {304, 313, 328, }); /** * Line numbers with ignore return type class names. */ private static final SortedSet<Integer> LINES_WITH_IGNORE_CLASS_NAMES = newSetOfLines(new Integer[] {214, 218, 221, }); /** * Ignore list for class names. Regexp. */ private static final String IGNORE_LIST_PATTERN = "(Compar.+)|Collection"; /** * Message for this check. */ private final String warningMessage = getCheckMessage(MSG_KEY); /** * Initialize value of LINES. */ public ForbidWildcardAsReturnTypeCheckTest() { LINES.addAll(LINES_WITH_PACKAGE_METHODS); LINES.addAll(LINES_WITH_PRIVATE_METHODS); LINES.addAll(LINES_WITH_PROTECTED_METHODS); LINES.addAll(LINES_WITH_PUBLIC_METHODS); } /** * Main test. * @throws Exception * exceptions while verify() */ @Test public final void testDefault() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final String[] expected = createExpectedMessages(LINES); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Test only public methods. * @throws Exception * exceptions while verify() */ @Test public final void testOnlyPublicMethods() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "false"); checkConfig.addAttribute("checkProtectedMethods", "false"); checkConfig.addAttribute("checkPackageMethods", "false"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final String[] expected = createExpectedMessages(LINES_WITH_PUBLIC_METHODS); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Test only private methods. * @throws Exception * exceptions while verify() */ @Test public final void testOnlyPrivateMethods() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "false"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "false"); checkConfig.addAttribute("checkPackageMethods", "false"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final String[] expected = createExpectedMessages(LINES_WITH_PRIVATE_METHODS); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Test only protected methods. * @throws Exception * exceptions while verify() */ @Test public final void testOnlyProtectedMethods() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "false"); checkConfig.addAttribute("checkPrivateMethods", "false"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "false"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final String[] expected = createExpectedMessages(LINES_WITH_PROTECTED_METHODS); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Test only package methods. * @throws Exception * exceptions while verify() */ @Test public final void testOnlyPackageMethods() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "false"); checkConfig.addAttribute("checkPrivateMethods", "false"); checkConfig.addAttribute("checkProtectedMethods", "false"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final String[] expected = createExpectedMessages(LINES_WITH_PACKAGE_METHODS); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Allow wildcard with super. * @throws Exception * exceptions while verify() */ @Test public final void testAllowSuper() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "true"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final SortedSet<Integer> exceptSuper = new TreeSet<>(LINES); exceptSuper.removeAll(LINES_WITH_SUPER); exceptSuper.addAll(LINES_WITH_EXTENDS); final String[] expected = createExpectedMessages(exceptSuper); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Allow wildcard with extends. * @throws Exception * exceptions while verify() */ @Test public final void testAllowExtends() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final SortedSet<Integer> exceptExtends = new TreeSet<>(LINES); exceptExtends.removeAll(LINES_WITH_EXTENDS); exceptExtends.addAll(LINES_WITH_SUPER); final String[] expected = createExpectedMessages(exceptExtends); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Allow wildcard with extends and super. * @throws Exception * exceptions while verify() */ @Test public final void testAllowExtendsAndSuper() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "true"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final SortedSet<Integer> exceptSuperAndExtends = new TreeSet<>(LINES); exceptSuperAndExtends.removeAll(LINES_WITH_SUPER); exceptSuperAndExtends.removeAll(LINES_WITH_EXTENDS); final String[] expected = createExpectedMessages(exceptSuperAndExtends); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Allow certain types in ignoreListForClassNames. * @throws Exception * exceptions while verify() */ @Test public final void testWithIgnoreList() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", IGNORE_LIST_PATTERN); final SortedSet<Integer> exceptSuperAndExtends = new TreeSet<>(LINES); exceptSuperAndExtends.removeAll(LINES_WITH_IGNORE_CLASS_NAMES); final String[] expected = createExpectedMessages(exceptSuperAndExtends); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Don't check override methods. * @throws Exception * exceptions while verify() */ @Test public final void testAllExceptOverrideMethods() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "false"); checkConfig.addAttribute("checkDeprecatedMethods", "true"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final SortedSet<Integer> exceptOverride = new TreeSet<>(LINES); exceptOverride.removeAll(LINES_WITH_OVERRIDE); final String[] expected = createExpectedMessages(exceptOverride); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } /** * Don't check deprecated methods. * @throws Exception * exceptions while verify() */ @Test public final void testAllExceptDeprecatedMethods() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); checkConfig.addAttribute("checkPublicMethods", "true"); checkConfig.addAttribute("checkPrivateMethods", "true"); checkConfig.addAttribute("checkProtectedMethods", "true"); checkConfig.addAttribute("checkPackageMethods", "true"); checkConfig.addAttribute("checkOverrideMethods", "true"); checkConfig.addAttribute("checkDeprecatedMethods", "false"); checkConfig.addAttribute("allowReturnWildcardWithSuper", "false"); checkConfig.addAttribute("allowReturnWildcardWithExtends", "false"); checkConfig.addAttribute("returnTypeClassNamesIgnoreRegex", ""); final SortedSet<Integer> exceptOverride = new TreeSet<>(LINES); exceptOverride.removeAll(LINES_WITH_DEPRECATED); final String[] expected = createExpectedMessages(exceptOverride); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheck.java"), expected); } @Test public final void testFullyQualifiedAnnotation() throws Exception { final DefaultConfiguration checkConfig = createCheckConfig(ForbidWildcardAsReturnTypeCheck.class); verify(checkConfig, getPath("InputForbidWildcardAsReturnTypeCheckQualifiedAnnotation.java"), CommonUtils.EMPTY_STRING_ARRAY); } /** * Create new set of line numbers. * @param aLines * arrays of line numbers * @return sorted set of line numbers. */ private static SortedSet<Integer> newSetOfLines(Integer[] aLines) { return new TreeSet<Integer>(Arrays.asList(aLines)); } /** * Create array of expected messages. * @param aLines sorted set of line numbers. * @return array of messages. */ private String[] createExpectedMessages(SortedSet<Integer> aLines) { final String[] expected = new String[aLines.size()]; int index = 0; for (Integer element : aLines) { expected[index] = element + ": " + warningMessage; index++; } return expected; } }