package com.intellij.codeInspection; import com.intellij.JavaTestUtil; import com.intellij.ToolExtensionPoints; import com.intellij.codeInspection.reference.RefElement; import com.intellij.codeInspection.visibility.EntryPointWithVisibilityLevel; import com.intellij.codeInspection.visibility.VisibilityInspection; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMember; import com.intellij.psi.PsiMethod; import com.intellij.psi.util.PsiUtil; import com.intellij.testFramework.InspectionTestCase; import com.intellij.testFramework.PlatformTestUtil; import org.jdom.Element; import org.jetbrains.annotations.NotNull; public class VisibilityInspectionTest extends InspectionTestCase { private VisibilityInspection myTool = new VisibilityInspection(); @Override protected String getTestDataPath() { return JavaTestUtil.getJavaTestDataPath() + "/inspection"; } private void doTest() throws Exception { doTest("visibility/" + getTestName(false), myTool); } @Override protected void tearDown() throws Exception { myTool = null; super.tearDown(); } public void testinnerConstructor() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = false; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest(); } public void testpackageLevelTops() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = false; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = false; doTest(); } public void testSCR5008() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest(); } public void testSCR6856() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest(); } public void testSCR11792() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest(); } public void testIDEADEV10312() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = false; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = false; doTest(); } public void testIDEADEV10883() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = false; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = false; doTest(); } public void testDefaultConstructor() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = false; doTest("visibility/defaultConstructor", myTool, false, true); } public void testImplicitConstructor() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = false; doTest("visibility/implicitConstructor", myTool, false, true); } public void testEnumConstants() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = false; doTest("visibility/enumConstantsVisibility", myTool, false, true); } public void testUsagesFromAnnotations() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = false; doTest("visibility/annotationUsages", myTool, false, true); } public void testTypeArguments() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = false; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = false; myTool.SUGGEST_PRIVATE_FOR_INNERS = false; doTest("visibility/typeArguments", myTool, false, true); } public void testUsedFromAnnotationsExtendsList() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest("visibility/usedFromAnnotationsExtendsList", myTool, false, true); } public void testUsedQualifiedFromAnotherPackage() throws Exception { myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = true; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = true; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest("visibility/usedFromAnotherPackage", myTool, false, true); } public void testEntryPointWithPredefinedVisibility() throws Exception { PlatformTestUtil.registerExtension(Extensions.getRootArea(), ExtensionPointName.create(ToolExtensionPoints.DEAD_CODE_TOOL), new EntryPointWithVisibilityLevel() { @Override public void readExternal(Element element) throws InvalidDataException {} @Override public void writeExternal(Element element) throws WriteExternalException {} @NotNull @Override public String getDisplayName() { return "accepted visibility"; } @Override public boolean isEntryPoint(@NotNull RefElement refElement, @NotNull PsiElement psiElement) { return isEntryPoint(psiElement); } @Override public boolean isEntryPoint(@NotNull PsiElement psiElement) { return psiElement instanceof PsiMethod && "foo".equals(((PsiMethod)psiElement).getName()) || psiElement instanceof PsiClass; } @Override public int getMinVisibilityLevel(PsiMember member) { return member instanceof PsiMethod && isEntryPoint(member) ? PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL : -1; } @Override public boolean isSelected() { return true; } @Override public void setSelected(boolean selected) {} @Override public String getTitle() { return getDisplayName(); } @Override public String getId() { return getDisplayName(); } }, getTestRootDisposable()); myTool.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = false; myTool.SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES = false; myTool.SUGGEST_PRIVATE_FOR_INNERS = true; doTest("visibility/entryPointWithPredefinedVisibility", myTool, false, true); } }