blob: 959d21b0ef77ed70b85a00050ea81e6d6ab3164b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.dom;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import junit.framework.Test;
public class CompatibilityRulesTests extends AbstractASTTests {
public CompatibilityRulesTests(String name) {
super(name);
}
public static Test suite() {
return buildModelTestSuite(CompatibilityRulesTests.class);
}
// Use this static initializer to specify subset for tests
// All specified tests which do not belong to the class are skipped...
static {
// TESTS_PREFIX = "testBug86380";
// TESTS_NAMES = new String[] { "test032" };
// TESTS_NUMBERS = new int[] { 83230 };
// TESTS_RANGE = new int[] { 83304, -1 };
}
public void setUpSuite() throws Exception {
super.setUpSuite();
createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5");
}
public void tearDownSuite() throws Exception {
deleteProject("P");
super.tearDownSuite();
}
/*
* Ensures that a subtype is subtype compatible with its super type
*/
public void test001() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should be subtype compatible with Y", bindings[1].isSubTypeCompatible(bindings[0]));
}
/*
* Ensures that a type is subtype compatible with itself
*/
public void test002() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
},
new String[] {
"Lp1/X;",
});
assertTrue("X should be subtype compatible with itself", bindings[0].isSubTypeCompatible(bindings[0]));
}
/*
* Ensures that a supertype is not subtype compatible with its subtype
*/
public void test003() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should not be subtype compatible with Y", !bindings[0].isSubTypeCompatible(bindings[1]));
}
/*
* Ensures that a type is not subtype compatible with an unrelated type.
*/
public void test004() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should not be subtype compatible with Y", !bindings[0].isSubTypeCompatible(bindings[1]));
}
/*
* Ensures that the int base type is not subtype compatible with the long base type
*/
public void test005() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"J"
});
assertTrue("int should not be subtype compatible with long", !bindings[0].isSubTypeCompatible(bindings[1]));
}
/*
* Ensures that the int base type is not subtype compatible with the java.lang.Object type
*/
public void test006() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"Ljava/lang/Object;"
});
assertTrue("int should not be subtype compatible with Object", !bindings[0].isSubTypeCompatible(bindings[1]));
}
/*
* Ensures that a subtype is assignment compatible with its super type
*/
public void test007() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should be assignment compatible with Y", bindings[1].isAssignmentCompatible(bindings[0]));
}
/*
* Ensures that a type is assignment compatible with itself
*/
public void test008() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
},
new String[] {
"Lp1/X;",
});
assertTrue("X should be assignment compatible with itself", bindings[0].isAssignmentCompatible(bindings[0]));
}
/*
* Ensures that a supertype is not assignment compatible with its subtype
*/
public void test009() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should not be assignment compatible with Y", !bindings[0].isAssignmentCompatible(bindings[1]));
}
/*
* Ensures that a type is not assigment compatible with an unrelated type.
*/
public void test010() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should not be assigment compatible with Y", !bindings[0].isAssignmentCompatible(bindings[1]));
}
/*
* Ensures that the int base type is assignment compatible with the long base type
*/
public void test011() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"J"
});
assertTrue("int should be assignment compatible with long", bindings[0].isAssignmentCompatible(bindings[1]));
}
/*
* Ensures that the int base type is not assignment compatible with the java.lang.Object type in 1.4 mode.
*/
public void test012() throws CoreException {
try {
IJavaProject project = createJavaProject("P14", new String[] {""}, new String[] {"JCL_LIB"}, "", "1.4");
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"Ljava/lang/Object;"
},
project);
assertTrue("int should not be assignment compatible with Object", !bindings[0].isAssignmentCompatible(bindings[1]));
} finally {
deleteProject("P14");
}
}
/*
* Ensures that a subtype is cast compatible with its super type
*/
public void test013() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should be cast compatible with Y", bindings[1].isCastCompatible(bindings[0]));
}
/*
* Ensures that a type is cast compatible with itself
*/
public void test014() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
},
new String[] {
"Lp1/X;",
});
assertTrue("X should be cast compatible with itself", bindings[0].isCastCompatible(bindings[0]));
}
/*
* Ensures that a supertype is cast compatible with its subtype
*/
public void test015() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should be cast compatible with Y", bindings[0].isCastCompatible(bindings[1]));
}
/*
* Ensures that a type is not cast compatible with an unrelated type.
*/
public void test016() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
"}",
},
new String[] {
"Lp1/X;",
"Lp1/Y;"
});
assertTrue("X should not be cast compatible with Y", !bindings[0].isCastCompatible(bindings[1]));
}
/*
* Ensures that the int base type is cast compatible with the long base type
*/
public void test017() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"J"
});
assertTrue("int should be cast compatible with long", bindings[0].isCastCompatible(bindings[1]));
}
/*
* Ensures that the int base type is not cast compatible with the java.lang.Object type
*/
public void test018() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"Ljava/lang/Object;"
});
assertTrue("int should not be cast compatible with Object", !bindings[0].isCastCompatible(bindings[1]));
}
/*
* Ensures that a method in a subtype overrides the corresponding method in the super type.
*/
public void test019() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/Y;.foo()V",
"Lp1/X;.foo()V"
});
assertTrue("Y#foo() should override X#foo()", bindings[0].overrides(bindings[1]));
}
/*
* Ensures that a method in a super type doesn't override the corresponding method in a subtype.
*/
public void test020() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V",
"Lp1/Y;.foo()V"
});
assertTrue("X#foo() should not override Y#foo()", !bindings[0].overrides(bindings[1]));
}
/*
* Ensures that a method doesn't override the corresponding method in an unrelated type.
*/
public void test021() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V",
"Lp1/Y;.foo()V"
});
assertTrue("X#foo() should not override Y#foo()", !bindings[0].overrides(bindings[1]));
}
/*
* Ensures that IMethodBinding#ovverides(IMethodBinding) doesn't throw a NullPointerException if
* the method was not built in a batch.
* (regression test for bug 79635 NPE when asking an IMethodBinding whether it overrides itself)
*/
public void test022() throws JavaModelException {
ICompilationUnit workingCopy = null;
try {
workingCopy = getWorkingCopy("/P/p1/X.java", true/*compute problems to get bindings*/);
ASTNode node = buildAST(
"package p1;\n" +
"public class X {\n" +
" /*start*/void foo() {\n" +
" }/*end*/\n" +
"}",
workingCopy);
IMethodBinding methodBinding = ((MethodDeclaration) node).resolveBinding();
assertTrue("X#foo() should not override itself", !methodBinding.overrides(methodBinding));
} finally {
if (workingCopy != null)
workingCopy.discardWorkingCopy();
}
}
/*
* Ensures that a base type is assignment compatible with its wrapper type
* (regression test for bug 80455 [5.0] ITypeBinding.canAssign not aware of type boxing)
*/
public void test023() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {
"/P/java/lang/Integer.java",
"package java.lang;\n" +
"public class Integer {\n" +
"}",
},
new String[] {
"I",
"Ljava/lang/Integer;",
});
assertTrue("int should be assignment compatible with Integer", bindings[0].isAssignmentCompatible(bindings[1]));
}
/*
* Ensures that a base type is assignment compatible with Object
*/
public void test024() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"I",
"Ljava/lang/Object;",
});
assertTrue("int should be assignment compatible with Object", bindings[0].isAssignmentCompatible(bindings[1]));
}
/*
* Ensures that a method is subsignature of itself.
*/
public void test025() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V"
});
assertTrue("X#foo() should be a subsignature of X#foo()", bindings[0].isSubsignature(bindings[0]));
}
/*
* Ensures that a method is subsignature of its super method.
*/
public void test026() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" String foo(Object o) {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" String foo(Object o) {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo(Ljava/lang/Object;)Ljava/lang/String;",
"Lp1/Y;.foo(Ljava/lang/Object;)Ljava/lang/String;",
});
assertTrue("Y#foo(Object) should be a subsignature of X#foo(Object)", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method is subsignature of its super generic method.
*/
public void test027() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X<T> {\n" +
" Z<T> foo(Z<T> o) {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" Z foo(Z o) {\n" +
" }\n" +
"}",
"/P/p1/Z.java",
"package p1;\n" +
"public class Z<T> {\n" +
"}",
},
new String[] {
"Lp1/X;.foo(Lp1/Z<TT;>;)Lp1/Z<TT;>;",
"Lp1/Y;.foo(Lp1/Z;)Lp1/Z;",
});
assertTrue("Y#foo(Z) should be a subsignature of X#foo(Z<T>)", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method is not the subsignature of an unrelated method.
*/
public void test028() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
" void bar() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V",
"Lp1/Y;.bar()V",
});
assertTrue("Y#bar() should not be a subsignature of X#foo()", !bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method in a subtype doesn't override the a method with same parameters but with different name in the super type.
*/
public void test029() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" void bar() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/Y;.bar()V",
"Lp1/X;.foo()V"
});
assertTrue("Y#bar() should not override X#foo()", !bindings[0].overrides(bindings[1]));
}
/*
* Ensures that a method in a subtype overrides a method in the super parameterized type.
* (regression test for bug 99608 IMethodBinding#overrides returns false on overridden method)
*/
public void test030() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X<T> {\n" +
" void foo(T t) {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X<String> {\n" +
" void foo(String s) {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/Y;.foo(Ljava/lang/String;)V",
"Lp1/X;.foo(TT;)V"
});
assertTrue("Y#foo(String) should override X#foo(T)", bindings[0].overrides(bindings[1]));
}
/*
* Ensures that a method with the same parameter types but with different type parameters is not a subsignature of its super method.
* (regression test for bug 107110 IMethodBinding.isSubsignature not yet correctly implemented)
*/
public void test031() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}\n" +
"class Y extends X {\n" +
" <T> void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V",
"Lp1/Y;.foo<T:Ljava/lang/Object;>()V"
});
assertFalse("Y#foo() should not be a subsignature of X#foo()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method in a subtype overrides the corresponding method in the super type
* even if the two methods have different return types.
* (regression test for bug 105808 [1.5][dom] MethodBinding#overrides(..) should not consider return types)
*/
public void test032() throws CoreException {
try {
IJavaProject project = createJavaProject("P2", new String[] {""}, new String[] {"JCL_LIB"}, "", "1.4");
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P2/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" Object foo() {\n" +
" }\n" +
"}",
"/P2/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" String foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/Y;.foo()Ljava/lang/String;",
"Lp1/X;.foo()Ljava/lang/Object;"
},
project);
assertTrue("Y#foo() should override X#foo()", bindings[0].overrides(bindings[1]));
} finally {
deleteProject("P2");
}
}
/*
* Ensures that a method in a subtype doesn't override the corresponding private method in the super type.
* (regression test for bug 132191 IMethodBinding.overrides(IMethodBinding) returns true even if the given argument is private.)
*/
public void test033() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" private void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y extends X {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/Y;.foo()V",
"Lp1/X;.foo()V"
});
assertTrue("Y#foo() should not override X#foo()", !bindings[0].overrides(bindings[1]));
}
/*
* Ensures that a method in a subtype doesn't override the corresponding default method in the super type in a different package.
* (regression test for bug 132191 IMethodBinding.overrides(IMethodBinding) returns true even if the given argument is private.)
*/
public void test034() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p2/Y.java",
"package p2;\n" +
"public class Y extends p1.X {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp2/Y;.foo()V",
"Lp1/X;.foo()V"
});
assertTrue("Y#foo() should not override X#foo()", !bindings[0].overrides(bindings[1]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test035() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A<T> {\n" +
" public void o1_xoo2(A<?> s) {\n" +
" }\n" +
"}\n" +
"class B<S> extends A<S> {\n" +
" @Override\n" +
" public void o1_xoo2(A<Object> s) {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/A;.o1_xoo2(Lp1/A<*>;)V",
"Lp1/A~B;.o1_xoo2(Lp1/A<Ljava/lang/Object;>;)V"
});
assertFalse("B#o1_xoo2() should not be a subsignature of A#o1_xoo2()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test036() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A<T> {\n" +
" public void o1_xoo3(A<? extends T> s) {\n" +
" }\n" +
"}\n" +
"class B<S> extends A<S> {\n" +
" @Override\n" +
" public void o1_xoo3(A<? super S> s) {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/A;.o1_xoo3(Lp1/A<+TT;>;)V",
"Lp1/A~B;.o1_xoo3(Lp1/A<-TS;>;)V"
});
assertFalse("B#o1_xoo3() should not be a subsignature of A#o1_xoo3()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test037() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A<S, T> {\n" +
" public void o2_xoo1(List<? extends T> t) {\n" +
" }\n" +
"}\n" +
"class B<V, W> extends A<W, V> {\n" +
" @Override\n" +
" public void o2_xoo1(List<? extends W> t) {\n" +
" }\n" +
"}\n" +
"class List<T> {\n" +
"}",
},
new String[] {
"Lp1/A;.o2_xoo1(Lp1/List<+TT;>;)V",
"Lp1/A~B;.o2_xoo1(Lp1/List<+TW;>;)V"
});
assertFalse("B#o1_xoo1() should not be a subsignature of A#o1_xoo1()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test038() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A {\n" +
" public void o3_xoo1(List t) {\n" +
" }\n" +
"}\n" +
"class B extends A {\n" +
" @Override\n" +
" public void o3_xoo1(List<Object> t) {\n" +
" }\n" +
"}\n" +
"class List<T> {\n" +
"}",
},
new String[] {
"Lp1/A;.o3_xoo1(Lp1/List;)V",
"Lp1/A~B;.o3_xoo1(Lp1/List<Ljava/lang/Object;>;)V"
});
assertFalse("B#o3_xoo1() should not be a subsignature of A#o3_xoo1()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test039() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A<T> {\n" +
" public void o4_xoo1(T t) {\n" +
" }\n" +
"}\n" +
"class B extends A<List<String>> {\n" +
" @Override\n" +
" public void o4_xoo1(List<?> t) {\n" +
" }\n" +
"}\n" +
"class List<T> {\n" +
"}",
},
new String[] {
"Lp1/A;.o4_xoo1(TT;)V",
"Lp1/A~B;.o4_xoo1(Lp1/List<*>;)V"
});
assertFalse("B#o4_xoo1() should not be a subsignature of A#o4_xoo1()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test040() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A<S> {\n" +
" public <X, Y> void tp1_xoo3(X x, Y y) {\n" +
" }\n" +
"}\n" +
"class B extends A<String> {\n" +
" @Override\n" +
" public <W, V> void tp1_xoo3(V x, W y) {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/A;.tp1_xoo3<X:Ljava/lang/Object;Y:Ljava/lang/Object;>(TX;TY;)V",
"Lp1/A~B;.tp1_xoo3<W:Ljava/lang/Object;V:Ljava/lang/Object;>(TV;TW;)V"
});
assertFalse("B#tp1_xoo3() should not be a subsignature of A#tp1_xoo3()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test041() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public class A<S> {\n" +
" public <X, Y> void tp1_foo2(S s, X x, Y y) {\n" +
" }\n" +
"}\n" +
"class B extends A<String> {\n" +
" @Override\n" +
" public void tp1_foo2(String s, Object x, Object y) {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/A;.tp1_foo2<X:Ljava/lang/Object;Y:Ljava/lang/Object;>(TS;TX;TY;)V",
"Lp1/A~B;.tp1_foo2(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"
});
assertTrue("B#tp1_foo2() should be a subsignature of A#tp1_foo2()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that a method with different paramter types is not a subsignature of its super method.
* (regression test for bug 111093 More problems with IMethodBinding#isSubsignature(..))
*/
public void test042() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/A.java",
"package p1;\n" +
"public abstract class A<T> {\n" +
" void g2 (T t) {\n" +
" }\n" +
"}\n" +
"class B extends A<List<Number>> {\n" +
" void g2 (List<Number> t) {\n" +
" }\n" +
"}\n" +
"class List<T> {\n" +
"}\n" +
"class Number {\n" +
"}",
},
new String[] {
"Lp1/A~B;.g2(Lp1/List<Lp1/Number;>;)V"
});
ITypeBinding superType = bindings[0].getDeclaringClass().getSuperclass(); // parameterized type
IMethodBinding ag2 = superType.getDeclaredMethods()[1];
assertTrue("B#g2() should be a subsignature of A#g2()", bindings[0].isSubsignature(ag2));
}
/*
* Ensures that a method with same signature in a different hierarchy doesn't overide another one
*/
public void test043() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V",
"Lp1/Y;.foo()V"
});
assertFalse("Y#foo() should not override X#foo()", bindings[1].overrides(bindings[0]));
}
/*
* Ensures that a method is a subsignature of the same method in a different hierarchy
*/
public void test044() throws JavaModelException {
IMethodBinding[] bindings = createMethodBindings(
new String[] {
"/P/p1/X.java",
"package p1;\n" +
"public class X {\n" +
" void foo() {\n" +
" }\n" +
"}",
"/P/p1/Y.java",
"package p1;\n" +
"public class Y {\n" +
" void foo() {\n" +
" }\n" +
"}",
},
new String[] {
"Lp1/X;.foo()V",
"Lp1/Y;.foo()V"
});
assertTrue("Y#foo() should be a subsignature of X#foo()", bindings[1].isSubsignature(bindings[0]));
}
/*
* Ensures that the byte base type is assignment compatible with the int base type
*/
public void test045() throws JavaModelException {
ITypeBinding[] bindings = createTypeBindings(
new String[] {},
new String[] {
"B",
"I"
});
assertTrue("byte should be assignment compatible with int", bindings[0].isAssignmentCompatible(bindings[1]));
}
}