/* * 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{" + " public void m(T t){};" + "}"); CompilationUnit C0 = new CompilationUnit("a.C0", "package a; " + "public class C0 extends I{" + " public void m(T t){}; " + "}"); 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 compareMissingInheritedMethodGeneric1() throws IOException{ CompilationUnit I = new CompilationUnit("a.I", "package a; " + "public class I{" + " public void m(S s){};" + "}"); CompilationUnit C0 = new CompilationUnit("a.C0", "package a; " + "public class C0 extends I{" + " public void m(R t){}; " + "}"); 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 compareMissingInheritedMethodGeneric2() throws IOException{ CompilationUnit I = new CompilationUnit("a.I", "package a; " + "public class I{" + " public void m(S s){};" + "}"); CompilationUnit J = new CompilationUnit("a.J", "package a; " + "public class J extends I{" + " public void m(W w){};" + "}"); CompilationUnit C0 = new CompilationUnit("a.C0", "package a; " + "public class C0 extends J{" + " public void m(Q t){}; " + "}"); CompilationUnit C1 = new CompilationUnit("a.C0", "package a; " + "public class C0 extends J{}"); 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{ " + " public void m(T s){} " + "}"); CompilationUnit W = new CompilationUnit("a.W", "package a; " + "public class W extends Q{}"); CompilationUnit E0 = new CompilationUnit("a.E", "package a; " + "public class E extends W{" + " public void m(C s){}" + "}"); CompilationUnit E1 = new CompilationUnit("a.E", "package a; " + "public class E extends W{}"); 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{ " + " public void m(T t, S s){} " + "}"); CompilationUnit W = new CompilationUnit("a.W", "package a; " + "public class W extends Q{}"); CompilationUnit E0 = new CompilationUnit("a.E", "package a; " + "public class E extends W{" + " public void m(C s, C c){}" + "}"); CompilationUnit E1 = new CompilationUnit("a.E", "package a; " + "public class E extends W{}"); 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{" + " public void m(T s){};" + "}"); CompilationUnit C0 = new CompilationUnit("a.C0", "package a; " + "public class C0

extends I{" + " public void m(Q t){}; " + "}"); CompilationUnit C1 = new CompilationUnit("a.C0", "package a; " + "public class C0 extends I{}"); 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{ " + " public void m(T t){} " + "}"); CompilationUnit E0 = new CompilationUnit("a.E", "package a; " + "public class E extends A{" + " public void m(Number n){}" + "}"); CompilationUnit E1 = new CompilationUnit("a.E", "package a; " + "public class E extends A{}"); 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{ " + " public void m(T[] t){} " + "}"); CompilationUnit E0 = new CompilationUnit("a.E", "package a; " + "public class E extends A{" + " public void m(Number[] n){}" + "}"); CompilationUnit E1 = new CompilationUnit("a.E", "package a; " + "public class E extends A{}"); 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{ " + " public void m(A> t){} " + "}"); CompilationUnit E0 = new CompilationUnit("a.E", "package a; " + "public class E extends A{" + " public void m(A> n){}" + "}"); CompilationUnit E1 = new CompilationUnit("a.E", "package a; " + "public class E extends A{}"); IApi fromApi = convert(E0, Q, NUMBER); IApi toApi = convert(E1, Q, NUMBER); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } }