blob: b93adb0752664f99c322c109292476ec1dd2dc3b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 IBM Corporation and others.
*
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.builder.tests.compatibility;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.pde.api.tools.internal.problems.ApiProblemFactory;
import org.eclipse.pde.api.tools.internal.provisional.comparator.IDelta;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
import junit.framework.Test;
/**
* Tests that the builder correctly reports compatibility problems
* related class hierarchies.
*
* @since 1.0
*/
public class ClassCompatibilityHierarchyTests extends ClassCompatibilityTests {
/**
* Workspace relative path classes in bundle/project A
*/
protected static IPath WORKSPACE_CLASSES_PACKAGE_A = new Path("bundle.a/src/a/classes/hierarchy"); //$NON-NLS-1$
/**
* Package prefix for test classes
*/
protected static String PACKAGE_PREFIX = "a.classes.hierarchy."; //$NON-NLS-1$
/**
* Constructor
* @param name
*/
public ClassCompatibilityHierarchyTests(String name) {
super(name);
}
@Override
protected IPath getTestSourcePath() {
return super.getTestSourcePath().append("hierarchy"); //$NON-NLS-1$
}
/**
* @return the tests for this class
*/
public static Test suite() {
return buildTestSuite(ClassCompatibilityHierarchyTests.class);
}
/**
* Returns a problem id for a compatibility change to a class based on the
* specified flags.
*
* @param flags
* @return problem id
*/
protected int getChangedProblemId(int flags) {
return ApiProblemFactory.createProblemId(
IApiProblem.CATEGORY_COMPATIBILITY,
IDelta.CLASS_ELEMENT_TYPE,
IDelta.CHANGED,
flags);
}
/**
* Returns a problem id for a compatibility remove to a class based on the
* specified flags.
*
* @param flags
* @return problem id
*/
protected int getRemovedProblemId(int flags) {
return ApiProblemFactory.createProblemId(
IApiProblem.CATEGORY_COMPATIBILITY,
IDelta.CLASS_ELEMENT_TYPE,
IDelta.REMOVED,
flags);
}
@Override
protected String getTestingProjectName() {
return "classcompat"; //$NON-NLS-1$
}
/**
* Tests the reduction of class hierarchy from C to A
*/
private void xReduceHierarchyCtoA(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ReduceFromCtoA.java"); //$NON-NLS-1$
int[] ids = new int[] {
getRemovedProblemId(IDelta.SUPERCLASS)
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ReduceFromCtoA"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testReduceHierarchyCtoAI() throws Exception {
xReduceHierarchyCtoA(true);
}
public void testReduceHierarchyCtoAF() throws Exception {
xReduceHierarchyCtoA(false);
}
/**
* Tests the reduction of class hierarchy from C to B
*/
private void xReduceHierarchyCtoB(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ReduceFromCtoB.java"); //$NON-NLS-1$
int[] ids = new int[] {
getRemovedProblemId(IDelta.SUPERCLASS)
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ReduceFromCtoB"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testReduceHierarchyCtoBI() throws Exception {
xReduceHierarchyCtoB(true);
}
public void testReduceHierarchyCtoBF() throws Exception {
xReduceHierarchyCtoB(false);
}
/**
* Tests the reduction of class hierarchy from C to Object
*/
private void xReduceHierarchyCtoObject(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ReduceFromCtoObject.java"); //$NON-NLS-1$
int[] ids = new int[] {
getRemovedProblemId(IDelta.SUPERCLASS) // TODO appears as changed superclass versus reduced
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ReduceFromCtoObject"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testReduceHierarchyCtoObjectI() throws Exception {
xReduceHierarchyCtoObject(true);
}
public void testReduceHierarchyCtoObjectF() throws Exception {
xReduceHierarchyCtoObject(false);
}
/**
* Tests the change of superclass from A to D
*/
private void xChangeHierarchyAtoD(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ChangedFromAtoD.java"); //$NON-NLS-1$
int[] ids = new int[] {
getRemovedProblemId(IDelta.SUPERCLASS)
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ChangedFromAtoD"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testChangeHierarchyAtoDI() throws Exception {
xChangeHierarchyAtoD(true);
}
public void testChangeHierarchyAtoDF() throws Exception {
xChangeHierarchyAtoD(false);
}
/**
* Tests the reduction of super interfaces from A, B to A
*/
private void xReduceInterfaceABtoA(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ReduceInterfaceFromABtoA.java"); //$NON-NLS-1$
int[] ids = new int[] {
getChangedProblemId(IDelta.CONTRACTED_SUPERINTERFACES_SET)
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ReduceInterfaceFromABtoA"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testReduceInterfaceABtoAI() throws Exception {
xReduceInterfaceABtoA(true);
}
public void testReduceInterfaceABtoAF() throws Exception {
xReduceInterfaceABtoA(false);
}
/**
* Tests the reduction of super interfaces from A, B to empty/none
*/
private void xReduceInterfaceABtoEmpty(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ReduceInterfaceFromABtoEmpty.java"); //$NON-NLS-1$
int[] ids = new int[] {
getChangedProblemId(IDelta.CONTRACTED_SUPERINTERFACES_SET)
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ReduceInterfaceFromABtoEmpty"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testReduceInterfaceABtoEmptyI() throws Exception {
xReduceInterfaceABtoEmpty(true);
}
public void testReduceInterfaceABtoEmptyF() throws Exception {
xReduceInterfaceABtoEmpty(false);
}
/**
* Tests the change of super interfaces from A to B
*/
private void xChangeInterfaceAtoB(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("ChangeInterfaceFromAtoB.java"); //$NON-NLS-1$
int[] ids = new int[] {
getChangedProblemId(IDelta.CONTRACTED_SUPERINTERFACES_SET)
};
setExpectedProblemIds(ids);
String[][] args = new String[1][];
args[0] = new String[]{PACKAGE_PREFIX + "ChangeInterfaceFromAtoB"}; //$NON-NLS-1$
setExpectedMessageArgs(args);
performCompatibilityTest(filePath, incremental);
}
public void testChangeInterfaceAtoBI() throws Exception {
xChangeInterfaceAtoB(true);
}
public void testChangeInterfaceAtoBF() throws Exception {
xChangeInterfaceAtoB(false);
}
/**
* Tests the addition of super interface A
*/
private void xAddInterfaceA(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("AddInterfaceA.java"); //$NON-NLS-1$
// no problems expected
performCompatibilityTest(filePath, incremental);
}
public void testAddInterfaceAI() throws Exception {
xAddInterfaceA(true);
}
public void testAddInterfaceAF() throws Exception {
xAddInterfaceA(false);
}
/**
* Tests pushing a method up the hierarchy
*/
private void xPushMethodUp(boolean incremental) throws Exception {
// modify two files
IPath file1 = WORKSPACE_CLASSES_PACKAGE_A.append("SuperClazz.java"); //$NON-NLS-1$
updateWorkspaceFile(
file1,
getUpdateFilePath(file1.lastSegment()));
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("SubClazz.java"); //$NON-NLS-1$
// no problems expected
performCompatibilityTest(filePath, incremental);
}
public void testPushMethodUpI() throws Exception {
xPushMethodUp(true);
}
public void testPushMethodUpF() throws Exception {
xPushMethodUp(false);
}
/**
* Tests removing an internal superclass
*/
private void xRemoveInternalSuperClass(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("RemoveInternalSuperClass.java"); //$NON-NLS-1$
// no problems expected
performCompatibilityTest(filePath, incremental);
}
public void testRemoveInternalSuperClassI() throws Exception {
xRemoveInternalSuperClass(true);
}
public void testRemoveInternalSuperClassF() throws Exception {
xRemoveInternalSuperClass(false);
}
@Override
protected int getDefaultProblemId() {
// NOT USED
return 0;
}
/**
* Tests removing an internal superclass that defines a public constructor
*/
private void xRemoveInternalSuperClassWithConstructor(boolean incremental) throws Exception {
IPath filePath = WORKSPACE_CLASSES_PACKAGE_A.append("RemoveConstructorFromInternalSuperclass.java"); //$NON-NLS-1$
// no problems expected
performCompatibilityTest(filePath, incremental);
}
public void testRemoveInternalSuperClassWithConstructorI() throws Exception {
xRemoveInternalSuperClassWithConstructor(true);
}
public void testRemoveInternalSuperClassWithConstructorF() throws Exception {
xRemoveInternalSuperClassWithConstructor(false);
}
}