summaryrefslogtreecommitdiffstats
path: root/tools/signature-tools/test/signature/comparator/MethodCompareTests.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/signature-tools/test/signature/comparator/MethodCompareTests.java')
-rw-r--r--tools/signature-tools/test/signature/comparator/MethodCompareTests.java495
1 files changed, 495 insertions, 0 deletions
diff --git a/tools/signature-tools/test/signature/comparator/MethodCompareTests.java b/tools/signature-tools/test/signature/comparator/MethodCompareTests.java
new file mode 100644
index 00000000000..3e94506d472
--- /dev/null
+++ b/tools/signature-tools/test/signature/comparator/MethodCompareTests.java
@@ -0,0 +1,495 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package signature.comparator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import signature.comparator.util.AbstractComparatorTest;
+import signature.compare.model.IApiDelta;
+import signature.compare.model.IClassDefinitionDelta;
+import signature.compare.model.DeltaType;
+import signature.converter.util.CompilationUnit;
+import signature.model.IApi;
+
+public abstract class MethodCompareTests extends AbstractComparatorTest {
+
+
+ @Test
+ public void compareEqualClasses() throws IOException{
+ CompilationUnit A = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m(){}" +
+ "}");
+ IApi fromApi = convert(A);
+ IApi toApi = convert(A);
+ assertNull(compare(fromApi, toApi));
+ }
+
+ @Test
+ public void compareMissingMethod() throws IOException{
+ CompilationUnit A = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m(){}" +
+ "}");
+ CompilationUnit AMissing = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ "}");
+ IApi fromApi = convert(A);
+ IApi toApi = convert(AMissing);
+ IApiDelta delta = compare(fromApi, toApi);
+ assertNotNull(delta);
+ IClassDefinitionDelta classDelta = delta.getPackageDeltas().iterator().next().getClassDeltas().iterator().next();
+ assertEquals(1, classDelta.getMethodDeltas().size());
+ assertEquals(DeltaType.REMOVED, classDelta.getMethodDeltas().iterator().next().getType());
+ }
+
+ @Test
+ public void compareAddedMethod() throws IOException{
+ CompilationUnit A = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m(){}" +
+ "}");
+ CompilationUnit AMissing = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ "}");
+ IApi fromApi = convert(AMissing);
+ IApi toApi = convert(A);
+ IApiDelta delta = compare(fromApi, toApi);
+ assertNotNull(delta);
+ IClassDefinitionDelta classDelta = delta.getPackageDeltas().iterator().next().getClassDeltas().iterator().next();
+ assertEquals(1, classDelta.getMethodDeltas().size());
+ assertEquals(DeltaType.ADDED, classDelta.getMethodDeltas().iterator().next().getType());
+ }
+
+ @Test
+ public void compareChangedMethod() throws IOException{
+ CompilationUnit A = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m(){}" +
+ "}");
+ CompilationUnit AMissing = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m() throws Exception {}" +
+ "}");
+ IApi fromApi = convert(AMissing);
+ IApi toApi = convert(A);
+ IApiDelta delta = compare(fromApi, toApi);
+ assertNotNull(delta);
+ IClassDefinitionDelta classDelta = delta.getPackageDeltas().iterator().next().getClassDeltas().iterator().next();
+ assertEquals(1, classDelta.getMethodDeltas().size());
+ assertEquals(DeltaType.CHANGED, classDelta.getMethodDeltas().iterator().next().getType());
+ }
+
+ @Test
+ public void compareAddedParameterMethod() throws IOException{
+ CompilationUnit A = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m(){}" +
+ "}");
+ CompilationUnit AMissing = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A {" +
+ " public void m(int i) {}" +
+ "}");
+ IApi fromApi = convert(AMissing);
+ IApi toApi = convert(A);
+ IApiDelta delta = compare(fromApi, toApi);
+ assertNotNull(delta);
+ IClassDefinitionDelta classDelta = delta.getPackageDeltas().iterator().next().getClassDeltas().iterator().next();
+ assertEquals(2, classDelta.getMethodDeltas().size()); //one added , one removed
+ }
+
+ @Test
+ public void compareExceptions0() throws IOException{
+ CompilationUnit E0 = new CompilationUnit("a.E0",
+ "package a; " +
+ "public class E0 extends Exception {}");
+ CompilationUnit E1 = new CompilationUnit("a.E1",
+ "package a; " +
+ "public class E1 extends E0 {}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 {" +
+ " public void m() throws E0 {}" +
+ "}");
+ CompilationUnit C0_E1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0{" +
+ " public void m() throws E0, E1 {}" +
+ "}");
+ IApi fromApi = convert(E0, E1, C0);
+ IApi toApi = convert(E0, E1, C0_E1);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareExceptions1() throws IOException{
+ CompilationUnit E0 = new CompilationUnit("a.E0",
+ "package a; " +
+ "public class E0 extends Exception {}");
+ CompilationUnit E1 = new CompilationUnit("a.E1",
+ "package a; " +
+ "public class E1 extends Exception {}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 {" +
+ " public void m() throws E0 {}" +
+ "}");
+ CompilationUnit C0_E1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0{" +
+ " public void m() throws E0, E1 {}" +
+ "}");
+ IApi fromApi = convert(E0, E1, C0);
+ IApi toApi = convert(E0, E1, C0_E1);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNotNull(apiDelta);
+ }
+
+ @Test
+ public void compareRuntimeExceptions() throws IOException{
+ CompilationUnit E0 = new CompilationUnit("a.E0",
+ "package a; " +
+ "public class E0 extends RuntimeException {}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0{" +
+ " public void m() {}" +
+ "}");
+ CompilationUnit C0_E0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 {" +
+ " public void m() throws E0 {}" +
+ "}");
+ IApi fromApi = convert(E0, C0);
+ IApi toApi = convert(E0, C0_E0);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareAnnotations() throws IOException{
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0{" +
+ " public void m(int i) {}" +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 {" +
+ " public void m(@Deprecated int i) {}" +
+ "}");
+ IApi fromApi = convert(C0);
+ IApi toApi = convert(C1);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNotNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingDefaultConstructor() throws IOException{
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0{" +
+ " public C0() {}" +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 {}");
+ IApi fromApi = convert(C0);
+ IApi toApi = convert(C1);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingAbstractMethod() throws IOException{
+ CompilationUnit I = new CompilationUnit("a.I",
+ "package a; " +
+ "public interface I{" +
+ " void m();" +
+ "}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public abstract class C0 implements I{" +
+ " public abstract void m(); " +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public abstract class C0 implements I{}");
+ IApi fromApi = convert(C0, I);
+ IApi toApi = convert(C1, I);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingInheritedMethod() throws IOException{
+ CompilationUnit I = new CompilationUnit("a.I",
+ "package a; " +
+ "public class I{" +
+ " public void m(){};" +
+ "}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 extends I{" +
+ " public void m(){}; " +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0 extends I{}");
+ IApi fromApi = convert(C0, I);
+ IApi toApi = convert(C1, I);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingInheritedMethodGeneric0() throws IOException{
+ CompilationUnit I = new CompilationUnit("a.I",
+ "package a; " +
+ "public class I<T>{" +
+ " public void m(T t){};" +
+ "}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<T> extends I<T>{" +
+ " public void m(T t){}; " +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<T> extends I<T>{}");
+ IApi fromApi = convert(C0, I);
+ IApi toApi = convert(C1, I);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingInheritedMethodGeneric1() throws IOException{
+ CompilationUnit I = new CompilationUnit("a.I",
+ "package a; " +
+ "public class I<T,S>{" +
+ " public void m(S s){};" +
+ "}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<Q, R> extends I<Q,R>{" +
+ " public void m(R t){}; " +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<Y,Z> extends I<Y,Z>{}");
+ IApi fromApi = convert(C0, I);
+ IApi toApi = convert(C1, I);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingInheritedMethodGeneric2() throws IOException{
+ CompilationUnit I = new CompilationUnit("a.I",
+ "package a; " +
+ "public class I<T,S>{" +
+ " public void m(S s){};" +
+ "}");
+ CompilationUnit J = new CompilationUnit("a.J",
+ "package a; " +
+ "public class J<W> extends I<Number,W>{" +
+ " public void m(W w){};" +
+ "}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<Q> extends J<Q>{" +
+ " public void m(Q t){}; " +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<Y> extends J<Y>{}");
+ IApi fromApi = convert(C0, I, J);
+ IApi toApi = convert(C1, I, J);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+
+
+ @Test
+ public void compareMissingInheritedMethodGeneric3() throws IOException{
+ CompilationUnit Q = new CompilationUnit("a.Q",
+ "package a; " +
+ "public class Q<S,T>{ " +
+ " public void m(T s){} " +
+ "}");
+
+ CompilationUnit W = new CompilationUnit("a.W",
+ "package a; " +
+ "public class W<A,B> extends Q<A,A>{}");
+ CompilationUnit E0 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E<C,D> extends W<C,C>{" +
+ " public void m(C s){}" +
+ "}");
+ CompilationUnit E1 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E<C,D> extends W<C,C>{}");
+ IApi fromApi = convert(E0, Q, W);
+ IApi toApi = convert(E1, Q, W);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingInheritedMethodGeneric4() throws IOException{
+ CompilationUnit Q = new CompilationUnit("a.Q",
+ "package a; " +
+ "public class Q<S,T>{ " +
+ " public void m(T t, S s){} " +
+ "}");
+
+ CompilationUnit W = new CompilationUnit("a.W",
+ "package a; " +
+ "public class W<A,B> extends Q<A,A>{}");
+ CompilationUnit E0 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E<C,D> extends W<C,C>{" +
+ " public void m(C s, C c){}" +
+ "}");
+ CompilationUnit E1 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E<C,D> extends W<C,C>{}");
+ IApi fromApi = convert(E0, Q, W);
+ IApi toApi = convert(E1, Q, W);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void compareMissingInheritedMethodGeneric5() throws IOException{
+ CompilationUnit Q = new CompilationUnit("a.Q",
+ "package a; " +
+ "public class Q{}");
+
+ CompilationUnit I = new CompilationUnit("a.I",
+ "package a; " +
+ "public class I<S,T>{" +
+ " public void m(T s){};" +
+ "}");
+ CompilationUnit C0 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<P> extends I<P, Q>{" +
+ " public void m(Q t){}; " +
+ "}");
+ CompilationUnit C1 = new CompilationUnit("a.C0",
+ "package a; " +
+ "public class C0<Y> extends I<Y, Q>{}");
+ IApi fromApi = convert(C0, I, Q);
+ IApi toApi = convert(C1, I, Q);
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+
+ @Test
+ public void substitutionTest() throws IOException{
+ CompilationUnit NUMBER = new CompilationUnit("a.Number",
+ "package a; " +
+ "public class Number{}");
+ CompilationUnit Q = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A<T>{ " +
+ " public void m(T t){} " +
+ "}");
+ CompilationUnit E0 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E extends A<Number>{" +
+ " public void m(Number n){}" +
+ "}");
+ CompilationUnit E1 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E extends A<Number>{}");
+ IApi fromApi = convert(E0, Q, NUMBER);
+ IApi toApi = convert(E1, Q, NUMBER);
+
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void substitutionArrayTest() throws IOException{
+ CompilationUnit NUMBER = new CompilationUnit("a.Number",
+ "package a; " +
+ "public class Number{}");
+ CompilationUnit Q = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A<T>{ " +
+ " public void m(T[] t){} " +
+ "}");
+ CompilationUnit E0 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E extends A<Number>{" +
+ " public void m(Number[] n){}" +
+ "}");
+ CompilationUnit E1 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E extends A<Number>{}");
+ IApi fromApi = convert(E0, Q, NUMBER);
+ IApi toApi = convert(E1, Q, NUMBER);
+
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+
+ @Test
+ public void substitutionNestedTypes() throws IOException{
+ CompilationUnit NUMBER = new CompilationUnit("a.Number",
+ "package a; " +
+ "public class Number{}");
+ CompilationUnit Q = new CompilationUnit("a.A",
+ "package a; " +
+ "public class A<T>{ " +
+ " public void m(A<A<T[]>> t){} " +
+ "}");
+ CompilationUnit E0 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E extends A<Number>{" +
+ " public void m(A<A<Number[]>> n){}" +
+ "}");
+ CompilationUnit E1 = new CompilationUnit("a.E",
+ "package a; " +
+ "public class E extends A<Number>{}");
+ IApi fromApi = convert(E0, Q, NUMBER);
+ IApi toApi = convert(E1, Q, NUMBER);
+
+ IApiDelta apiDelta = compare(fromApi, toApi);
+ assertNull(apiDelta);
+ }
+}