/******************************************************************************* * Copyright (c) 2014, 2015 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sergey Prigogin (Google) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.ui.tests.refactoring.rename; import junit.framework.Test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.jface.text.TextSelection; import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring; import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring; import org.eclipse.ltk.internal.core.refactoring.resource.MoveResourcesProcessor; import org.eclipse.ltk.internal.core.refactoring.resource.RenameResourceProcessor; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.ui.tests.refactoring.RefactoringTestBase; import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; import org.eclipse.cdt.internal.ui.refactoring.rename.CRefactoringArgument; import org.eclipse.cdt.internal.ui.refactoring.rename.CRefactory; import org.eclipse.cdt.internal.ui.refactoring.rename.CRenameProcessor; import org.eclipse.cdt.internal.ui.refactoring.rename.CRenameRefactoring; /** * Tests for * {@link org.eclipse.cdt.internal.ui.refactoring.rename.HeaderFileRenameParticipant} and * {@link org.eclipse.cdt.internal.ui.refactoring.rename.HeaderFileMoveParticipant}. */ public class RenameMoveHeaderRefactoringTest extends RefactoringTestBase { public RenameMoveHeaderRefactoringTest() { super(); } public RenameMoveHeaderRefactoringTest(String name) { super(name); } public static Test suite() { return suite(RenameMoveHeaderRefactoringTest.class); } @Override protected void resetPreferences() { super.resetPreferences(); getPreferenceStore().setToDefault(PreferenceConstants.FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT); getPreferenceStore().setToDefault(PreferenceConstants.FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER); } @Override protected CRefactoring createRefactoring() { throw new UnsupportedOperationException(); } protected CRenameRefactoring createRenameRefactoring(String newName) { IFile file = getSelectedFile(); TextSelection selection = getSelection(); CRefactoringArgument arg = new CRefactoringArgument(file, selection.getOffset(), selection.getLength()); CRenameProcessor processor = new CRenameProcessor(CRefactory.getInstance(), arg); processor.setReplacementText(newName); processor.setSelectedOptions(0xFFFF & ~CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH); return new CRenameRefactoring(processor); } protected void executeRenameRefactoring(String newName, boolean expectedSuccess) throws Exception { CRenameRefactoring refactoring = createRenameRefactoring(newName); refactoring.getProcessor().lockIndex(); try { executeRefactoring(refactoring, expectedSuccess); } finally { refactoring.getProcessor().unlockIndex(); } } // test1.h //#ifndef TEST1_H_ //#define TEST1_H_ // //class A {}; // //#endif // TEST1_H_ //==================== // test.h //#ifndef TEST_H_ //#define TEST_H_ // //class A {}; // //#endif // TEST_H_ // test.cpp //#include <string> //#include "test1.h" /* Comment1 */ // Comment2 //==================== // test.cpp //#include "test.h" /* Comment1 */ // Comment2 // //#include <string> public void testFileRename() throws Exception { IResource resource = getProject().getFile("test1.h"); RenameResourceProcessor processor = new RenameResourceProcessor(resource); processor.setNewResourceName("test.h"); RenameRefactoring refactoring = new RenameRefactoring(processor); executeRefactoring(refactoring, true); compareFiles(); } // header1.h //#ifndef HEADER1_H_ //#define HEADER1_H_ // //class A {}; // //#endif // HEADER1_H_ //==================== // dir/header1.h //#ifndef DIR_HEADER1_H_ //#define DIR_HEADER1_H_ // //class A {}; // //#endif // DIR_HEADER1_H_ // source1.cpp //#include "header1.h" //==================== // source1.cpp //#include "dir/header1.h" public void testFileMove() throws Exception { IResource resource = getProject().getFile("header1.h"); MoveResourcesProcessor processor = new MoveResourcesProcessor(new IResource[] { resource }); IFolder destination = getProject().getFolder("dir"); destination.create(true, true, npm()); processor.setDestination(destination); MoveRefactoring refactoring = new MoveRefactoring(processor); executeRefactoring(refactoring, true); compareFiles(); } // dir1/header1.h //#ifndef DIR1_HEADER1_H_ //#define DIR1_HEADER1_H_ // //#include "dir1/header2.h" // //#endif // DIR1_HEADER1_H_ //==================== // dir3/header1.h //#ifndef DIR3_HEADER1_H_ //#define DIR3_HEADER1_H_ // //#include "dir3/header2.h" // //#endif // DIR3_HEADER1_H_ // dir1/header2.h //#if !defined(DIR1_HEADER2_H_) //#define DIR1_HEADER2_H_ // //class A {}; // //#endif /* DIR1_HEADER2_H_ */ //==================== // dir3/header2.h //#if !defined(DIR3_HEADER2_H_) //#define DIR3_HEADER2_H_ // //class A {}; // //#endif /* DIR3_HEADER2_H_ */ // dir1/source1.cpp //#include <string> // //#include "dir1/header1.h" //==================== // dir3/source1.cpp //#include <string> // //#include "dir3/header1.h" // source2.cpp //#include "dir1/header1.h" //#include "dir2/header3.h" // //#ifdef SOMETHING // #include "dir1/header2.h" //#endif //==================== //#include "dir2/header3.h" //#include "dir3/header1.h" // //#ifdef SOMETHING // #include "dir3/header2.h" //#endif public void testFolderRename() throws Exception { IFolder resource = getProject().getFolder("dir1"); RenameResourceProcessor processor = new RenameResourceProcessor(resource); processor.setNewResourceName("dir3"); RenameRefactoring refactoring = new RenameRefactoring(processor); executeRefactoring(refactoring, true); compareFiles(); } // src1/header1.h //#ifndef HEADER1_H_ //#define HEADER1_H_ // //#include "src1/header2.h" // //#endif // HEADER1_H_ //==================== // src2/header1.h //#ifndef HEADER1_H_ //#define HEADER1_H_ // //#include "src2/header2.h" // //#endif // HEADER1_H_ // src1/header2.h //#if !defined(HEADER2_H_) //#define HEADER2_H_ // //class A {}; // //#endif /* HEADER2_H_ */ //==================== // src2/header2.h //#if !defined(HEADER2_H_) //#define HEADER2_H_ // //class A {}; // //#endif /* HEADER2_H_ */ // src1/source1.cpp //#include <string> // //#include "src1/header1.h" //==================== // src2/source1.cpp //#include <string> // //#include "src2/header1.h" public void testSourceRootRename() throws Exception { CProjectHelper.addSourceRoot(getCProject(), "src1"); IFolder resource = getProject().getFolder("src1"); RenameResourceProcessor processor = new RenameResourceProcessor(resource); processor.setNewResourceName("src2"); RenameRefactoring refactoring = new RenameRefactoring(processor); executeRefactoring(refactoring, true); ISourceRoot[] sourceRoots = getCProject().getAllSourceRoots(); assertEquals(2, sourceRoots.length); assertEquals(getProject().getName(), sourceRoots[0].getElementName()); assertEquals("src2", sourceRoots[1].getElementName()); compareFiles(); } // dir1/header1.h //#ifndef DIR1_HEADER1_H_ //#define DIR1_HEADER1_H_ // //#include "dir1/header2.h" // //#endif // DIR1_HEADER1_H_ //==================== // dir3/dir1/header1.h //#ifndef DIR3_DIR1_HEADER1_H_ //#define DIR3_DIR1_HEADER1_H_ // //#include "dir3/dir1/header2.h" // //#endif // DIR3_DIR1_HEADER1_H_ // dir1/header2.h //#if !defined(DIR1_HEADER2_H_) //#define DIR1_HEADER2_H_ // //class A {}; // //#endif /* DIR1_HEADER2_H_ */ //==================== // dir3/dir1/header2.h //#if !defined(DIR3_DIR1_HEADER2_H_) //#define DIR3_DIR1_HEADER2_H_ // //class A {}; // //#endif /* DIR3_DIR1_HEADER2_H_ */ // dir1/source1.cpp //#include <string> // //#include "dir1/header1.h" //==================== // dir3/dir1/source1.cpp //#include <string> // //#include "dir3/dir1/header1.h" // source2.cpp //#include "dir1/header1.h" //#include "dir2/header3.h" // //int x = 0; //#include "dir1/header2.h" //==================== //#include "dir2/header3.h" //#include "dir3/dir1/header1.h" // //int x = 0; //#include "dir3/dir1/header2.h" public void testFolderMove() throws Exception { IFolder resource = getProject().getFolder("dir1"); MoveResourcesProcessor processor = new MoveResourcesProcessor(new IResource[] { resource }); IFolder destination = getProject().getFolder("dir3"); destination.create(true, true, npm()); processor.setDestination(destination); MoveRefactoring refactoring = new MoveRefactoring(processor); executeRefactoring(refactoring, true); compareFiles(); } // my-class.h //#ifndef MY_CLASS_H_ //#define MY_CLASS_H_ // //class MyClass {}; // //#endif // MY_CLASS_H_ //==================== // my-new-class.h //#ifndef MY_NEW_CLASS_H_ //#define MY_NEW_CLASS_H_ // //class MyNewClass {}; // //#endif // MY_NEW_CLASS_H_ // my-class.cpp //#include "my-class.h" // //#include <cstdio> //==================== // my-new-class.cpp //#include "my-new-class.h" // //#include <cstdio> // my-class_test.cpp //#include "my-class.h" //==================== // my-new-class_test.cpp //#include "my-new-class.h" // some-other-file.cpp //#include "my-class.h" ///*$*/MyClass/*$$*/ a; //==================== // some-other-file.cpp //#include "my-new-class.h" //MyNewClass a; public void testClassRename() throws Exception { executeRenameRefactoring("MyNewClass", true); compareFiles(); } }