Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/misc/ChangeSignatureTests.java')
-rw-r--r--testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/misc/ChangeSignatureTests.java314
1 files changed, 314 insertions, 0 deletions
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/misc/ChangeSignatureTests.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/misc/ChangeSignatureTests.java
new file mode 100644
index 000000000..bef867db1
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/misc/ChangeSignatureTests.java
@@ -0,0 +1,314 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ *
+ * Copyright 2010 GK Software AG
+ *
+ * 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
+ * $Id$
+ *
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ *
+ * Contributors:
+ * Stephan Herrmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.ui.tests.refactoring.misc;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo;
+import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;
+import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureProcessor;
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;
+import org.eclipse.objectteams.otdt.ui.tests.refactoring.MySetup;
+import org.eclipse.objectteams.otdt.ui.tests.refactoring.RefactoringTest;
+
+/**
+ * Some helper methods in this class have been inspired by the test class
+ * <code>ChangeSignatureTests</code> in the test suite
+ * <code>org.eclipse.jdt.ui.tests.refactoring</code> provided by Eclipse JDT.
+ *
+ * @author stephan
+ */
+@SuppressWarnings("restriction")
+public class ChangeSignatureTests extends RefactoringTest {
+
+ private static final String REFACTORING_PATH = "ChangeSignature/";
+
+ public ChangeSignatureTests(String name) {
+ super(name);
+ }
+
+ public static Test suite()
+ {
+ return new MySetup(new TestSuite(ChangeSignatureTests.class));
+ }
+
+ public static Test setUpTest(Test test)
+ {
+ return new MySetup(test);
+ }
+
+ protected String getRefactoringPath()
+ {
+ return REFACTORING_PATH;
+ }
+
+ private Refactoring createRefactoring(ChangeSignatureProcessor processor)
+ {
+ return new ProcessorBasedRefactoring(processor);
+ }
+
+ private ChangeSignatureProcessor createProcessor(IMethod method) throws JavaModelException
+ {
+ return new ChangeSignatureProcessor(method);
+ }
+
+
+ private String getSimpleTestFileName(boolean canReorder, boolean input){
+ String fileName = "A_" + getName();
+ if (canReorder)
+ fileName += input ? "_in": "_out";
+ return fileName + ".java";
+ }
+
+ private String getTestFileName(boolean canReorder, boolean input){
+ String fileName= getTestFolderPath(canReorder);
+ return fileName + getSimpleTestFileName(canReorder, input);
+ }
+
+ private String getTestFolderPath(boolean canModify) {
+ String fileName= TEST_PATH_PREFIX + getRefactoringPath();
+ fileName += (canModify ? "canModify/": "cannotModify/");
+ return fileName;
+ }
+
+ //---helpers
+
+ protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canRename, boolean input) throws Exception {
+ return createCU(pack, getSimpleTestFileName(canRename, input), getFileContents(getTestFileName(canRename, input)));
+ }
+
+ static ParameterInfo[] createNewParamInfos(String[] newTypes, String[] newNames, String[] newDefaultValues) {
+ if (newTypes == null)
+ return new ParameterInfo[0];
+ ParameterInfo[] result= new ParameterInfo[newTypes.length];
+ for (int i= 0; i < newDefaultValues.length; i++) {
+ result[i]= ParameterInfo.createInfoForAddedParameter(newTypes[i], newNames[i], newDefaultValues[i]);
+ }
+ return result;
+ }
+
+ static void addInfos(List list, ParameterInfo[] newParamInfos, int[] newIndices) {
+ if (newParamInfos == null || newIndices == null)
+ return;
+ for (int i= newIndices.length - 1; i >= 0; i--) {
+ list.add(newIndices[i], newParamInfos[i]);
+ }
+ }
+
+ private void helperAdd(String[] signature, ParameterInfo[] newParamInfos, int[] newIndices, boolean createDelegate, String expectedInfo) throws Exception {
+ ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
+ IType classA= getType(cu, "A");
+ IMethod method = classA.getMethod("m", signature);
+ assertTrue("method does not exist", method.exists());
+ assertTrue("refactoring not available", RefactoringAvailabilityTester.isChangeSignatureAvailable(method));
+
+ ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method);
+ Refactoring ref= new ProcessorBasedRefactoring(processor);
+
+ processor.setDelegateUpdating(createDelegate);
+ addInfos(processor.getParameterInfos(), newParamInfos, newIndices);
+ RefactoringStatus initialConditions= ref.checkInitialConditions(new NullProgressMonitor());
+ assertTrue("precondition was supposed to pass:"+initialConditions.getEntryWithHighestSeverity(), initialConditions.isOK());
+ RefactoringStatus result= performRefactoring(ref, true);
+ if (expectedInfo != null) {
+ assertTrue("precondition was supposed to create an info:"+result.getEntryWithHighestSeverity(), result.hasInfo());
+ assertEquals("wrong info", expectedInfo, result.getEntryMatchingSeverity(RefactoringStatus.INFO).getMessage());
+ } else {
+ assertEquals("precondition was supposed to pass", null, result);
+ }
+
+ IPackageFragment pack= (IPackageFragment)cu.getParent();
+ String newCuName= getSimpleTestFileName(true, true);
+ ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
+ assertTrue(newCuName + " does not exist", newcu.exists());
+ String expectedFileContents= getFileContents(getTestFileName(true, false));
+ assertEqualLines("invalid renaming", expectedFileContents, newcu.getSource());
+
+// assertParticipant(classA);
+ }
+
+ private void helperDelete(String[] signature, int[] deleteIndices, boolean createDelegate, String expectedInfo) throws Exception {
+ ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
+ IType classA= getType(cu, "A");
+ IMethod method = classA.getMethod("m", signature);
+ assertTrue("method does not exist", method.exists());
+ assertTrue("refactoring not available", RefactoringAvailabilityTester.isChangeSignatureAvailable(method));
+
+ ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method);
+ Refactoring ref= new ProcessorBasedRefactoring(processor);
+
+ processor.setDelegateUpdating(createDelegate);
+ markAsDeleted(processor.getParameterInfos(), deleteIndices);
+ RefactoringStatus initialConditions= ref.checkInitialConditions(new NullProgressMonitor());
+ assertTrue("precondition was supposed to pass:"+initialConditions.getEntryWithHighestSeverity(), initialConditions.isOK());
+ RefactoringStatus result= performRefactoring(ref, true);
+ if (expectedInfo != null) {
+ assertTrue("precondition was supposed to create an info:"+result.getEntryWithHighestSeverity(), result.hasInfo());
+ assertEquals("wrong info", expectedInfo, result.getEntryMatchingSeverity(RefactoringStatus.INFO).getMessage());
+ } else {
+ assertEquals("precondition was supposed to pass", null, result);
+ }
+
+ IPackageFragment pack= (IPackageFragment)cu.getParent();
+ String newCuName= getSimpleTestFileName(true, true);
+ ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
+ assertTrue(newCuName + " does not exist", newcu.exists());
+ String expectedFileContents= getFileContents(getTestFileName(true, false));
+ assertEqualLines("invalid renaming", expectedFileContents, newcu.getSource());
+
+// assertParticipant(classA);
+ }
+
+ private void helperPermute(String[] newOrder, String[] signature, boolean createDelegate) throws Exception{
+ ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
+ IType classA= getType(cu, "A");
+ IMethod method = classA.getMethod("m", signature);
+ assertTrue("method does not exist", method.exists());
+ assertTrue("refactoring not available", RefactoringAvailabilityTester.isChangeSignatureAvailable(method));
+
+ ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method);
+ Refactoring ref= new ProcessorBasedRefactoring(processor);
+
+ processor.setDelegateUpdating(createDelegate);
+ permute(processor.getParameterInfos(), newOrder);
+ ref.checkInitialConditions(new NullProgressMonitor());
+ RefactoringStatus result= performRefactoring(ref, true);
+ assertEquals("precondition was supposed to pass", null, result);
+
+ IPackageFragment pack= (IPackageFragment)cu.getParent();
+ String newCuName= getSimpleTestFileName(true, true);
+ ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
+ assertTrue(newCuName + " does not exist", newcu.exists());
+ String expectedFileContents= getFileContents(getTestFileName(true, false));
+// assertEquals("invalid renaming", expectedFileContents, newcu.getSource());
+ assertEqualLines(expectedFileContents, newcu.getSource());
+
+// assertParticipant(classA);
+ }
+
+ private void permute(List infos, String[] newOrder) {
+ int[] permutation= createPermutation(infos, newOrder);
+ List swapped= new ArrayList(infos.size());
+ ParameterInfo[] newInfos= new ParameterInfo[infos.size()];
+ for (int i= 0; i < permutation.length; i++) {
+ newInfos[i]= (ParameterInfo)infos.get(permutation[i]);
+ }
+ infos.clear();
+ for (int i= 0; i < newInfos.length; i++) {
+ infos.add(newInfos[i]);
+ }
+ }
+
+ private static int[] createPermutation(List infos, String[] newOrder) {
+ int[] result= new int[infos.size()];
+ for (int i= 0; i < result.length; i++) {
+ result[i]= indexOfOldName(infos, newOrder[i]);
+ }
+ return result;
+ }
+
+ private static int indexOfOldName(List infos, String string) {
+ for (Iterator iter= infos.iterator(); iter.hasNext();) {
+ ParameterInfo info= (ParameterInfo) iter.next();
+ if (info.getOldName().equals(string))
+ return infos.indexOf(info);
+ }
+ assertTrue(false);
+ return -1;
+ }
+
+ private void markAsDeleted(List list, int[] deleted) {
+ if (deleted == null)
+ return;
+ for (int i= 0; i < deleted.length; i++) {
+ ((ParameterInfo)list.get(deleted[i])).markAsDeleted();
+ }
+ }
+
+ // add argument at base side of callin
+ public void testAdd01()throws Exception{
+ String[] signature= {"I"};
+ String[] newNames= {"x"};
+ String[] newTypes= {"int"};
+ String[] newDefaultValues= {"0"};
+ ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
+ int[] newIndices= {1};
+ helperAdd(signature, newParamInfo, newIndices, true/*delegate*/, null/*expectInfo*/);
+ }
+
+ // add argument at role side (inherited from non-role) of callout
+ public void testAdd02()throws Exception{
+ String[] signature= {"I"};
+ String[] newNames= {"x"};
+ String[] newTypes= {"int"};
+ String[] newDefaultValues= {"0"};
+ ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
+ int[] newIndices= {1};
+ helperAdd(signature, newParamInfo, newIndices, false/*delegate*/, null/*expectInfo*/);
+ }
+
+ // add argument at role side of callin
+ public void testAdd03()throws Exception{
+ String[] signature= {"I"};
+ String[] newNames= {"x"};
+ String[] newTypes= {"int"};
+ String[] newDefaultValues= {"0"};
+ ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
+ int[] newIndices= {1};
+ helperAdd(signature, newParamInfo, newIndices, false/*delegate*/, "Adding arguments at the role side of a callin binding is not fully supported. Please manually update transitive references."/*expectedInfo*/);
+ }
+
+ // add argument at base side of callout
+ public void testAdd04()throws Exception{
+ String[] signature= {"I"};
+ String[] newNames= {"x"};
+ String[] newTypes= {"int"};
+ String[] newDefaultValues= {"0"};
+ ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
+ int[] newIndices= {1};
+ helperAdd(signature, newParamInfo, newIndices, false/*delegate*/, "Adding arguments at the base side of a callout binding is not fully supported. Please manually update transitive references."/*expectedInfo*/);
+ }
+
+ // delete argument at base side of callin
+ public void testDelete01()throws Exception{
+ int[] deleteIndices= {1};
+ helperDelete(new String[]{"I", "I"}, deleteIndices, true/*delegate*/, "Deleting arguments at the base side of a callin binding is not fully supported. Please manually update transitive references."/*expectInfo*/);
+ }
+
+ // delete argument at role side (inherited from non-role) of callout
+ public void testDelete02()throws Exception{
+ int[] deleteIndices= {1};
+ helperDelete(new String[]{"I", "I"}, deleteIndices, false/*delegate*/, "Deleting arguments at the role side of a callout binding is not fully supported. Please manually update transitive references."/*expectInfo*/);
+ }
+
+ public void testReorder01() throws Exception {
+ helperPermute(new String[]{"ignore", "b", "a"}, new String[]{"I", "Z", "QString;"}, false);
+ }
+}

Back to the top