blob: 99dae77b9738dc5a2b43b83bf403d0c2fdd8c950 [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
* for its Fraunhofer Institute and Computer Architecture and Software
* Technology (FIRST), Berlin, Germany and Technical University Berlin,
* Germany.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
* $Id$
*
* Please visit http://www.eclipse.org/objectteams for updates and contact.
*
* Contributors:
* Fraunhofer FIRST - Initial API and implementation
* Technical University Berlin - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.ui.tests.refactoring.pushdown;
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.IField;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;
import org.eclipse.jdt.internal.corext.refactoring.structure.PushDownRefactoringProcessor;
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;
/**
* Copy of {@link org.eclipse.jdt.ui.tests.refactoring.PushDownTests}.
*
* @author Johannes Gebauer
*
*/
@SuppressWarnings({ "nls", "restriction" })
public class PushDownTests extends RefactoringTest {
private static final String REFACTORING_PATH= "PushDown/";
public PushDownTests(String name) {
super(name);
}
protected String getRefactoringPath() {
return REFACTORING_PATH;
}
public static Test suite() {
return new MySetup(new TestSuite(PushDownTests.class));
}
private void performPushDown_pass(String[] cuNames, String[] methodNames, String[][] signatures, String[] fieldNames, String nameOfDeclaringType)
throws Exception {
ICompilationUnit[] cus = createCUs(cuNames);
try {
IType declaringType = getType(cus[0], nameOfDeclaringType);
IMethod[] methods = getMethods(declaringType, methodNames, signatures);
IField[] fields = getFields(declaringType, fieldNames);
IMember[] members = merge(methods, fields);
PushDownRefactoringProcessor processor = createRefactoringProcessor(members);
Refactoring ref = processor.getRefactoring();
assertTrue("activation", ref.checkInitialConditions(new NullProgressMonitor()).isOK());
RefactoringStatus checkInputResult = ref.checkFinalConditions(new NullProgressMonitor());
assertTrue("precondition was supposed to pass", !checkInputResult.hasError());
performChange(ref, false);
for (int i = 0; i < cus.length; i++) {
String expected = getFileContents(getOutputTestFileName(cuNames[i]));
String actual = cus[i].getSource();
assertEqualLines(expected, actual);
}
} finally {
performDummySearch();
for (int i = 0; i < cus.length; i++) {
cus[i].delete(false, null);
}
}
}
private void performPushDown_fail(String[] cuNames, String[] methodNames, String[][] signatures, String[] fieldNames, String nameOfDeclaringType)
throws Exception {
ICompilationUnit[] cus = createCUs(cuNames);
try {
IType declaringType = getType(cus[0], nameOfDeclaringType);
IMethod[] methods = getMethods(declaringType, methodNames, signatures);
IField[] fields = getFields(declaringType, fieldNames);
IMember[] members = merge(methods, fields);
PushDownRefactoringProcessor processor = createRefactoringProcessor(members);
Refactoring ref = processor.getRefactoring();
assertTrue("activation", ref.checkInitialConditions(new NullProgressMonitor()).isOK());
RefactoringStatus result = performRefactoring(ref);
assertNotNull("precondition was supposed to fail.", result);
assertTrue("precondition was supposed to fail.", !result.isOK());
assertNotNull("precondition result is expected to contain an error.", result.getEntryMatchingSeverity(RefactoringStatus.ERROR));
} finally {
performDummySearch();
for (int i = 0; i < cus.length; i++) {
cus[i].delete(false, null);
}
}
}
private static PushDownRefactoringProcessor createRefactoringProcessor(IMember[] methods) throws JavaModelException {
if (RefactoringAvailabilityTester.isPullUpAvailable(methods)) {
PushDownRefactoringProcessor processor = new PushDownRefactoringProcessor(methods);
new ProcessorBasedRefactoring(processor);
return processor;
}
return null;
}
//--------------------------------------------------------
public void testPushDownMethodToImplicitSubclass() throws Exception {
performPushDown_pass(new String[] { "TSuper", "T", "B" }, new String[] { "rm" }, new String[][] { new String[0] }, new String[] {}, "R");
}
public void testDeclaringTypeHasADirectPhantomSubRole() throws Exception {
performPushDown_fail(new String[] { "TSuper", "T1", "T2" }, new String[] { "rm" }, new String[][] { new String[0] }, new String[] {}, "R");
}
public void testPushedDownMethodReferencedInMethodBinding1() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] { "bm" }, new String[][] { new String[0] }, new String[] {}, "B1");
}
public void testPushedDownMethodReferencedInMethodBinding2() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] { "bm" }, new String[][] { new String[0] }, new String[] {}, "B1");
}
public void testPushedDownMethodReferencedInMethodBinding3() throws Exception {
performPushDown_fail(new String[] { "T1", "T2", "B" }, new String[] { "rm" }, new String[][] { new String[0] }, new String[] {}, "Role");
}
public void testPushedDownMethodIsReferencedInRegularGuard1() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] { "b" }, new String[][] { new String[0] }, new String[] {}, "R1");
}
public void testPushedDownMethodIsReferencedInRegularGuard2() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] { "b" }, new String[][] { new String[0] }, new String[] {}, "R1");
}
public void testPushedDownMethodIsReferencedInBaseGuard1() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] { "b" }, new String[][] { new String[0] }, new String[] {}, "B1");
}
public void testPushedDownMethodIsReferencedInBaseGuard2() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] { "b" }, new String[][] { new String[0] }, new String[] {}, "B1");
}
public void testPushedDownMethodIsReferencedInBaseGuard3() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] { "b" }, new String[][] { new String[0] }, new String[] {}, "B1");
}
public void testPushedDownMethodIsReferencedInParameterMapping1() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] { "f" }, new String[][] { new String[0] }, new String[] {}, "R1");
}
public void testPushedDownMethodIsReferencedInParameterMapping2() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] { "f" }, new String[][] { new String[0] }, new String[] {}, "R1");
}
public void testPushedDownMethodIsReferencedInParameterMapping3() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] { "f" }, new String[][] { new String[0] }, new String[] {}, "R1");
}
/* Push Down Field Tests */
public void testPushDownFieldToImplicitSubclass() throws Exception {
performPushDown_pass(new String[] { "TSuper", "T", "B" }, new String[] {}, new String[][] { new String[0] }, new String[] { "f" }, "R");
}
public void testPushedDownFieldReferencedInCalloutToField() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] {}, new String[][] { new String[0] }, new String[] { "f" }, "B1");
}
public void testPushDownTypeAnchorInstance() throws Exception {
performPushDown_fail(new String[] { "T1", "T2", "T3" }, new String[] {}, new String[][] { new String[0] }, new String[] { "anchor" }, "T1");
}
public void testPushedDownFieldWouldShadowAnInheritedField() throws Exception {
performPushDown_fail(new String[] { "B", "T1", "T2" }, new String[] {}, new String[][] { new String[0] }, new String[] { "f" }, "B");
}
public void testPushedDownFieldIsReferencedInRegularGuard1() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] {}, new String[][] { new String[0] }, new String[] { "b" }, "R1");
}
public void testPushedDownFieldIsReferencedInRegularGuard2() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] {}, new String[][] { new String[0] }, new String[] { "b" }, "R1");
}
public void testPushedDownFieldIsReferencedInBaseGuard1() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] {}, new String[][] { new String[0] }, new String[] { "b" }, "B1");
}
public void testPushedDownFieldIsReferencedInBaseGuard2() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] {}, new String[][] { new String[0] }, new String[] { "b" }, "B1");
}
public void testPushedDownFieldIsReferencedInBaseGuard3() throws Exception {
performPushDown_fail(new String[] { "B1", "B2", "T" }, new String[] {}, new String[][] { new String[0] }, new String[] { "b" }, "B1");
}
public void testPushedDownFieldIsReferencedInParameterMapping1() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] {}, new String[][] { new String[0] }, new String[] { "f" }, "R1");
}
public void testPushedDownFieldIsReferencedInParameterMapping2() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] {}, new String[][] { new String[0] }, new String[] { "f" }, "R1");
}
public void testOverrideImplicitInheritedMethod() throws Exception {
performPushDown_fail(new String[] { "A", "T1", "T2" }, new String[] { "m" }, new String[][] { new String[0] }, new String[] {}, "A");
}
public void testOverrideExplicitInheritedMethod() throws Exception {
performPushDown_pass(new String[] { "T2", "T1", "A" }, new String[] { "m" }, new String[][] { new String[0] }, new String[] {}, "R");
}
// See Ticket #286
public void testPushedDownFieldIsReferencedInParameterMapping3() throws Exception {
performPushDown_fail(new String[] { "T", "B" }, new String[] {}, new String[][] { new String[0] }, new String[] { "f" }, "R1");
}
}