/* * User: anna * Date: 20-Aug-2008 */ package com.intellij.refactoring; import com.intellij.JavaTestUtil; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PropertyUtil; import com.intellij.refactoring.encapsulateFields.EncapsulateFieldsDescriptor; import com.intellij.refactoring.encapsulateFields.EncapsulateFieldsProcessor; import com.intellij.refactoring.util.DocCommentPolicy; import junit.framework.Assert; import org.jetbrains.annotations.Nullable; public class EncapsulateFieldsTest extends MultiFileTestCase{ public void testAlreadyExist() throws Exception { doTest("i" , null); } public void testDiffWithReturnTypeOnly() throws Exception { doTest("i", "There already is a method Test setI(int) which differs from setter setI by return type only."); } public void testDiffWithReturnTypeOnlyInHierarchy() throws Exception { doTest("i", "There already is a method Super setI(int) which differs from setter setI by return type only."); } public void testHideOverriderMethod() throws Exception { doTest("i", "A", "There is already a method B.getI() which would hide generated getter for a.i"); } public void testHideOuterclassMethod() throws Exception { doTest("i", "A.B", "There is already a method A.getI() which would be hidden by generated getter"); } public void testMoveJavadocToGetter() throws Exception { doTest(new PerformAction() { @Override public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception { final PsiClass aClass = myJavaFacade.findClass("A", GlobalSearchScope.projectScope(myProject)); assertNotNull("Tested class not found", aClass); final PsiField field = aClass.findFieldByName("i", false); assertNotNull(field); doTest(aClass, field, null, true, true); } }); } @Override protected String getTestDataPath() { return JavaTestUtil.getJavaTestDataPath(); } @Override protected String getTestRoot() { return "/refactoring/encapsulateFields/"; } private void doTest(final String fieldName, final String conflicts) throws Exception { doTest(fieldName, "Test", conflicts); } private void doTest(final String fieldName, final String className, final String conflicts) throws Exception { doTest(new PerformAction() { @Override public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception { PsiClass aClass = myJavaFacade.findClass(className, GlobalSearchScope.projectScope(myProject)); assertNotNull("Tested class not found", aClass); doTest(aClass, aClass.findFieldByName(fieldName, false), conflicts, true, true); } }); } private static void doTest(final PsiClass aClass, final PsiField field, final String conflicts, final boolean generateGetters, final boolean generateSetters) { try { final Project project = aClass.getProject(); EncapsulateFieldsProcessor processor = new EncapsulateFieldsProcessor(project, new EncapsulateFieldsDescriptor() { @Override public PsiField[] getSelectedFields() { return new PsiField[]{field}; } @Override public String[] getGetterNames() { return new String[]{PropertyUtil.suggestGetterName(project, field)}; } @Override public String[] getSetterNames() { return new String[]{PropertyUtil.suggestSetterName(project, field)}; } @Override @Nullable public PsiMethod[] getGetterPrototypes() { return isToEncapsulateGet() ? new PsiMethod[]{PropertyUtil.generateGetterPrototype(field)} : null; } @Override @Nullable public PsiMethod[] getSetterPrototypes() { return isToEncapsulateSet() ? new PsiMethod[]{PropertyUtil.generateSetterPrototype(field)} : null; } @Override public boolean isToEncapsulateGet() { return generateGetters; } @Override public boolean isToEncapsulateSet() { return generateSetters; } @Override public boolean isToUseAccessorsWhenAccessible() { return true; } @Override public String getFieldsVisibility() { return null; } @Override public String getAccessorsVisibility() { return PsiModifier.PUBLIC; } @Override public int getJavadocPolicy() { return DocCommentPolicy.MOVE; } }); processor.run(); LocalFileSystem.getInstance().refresh(false); FileDocumentManager.getInstance().saveAllDocuments(); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { if (conflicts != null) { Assert.assertEquals(conflicts, e.getMessage()); return; } else { e.printStackTrace(); fail(e.getMessage()); } } if (conflicts != null) { fail("Conflicts were not detected: " + conflicts); } } }