/* * 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<IAnnotationDelta> 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<String>{ " + " 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<T>{}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B implements I<String>{}"); CompilationUnit A0 = new CompilationUnit("a.A", "package a; " + "public class A extends B implements I<String>{}"); 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<T>{}"); CompilationUnit B = new CompilationUnit("a.B", "package a; " + "public class B<T> implements I<T>{}"); CompilationUnit A0 = new CompilationUnit("a.A", "package a; " + "public class A<T> extends B<T> implements I<T>{}"); //generic declaration of 'T' in I<T> is A<T> CompilationUnit A1 = new CompilationUnit("a.A", "package a; " + "public class A<T> extends B<T> {}"); //generic declaration of 'T' in I<T> is B<T> IApi fromApi = convert(I, B, A0); IApi toApi = convert(I, B, A1); IApiDelta apiDelta = compare(fromApi, toApi); assertNull(apiDelta); } static interface I<T>{} static class B<T> implements I<T>{} static class A0<E extends Number> extends B<E> implements I<E>{} static class A1<S extends Number> extends B<S>{} @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<T extends Number & java.io.Serializable>{}"); CompilationUnit I1 = new CompilationUnit("a.I", "package a; " + "public interface I<T extends Number>{}"); 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<T extends Number & java.io.Serializable>{}"); CompilationUnit I1 = new CompilationUnit("a.I", "package a; " + "public interface I<T extends Number>{}"); 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<T,S> {}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C<S,T> {}"); 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<T,S> {}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C<T,S,R> {}"); 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<T,S> {" + " public void m(T t, S s){} " + "}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C<S,T> {" + " 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<T,S> {" + " public void m(T t, S s){} " + "}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C<S,T> {" + " 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<T> {" + " public class I{" + " public void m(T t){}" + " } " + "}"); CompilationUnit C1 = new CompilationUnit("a.C", "package a; " + "public class C {" + " public class I<T>{" + " 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<S> {}"); CompilationUnit C = new CompilationUnit("a.C", "package a; " + "public class C<R> extends B<R> {}"); CompilationUnit E = new CompilationUnit("a.E", "package a; " + "public class E<Q> extends C<Q> {}"); CompilationUnit F = new CompilationUnit("a.F", "package a; " + "public class F<P> extends E<P> {}"); CompilationUnit G = new CompilationUnit("a.G", "package a; " + "public class G<O> extends F<O> {}"); CompilationUnit H = new CompilationUnit("a.H", "package a; " + "public class H<R> extends G<R> {}"); // 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); } }