/* * 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 static org.junit.Assert.assertSame; import org.junit.Test; import signature.comparator.util.AbstractComparatorTest; import signature.compare.model.IAnnotationDelta; import signature.compare.model.IApiDelta; import signature.compare.model.IClassDefinitionDelta; import signature.compare.model.DeltaType; import signature.compare.model.ITypeReferenceDelta; import signature.converter.util.CompilationUnit; import signature.model.IApi; import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.Set; public abstract class ClassCompareTest extends AbstractComparatorTest { @Test public void compareEqualClasses() throws IOException{ CompilationUnit A = new CompilationUnit("a.A", "package a; " + "public class A {}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B {}"); IApi fromApi = convert(A, B); IApi toApi = convert(A, B); assertNull(compare(fromApi, toApi)); } @Test public void compareMissingClass() throws IOException{ CompilationUnit A = new CompilationUnit("a.A", "package a; " + "public class A {}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B {}"); IApi fromApi = convert(A, B); IApi toApi = convert(A); IApiDelta delta = compare(fromApi, toApi); IClassDefinitionDelta classDelta = getSingleClassDelta(delta); assertSame(DeltaType.REMOVED, classDelta.getType()); } @Test public void compareAddedClass() throws IOException{ CompilationUnit A = new CompilationUnit("a.A", "package a; " + "public class A {}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B {}"); IApi fromApi = convert(A); IApi toApi = convert(A, B); IApiDelta delta = compare(fromApi, toApi); IClassDefinitionDelta classDelta = getSingleClassDelta(delta); assertSame(DeltaType.ADDED, classDelta.getType()); } @Test public void compareAnnotationsOnClass() throws IOException{ CompilationUnit A = new CompilationUnit("a.A", "package a; " + "public class A {}"); CompilationUnit AnnotA = new CompilationUnit("a.A", "package a; " + "@Deprecated " + "public class A {}"); IApi fromApi = convert(A); IApi toApi = convert(AnnotA); IApiDelta delta = compare(fromApi, toApi); IClassDefinitionDelta classDelta = getSingleClassDelta(delta); System.out.println(classDelta); Set annotationDeltas = classDelta.getAnnotationDeltas(); assertEquals(1, annotationDeltas.size()); IAnnotationDelta annotationDelta = annotationDeltas.iterator().next(); assertSame(DeltaType.ADDED, annotationDelta.getType()); } @Test public void compareDefaultedAnnotationElementOnClass() throws IOException{ CompilationUnit annot = new CompilationUnit("a.A", "package a; " + "public @interface A {" + " String name() default \"NAME\" ;" + "}"); CompilationUnit AnnotBDefault = new CompilationUnit("a.B", "package a; " + "@A " + "public class B {}"); CompilationUnit AnnotB = new CompilationUnit("a.B", "package a; " + "@A(name=\"NAME\") " + "public class B {}"); IApi fromApi = convert(annot, AnnotBDefault); IApi toApi = convert(annot, AnnotB); assertNull(compare(fromApi, toApi)); } @Test public void compareSameInterfaces() throws IOException{ CompilationUnit A = new CompilationUnit("a.A", "package a; " + "public class A implements Comparable{ " + " public int compareTo(String another){return 0;}" + "}"); IApi fromApi = convert(A); IApi toApi = convert(A); assertNull(compare(fromApi, toApi)); } @Test public void compareMissingInterface() throws IOException{ CompilationUnit A0 = new CompilationUnit("a.A", "package a; " + "public class A implements Cloneable{}"); CompilationUnit A1 = new CompilationUnit("a.A", "package a; " + "public class A {}"); IApi fromApi = convert(A0); IApi toApi = convert(A1); IApiDelta apiDelta = compare(fromApi, toApi); IClassDefinitionDelta classDelta = getSingleClassDelta(apiDelta); assertEquals(1, classDelta.getInterfaceDeltas().size()); ITypeReferenceDelta interfaceDelta = classDelta.getInterfaceDeltas().iterator().next(); assertNotNull(interfaceDelta); } @Test public void compareMissingGenericInterface0() throws IOException{ CompilationUnit I = new CompilationUnit("a.I", "package a; " + "public interface I{}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B implements I{}"); CompilationUnit A0 = new CompilationUnit("a.A", "package a; " + "public class A extends B implements I{}"); CompilationUnit A1 = new CompilationUnit("a.A", "package a; " + "public class A extends B {}"); IApi fromApi = convert(I, B, A0); IApi toApi = convert(I, B, A1); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } @Test public void compareMissingGenericInterface1() throws IOException{ CompilationUnit I = new CompilationUnit("a.I", "package a; " + "public interface I{}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B implements I{}"); CompilationUnit A0 = new CompilationUnit("a.A", "package a; " + "public class A extends B implements I{}"); //generic declaration of 'T' in I is A CompilationUnit A1 = new CompilationUnit("a.A", "package a; " + "public class A extends B {}"); //generic declaration of 'T' in I is B IApi fromApi = convert(I, B, A0); IApi toApi = convert(I, B, A1); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } static interface I{} static class B implements I{} static class A0 extends B implements I{} static class A1 extends B{} @Test public void compareMissingGenericInterfaceReflection() { ParameterizedType sC = (ParameterizedType)A0.class.getGenericSuperclass(); Type[] bounds = ((TypeVariable)sC.getActualTypeArguments()[0]).getBounds(); Type[] a1Int = A1.class.getGenericInterfaces(); assertEquals(0,a1Int.length); } @Test public void compareInterfaceClosure() throws IOException{ CompilationUnit I0 = new CompilationUnit("a.I0", "package a; " + "public interface I0{}"); CompilationUnit I1 = new CompilationUnit("a.I1", "package a; " + "public interface I1 extends I0{}"); CompilationUnit C0 = new CompilationUnit("a.C0", "package a; " + "public class C0 implements I1{}"); CompilationUnit C0_I1 = new CompilationUnit("a.C0", "package a; " + "public class C0 implements I1, I0{}"); IApi fromApi = convert(I0, I1, C0); IApi toApi = convert(I0, I1, C0_I1); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } @Test public void compareUpperBounds0() throws IOException{ CompilationUnit Number = new CompilationUnit("a.Number", "package a; " + "public class Number implements java.io.Serializable{}"); CompilationUnit I0 = new CompilationUnit("a.I", "package a; " + "public interface I{}"); CompilationUnit I1 = new CompilationUnit("a.I", "package a; " + "public interface I{}"); IApi fromApi = convert(I0,Number); IApi toApi = convert(I1,Number); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } @Test public void compareUpperBounds1() throws IOException{ CompilationUnit Number = new CompilationUnit("a.Number", "package a; " + "public class Number {}"); CompilationUnit I0 = new CompilationUnit("a.I", "package a; " + "public interface I{}"); CompilationUnit I1 = new CompilationUnit("a.I", "package a; " + "public interface I{}"); IApi fromApi = convert(I0,Number); IApi toApi = convert(I1,Number); IApiDelta apiDelta = compare(fromApi, toApi); assertNotNull(apiDelta); } @Test public void compareTypeVariables0() throws IOException{ CompilationUnit C0 = new CompilationUnit("a.C", "package a; " + "public class C {}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C {}"); IApi fromApi = convert(C0); IApi toApi = convert(C1); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } @Test public void compareTypeVariables1() throws IOException{ CompilationUnit C0 = new CompilationUnit("a.C", "package a; " + "public class C {}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C {}"); IApi fromApi = convert(C0); IApi toApi = convert(C1); IApiDelta apiDelta = compare(fromApi, toApi); assertNotNull(apiDelta); } @Test public void compareTypeVariables2() throws IOException{ CompilationUnit C0 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public void m(T t, S s){} " + "}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public void m(S s, T t){} " + "}"); IApi fromApi = convert(C0); IApi toApi = convert(C1); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } @Test public void compareTypeVariables3() throws IOException{ CompilationUnit C0 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public void m(T t, S s){} " + "}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public void m(T t, S s){} " + "}"); IApi fromApi = convert(C0); IApi toApi = convert(C1); IApiDelta apiDelta = compare(fromApi, toApi); assertNotNull(apiDelta); } @Test public void compareTypeVariables4() throws IOException{ CompilationUnit C0 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public class I{" + " public void m(T t){}" + " } " + "}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public class I{" + " public void m(T t){}" + " } " + "}"); IApi fromApi = convert(C0); IApi toApi = convert(C1); IApiDelta apiDelta = compare(fromApi, toApi); assertNotNull(apiDelta); } @Test public void interfaceClosureTest() throws IOException{ CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B {}"); CompilationUnit C = new CompilationUnit("a.C", "package a; " + "public class C extends B {}"); CompilationUnit E = new CompilationUnit("a.E", "package a; " + "public class E extends C {}"); CompilationUnit F = new CompilationUnit("a.F", "package a; " + "public class F

extends E

{}"); CompilationUnit G = new CompilationUnit("a.G", "package a; " + "public class G extends F {}"); CompilationUnit H = new CompilationUnit("a.H", "package a; " + "public class H extends G {}"); // IApi fromApi = convert(B,C, E, F); // IApi toApi = convert(B,C,E, F); IApi fromApi = convert(B,C, E,F, G, H); IApi toApi = convert(B,C,E,F, G, H); long start = System.currentTimeMillis(); IApiDelta apiDelta = compare(fromApi, toApi); System.out.println("compare took :" + (System.currentTimeMillis() -start) + "ms"); assertNull(apiDelta); } }