| /* |
| * Copyright 2000-2014 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 com.intellij.refactoring; |
| |
| import com.intellij.JavaTestUtil; |
| import com.intellij.codeInsight.TargetElementUtilBase; |
| import com.intellij.openapi.roots.LanguageLevelProjectExtension; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.pom.java.LanguageLevel; |
| import com.intellij.psi.PsiClass; |
| import com.intellij.psi.PsiElement; |
| import com.intellij.psi.search.GlobalSearchScope; |
| import com.intellij.refactoring.safeDelete.SafeDeleteHandler; |
| import com.intellij.testFramework.PsiTestUtil; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.jps.model.java.JavaSourceRootType; |
| import org.jetbrains.jps.model.java.JpsJavaExtensionService; |
| |
| public class SafeDeleteTest extends MultiFileTestCase { |
| @Override |
| protected String getTestDataPath() { |
| return JavaTestUtil.getJavaTestDataPath(); |
| } |
| |
| @NotNull |
| @Override |
| protected String getTestRoot() { |
| return "/refactoring/safeDelete/"; |
| } |
| |
| public void testImplicitCtrCall() throws Exception { |
| try { |
| doTest("Super"); |
| fail(); |
| } |
| catch (BaseRefactoringProcessor.ConflictsInTestsException e) { |
| String message = e.getMessage(); |
| assertTrue(message, message.startsWith("constructor <b><code>Super.Super()</code></b> has 1 usage that is not safe to delete")); |
| } |
| } |
| |
| public void testImplicitCtrCall2() throws Exception { |
| try { |
| doTest("Super"); |
| fail(); |
| } |
| catch (BaseRefactoringProcessor.ConflictsInTestsException e) { |
| String message = e.getMessage(); |
| assertTrue(message, message.startsWith("constructor <b><code>Super.Super()</code></b> has 1 usage that is not safe to delete")); |
| } |
| } |
| |
| public void testMultipleInterfacesImplementation() throws Exception { |
| doTest("IFoo"); |
| } |
| |
| public void testMultipleInterfacesImplementationThroughCommonInterface() throws Exception { |
| doTest("IFoo"); |
| } |
| |
| public void testUsageInExtendsList() throws Exception { |
| doSingleFileTest(); |
| } |
| |
| public void testParameterInHierarchy() throws Exception { |
| doTest("C2"); |
| } |
| |
| |
| public void testTopLevelDocComment() throws Exception { |
| doTest("foo.C1"); |
| } |
| |
| public void testOverloadedMethods() throws Exception { |
| doTest("foo.A"); |
| } |
| |
| public void testTopParameterInHierarchy() throws Exception { |
| doTest("I"); |
| } |
| |
| public void testExtendsList() throws Exception { |
| doTest("B"); |
| } |
| |
| public void testJavadocParamRef() throws Exception { |
| doTest("Super"); |
| } |
| |
| public void testEnumConstructorParameter() throws Exception { |
| doTest("UserFlags"); |
| } |
| |
| public void testSafeDeleteStaticImports() throws Exception { |
| doTest("A"); |
| } |
| |
| public void testRemoveOverridersInspiteOfUnsafeUsages() throws Exception { |
| try { |
| BaseRefactoringProcessor.ConflictsInTestsException.setTestIgnore(true); |
| doTest("A"); |
| } |
| finally { |
| BaseRefactoringProcessor.ConflictsInTestsException.setTestIgnore(false); |
| } |
| } |
| |
| public void testLocalVariable() throws Exception { |
| doTest("Super"); |
| } |
| |
| public void testOverrideAnnotation() throws Exception { |
| doTest("Super"); |
| } |
| |
| public void testSuperCall() throws Exception { |
| try { |
| doTest("Super"); |
| fail("Conflict was not detected"); |
| } |
| catch (BaseRefactoringProcessor.ConflictsInTestsException e) { |
| String message = e.getMessage(); |
| assertEquals("method <b><code>Super.foo()</code></b> has 1 usage that is not safe to delete.", message); |
| } |
| } |
| |
| public void testParameterFromFunctionalInterface() throws Exception { |
| try { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); |
| doSingleFileTest(); |
| fail("Conflict was not detected"); |
| } |
| catch (BaseRefactoringProcessor.ConflictsInTestsException e) { |
| String message = e.getMessage(); |
| assertEquals("class <b><code>SAM</code></b> has 1 usage that is not safe to delete.", message); |
| } |
| } |
| |
| public void testFunctionalInterfaceMethod() throws Exception { |
| try { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); |
| doSingleFileTest(); |
| fail("Conflict was not detected"); |
| } |
| catch (BaseRefactoringProcessor.ConflictsInTestsException e) { |
| String message = e.getMessage(); |
| assertEquals("class <b><code>SAM</code></b> has 1 usage that is not safe to delete.", message); |
| } |
| } |
| |
| public void testFunctionalInterfaceDefaultMethod() throws Exception { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); |
| doSingleFileTest(); |
| } |
| |
| public void testMethodDeepHierarchy() throws Exception { |
| doTest("Super"); |
| } |
| |
| public void testInterfaceAsTypeParameterBound() throws Exception { |
| doSingleFileTest(); |
| } |
| |
| public void testLocalVariableSideEffect() throws Exception { |
| try { |
| doTest("Super"); |
| fail("Side effect was ignored"); |
| } |
| catch (BaseRefactoringProcessor.ConflictsInTestsException e) { |
| String message = e.getMessage(); |
| assertEquals("local variable <b><code>varName</code></b> has 1 usage that is not safe to delete.", message); |
| } |
| } |
| |
| public void testUsageInGenerated() throws Exception { |
| doTest("A"); |
| } |
| |
| public void testLastResourceVariable() throws Exception { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); |
| doSingleFileTest(); |
| } |
| |
| public void testLastResourceVariableWithFinallyBlock() throws Exception { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); |
| doSingleFileTest(); |
| } |
| |
| public void testLastTypeParam() throws Exception { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); |
| doSingleFileTest(); |
| } |
| |
| public void testTypeParamFromDiamond() throws Exception { |
| LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); |
| doSingleFileTest(); |
| } |
| |
| public void testStripOverride() throws Exception { |
| doSingleFileTest(); |
| } |
| |
| public void testEmptyIf() throws Exception { |
| doSingleFileTest(); |
| } |
| |
| public void testDeleteConstructorParameterWithAnonymousClassUsage() throws Exception { |
| doSingleFileTest(); |
| } |
| |
| private void doTest(@NonNls final String qClassName) throws Exception { |
| doTest(new PerformAction() { |
| @Override |
| public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception { |
| SafeDeleteTest.this.performAction(qClassName); |
| } |
| }); |
| } |
| |
| @Override |
| protected void prepareProject(VirtualFile rootDir) { |
| VirtualFile src = rootDir.findChild("src"); |
| if (src == null) { |
| super.prepareProject(rootDir); |
| } |
| else { |
| PsiTestUtil.addContentRoot(myModule, rootDir); |
| PsiTestUtil.addSourceRoot(myModule, src); |
| } |
| VirtualFile gen = rootDir.findChild("gen"); |
| if (gen != null) { |
| PsiTestUtil.addSourceRoot(myModule, gen, JavaSourceRootType.SOURCE, JpsJavaExtensionService.getInstance().createSourceRootProperties("", true)); |
| } |
| } |
| |
| private void doSingleFileTest() throws Exception { |
| configureByFile(getTestRoot() + getTestName(false) + ".java"); |
| performAction(); |
| checkResultByFile(getTestRoot() + getTestName(false) + "_after.java"); |
| } |
| |
| private void performAction(final String qClassName) throws Exception { |
| final PsiClass aClass = myJavaFacade.findClass(qClassName, GlobalSearchScope.allScope(getProject())); |
| assertNotNull("Class " + qClassName + " not found", aClass); |
| configureByExistingFile(aClass.getContainingFile().getVirtualFile()); |
| |
| performAction(); |
| } |
| |
| private void performAction() { |
| final PsiElement psiElement = TargetElementUtilBase |
| .findTargetElement(myEditor, TargetElementUtilBase.ELEMENT_NAME_ACCEPTED | TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED); |
| assertNotNull("No element found in text:\n" + getFile().getText(), psiElement); |
| SafeDeleteHandler.invoke(getProject(), new PsiElement[]{psiElement}, true); |
| } |
| } |