--- /dev/null
+/*
+ * 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.converter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+
+import signature.converter.util.AbstractConvertTest;
+import signature.converter.util.CompilationUnit;
+import signature.model.IAnnotation;
+import signature.model.IApi;
+import signature.model.IArrayType;
+import signature.model.IClassDefinition;
+import signature.model.IClassReference;
+import signature.model.IConstructor;
+import signature.model.IField;
+import signature.model.IMethod;
+import signature.model.IPackage;
+import signature.model.IParameter;
+import signature.model.IParameterizedType;
+import signature.model.ITypeReference;
+import signature.model.ITypeVariableDefinition;
+import signature.model.ITypeVariableReference;
+import signature.model.Kind;
+import signature.model.Modifier;
+import signature.model.impl.SigPrimitiveType;
+import signature.model.util.ModelUtil;
+
+public abstract class ConvertClassTest extends AbstractConvertTest {
+
+ @Test
+ public void convertPackageClassTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.b.A", "package a.b; public class A{}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a.b");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.b.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals("a.b", sigPackage.getName());
+ assertEquals(1, sigPackage.getClasses().size());
+ }
+
+ @Test
+ public void convertClassClassTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public class A{}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ }
+
+ @Test
+ public void convertClassInterfaceTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public interface A{}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.INTERFACE, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ }
+
+ @Test
+ public void convertClassEnumTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public enum A{}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.ENUM, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ }
+
+ @Test
+ public void convertClassAnnotationTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public @interface A{}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.ANNOTATION, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ }
+
+ @Test
+ public void convertAnnotationTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; @Deprecated public class A{}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals(1, sigClass.getAnnotations().size());
+ IAnnotation annotation = sigClass.getAnnotations().iterator().next();
+ assertEquals("java.lang.Deprecated", annotation.getType().getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertAnnotationOnFieldTest() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A",
+ "package a; " +
+ "public class A{" +
+ " @Deprecated" +
+ " public int f;" +
+ "}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals(1, sigClass.getFields().size());
+ IField field = sigClass.getFields().iterator().next();
+ assertEquals("f", field.getName());
+ assertEquals(1, field.getAnnotations().size());
+ IAnnotation annotation = field.getAnnotations().iterator().next();
+ assertEquals("java.lang.Deprecated", annotation.getType().getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertGenericClass0() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public class A<T> {}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ //test type variable
+ assertEquals(1, sigClass.getTypeParameters().size());
+ ITypeVariableDefinition variable = sigClass.getTypeParameters().get(0);
+ assertEquals("T", variable.getName());
+ //test type variable bound
+ assertEquals(1, variable.getUpperBounds().size());
+ IClassReference bound = (IClassReference) variable.getUpperBounds().get(0);
+ assertEquals("java.lang.Object", bound.getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertGenericClass00() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public class A<T extends Integer> {}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ //test type variable
+ assertEquals(1, sigClass.getTypeParameters().size());
+ ITypeVariableDefinition variable = sigClass.getTypeParameters().get(0);
+ assertEquals("T", variable.getName());
+ //test type variable bound
+ assertEquals(1, variable.getUpperBounds().size());
+ IClassReference bound = (IClassReference) variable.getUpperBounds().get(0);
+ assertEquals("java.lang.Integer", bound.getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertGenericClass1() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public class A<S,T> {}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ //test type variable
+ assertEquals(2, sigClass.getTypeParameters().size());
+ ITypeVariableDefinition variableS = sigClass.getTypeParameters().get(0);
+ assertEquals("S", variableS.getName());
+ //test type variable bound
+ assertEquals(1, variableS.getUpperBounds().size());
+ IClassReference boundS = (IClassReference) variableS.getUpperBounds().get(0);
+ assertEquals("java.lang.Object", boundS.getClassDefinition().getQualifiedName());
+
+ ITypeVariableDefinition variableT = sigClass.getTypeParameters().get(1);
+ assertEquals("T", variableT.getName());
+ //test type variable bound
+ assertEquals(1, variableT.getUpperBounds().size());
+ IClassReference boundT = (IClassReference) variableT.getUpperBounds().get(0);
+ assertEquals("java.lang.Object", boundT.getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertGenericClass2() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public class A<S,T extends S> {}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+ //test type variable
+ assertEquals(2, sigClass.getTypeParameters().size());
+ ITypeVariableDefinition variableS = sigClass.getTypeParameters().get(0);
+ assertEquals("S", variableS.getName());
+ //test type variable bound
+ assertEquals(1, variableS.getUpperBounds().size());
+ IClassReference boundS = (IClassReference) variableS.getUpperBounds().get(0);
+ assertEquals("java.lang.Object", boundS.getClassDefinition().getQualifiedName());
+
+ ITypeVariableDefinition variableT = sigClass.getTypeParameters().get(1);
+ assertEquals("T", variableT.getName());
+ //test type variable bound
+ assertEquals(1, variableT.getUpperBounds().size());
+ ITypeVariableReference boundT = (ITypeVariableReference) variableT.getUpperBounds().get(0);
+ assertSame(variableS, boundT.getTypeVariableDefinition());
+ }
+
+ @Test
+ public void convertClassImplementsInterface0() throws IOException {
+ IApi api = convert(new CompilationUnit("a.A", "package a; public class A implements Cloneable {}"));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+
+ assertEquals(1, sigClass.getInterfaces().size());
+ IClassDefinition clonable = ((IClassReference) sigClass.getInterfaces().iterator().next()).getClassDefinition();
+ assertEquals("java.lang.Cloneable", clonable.getQualifiedName());
+ assertEquals(Kind.INTERFACE, clonable.getKind());
+ }
+
+ @Test
+ public void convertClassImplementsInterface1() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A implements I {}");
+ CompilationUnit interfaceSrc = new CompilationUnit("a.I", "package a; public interface I {}");
+ IApi api = convert(classSrc, interfaceSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+
+ IClassDefinition sigInterface = ModelUtil.getClass(sigPackage, "I");
+ assertEquals("a.I", sigInterface.getQualifiedName());
+ assertEquals("I", sigInterface.getName());
+ assertEquals(Kind.INTERFACE, sigInterface.getKind());
+ assertTrue(sigInterface.getModifiers().contains(Modifier.PUBLIC));
+
+ assertEquals(1, sigClass.getInterfaces().size());
+ IClassReference interfaze = (IClassReference) sigClass.getInterfaces().iterator().next();
+ assertEquals(Kind.INTERFACE, interfaze.getClassDefinition().getKind());
+ assertSame(sigInterface, interfaze.getClassDefinition());
+ }
+
+ @Test
+ public void convertClassImplementsGenericInterface0() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A implements I<String> {}");
+ CompilationUnit interfaceSrc = new CompilationUnit("a.I", "package a; public interface I<T> {}");
+ IApi api = convert(classSrc, interfaceSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+
+ IClassDefinition sigInterface = ModelUtil.getClass(sigPackage, "I");
+ assertEquals("a.I", sigInterface.getQualifiedName());
+ assertEquals("I", sigInterface.getName());
+ assertEquals(Kind.INTERFACE, sigInterface.getKind());
+ assertTrue(sigInterface.getModifiers().contains(Modifier.PUBLIC));
+
+ assertEquals(1, sigClass.getInterfaces().size());
+ IParameterizedType interfaze = (IParameterizedType) sigClass.getInterfaces().iterator().next();
+ //compare raw type "I"
+ assertSame(sigInterface, interfaze.getRawType().getClassDefinition());
+ //test type argument string
+ assertEquals(1, interfaze.getTypeArguments().size());
+ IClassReference string = (IClassReference) interfaze.getTypeArguments().get(0);
+ assertEquals("java.lang.String", string.getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertGenericClassImplementsGenericInterface() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A<T> implements I<T> {}");
+ CompilationUnit interfaceSrc = new CompilationUnit("a.I", "package a; public interface I<T> {}");
+ IApi api = convert(classSrc, interfaceSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals("a.A", sigClass.getQualifiedName());
+ assertEquals("A", sigClass.getName());
+ assertEquals(Kind.CLASS, sigClass.getKind());
+ assertTrue(sigClass.getModifiers().contains(Modifier.PUBLIC));
+
+ //get type variable from class
+ assertEquals(1, sigClass.getTypeParameters().size());
+ ITypeVariableDefinition classTypeVar = sigClass.getTypeParameters().get(0);
+ assertEquals("T", classTypeVar.getName());
+ assertSame(sigClass, classTypeVar.getGenericDeclaration());
+
+ //inspect interface
+ IClassDefinition sigInterface = ModelUtil.getClass(sigPackage, "I");
+ assertEquals("a.I", sigInterface.getQualifiedName());
+ assertEquals("I", sigInterface.getName());
+ assertEquals(Kind.INTERFACE, sigInterface.getKind());
+ assertTrue(sigInterface.getModifiers().contains(Modifier.PUBLIC));
+
+ //get type variable from interface
+ assertEquals(1, sigInterface.getTypeParameters().size());
+ ITypeVariableDefinition interfaceTypeVar = sigInterface.getTypeParameters().get(0);
+
+ //get implemented interface from A
+ assertEquals(1, sigClass.getInterfaces().size());
+ IParameterizedType interfaze = (IParameterizedType) sigClass.getInterfaces().iterator().next();
+
+ //compare raw type "I"
+ assertSame(sigInterface, interfaze.getRawType().getClassDefinition());
+
+ //test if type variable of A is type argument of I
+ assertEquals(1, interfaze.getTypeArguments().size());
+ ITypeVariableReference argument = (ITypeVariableReference) interfaze.getTypeArguments().get(0);
+ assertSame(sigClass, argument.getTypeVariableDefinition().getGenericDeclaration());
+ assertEquals(classTypeVar, argument.getTypeVariableDefinition());
+
+ //test that the two type parameters are not equal
+ assertNotSame(classTypeVar, interfaceTypeVar);
+ assertEquals(classTypeVar.getName(), interfaceTypeVar.getName());
+ assertNotSame(classTypeVar.getGenericDeclaration(), interfaceTypeVar.getGenericDeclaration());
+ }
+
+ @Test
+ public void convertConstructor0() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public A(){} }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getConstructors().size());
+ IConstructor constructor = sigClass.getConstructors().iterator().next();
+ assertTrue(constructor.getModifiers().contains(Modifier.PUBLIC));
+ }
+
+ @Test
+ public void convertConstructor1a() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public class B{ } }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A.B");
+ assertEquals(1, sigClass.getConstructors().size());
+ IConstructor constructor = sigClass.getConstructors().iterator().next();
+ assertTrue(constructor.getModifiers().contains(Modifier.PUBLIC));
+ }
+
+ @Test
+ public void convertConstructor1b() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { protected class B{ } }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A.B");
+ assertEquals(1, sigClass.getConstructors().size());
+ IConstructor constructor = sigClass.getConstructors().iterator().next();
+ assertTrue(constructor.getModifiers().contains(Modifier.PROTECTED));
+ }
+
+ @Test
+ public void convertConstructor2() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A {}");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getConstructors().size());
+ }
+
+ @Test
+ public void convertConstructor3() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public class B { public B(){}} }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A.B");
+ assertEquals(1, sigClass.getConstructors().size());
+ }
+
+ @Test
+ public void convertConstructorWithException() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public A() throws NullPointerException{} }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getConstructors().size());
+ IConstructor constructor = sigClass.getConstructors().iterator().next();
+ assertTrue(constructor.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals(1, constructor.getExceptions().size());
+ IClassReference exception = (IClassReference) constructor.getExceptions().iterator().next();
+ assertEquals("java.lang.NullPointerException", exception.getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertConstructorWithParameter() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public A(String param){} }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getConstructors().size());
+ IConstructor constructor = sigClass.getConstructors().iterator().next();
+ assertTrue(constructor.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals(1, constructor.getParameters().size());
+ IParameter param = constructor.getParameters().get(0);
+ assertEquals("java.lang.String", ((IClassReference)param.getType()).getClassDefinition().getQualifiedName());
+ }
+
+ @Test
+ public void convertConstructorWithGenericParameter() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A<T> { public A(T param){} }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getConstructors().size());
+ IConstructor constructor = sigClass.getConstructors().iterator().next();
+ assertTrue(constructor.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals(1, constructor.getParameters().size());
+ IParameter param = constructor.getParameters().get(0);
+ ITypeVariableDefinition paramType = ((ITypeVariableReference)param.getType()).getTypeVariableDefinition();
+ assertEquals("T", paramType.getName());
+ assertSame(sigClass, paramType.getGenericDeclaration());
+ }
+
+ @Test
+ public void convertVoidMethod() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public void m(){} }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getMethods().size());
+ IMethod method = sigClass.getMethods().iterator().next();
+ assertTrue(method.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals("m", method.getName());
+ assertSame(SigPrimitiveType.VOID_TYPE, method.getReturnType());
+ }
+
+ @Test
+ public void convertArrayMethod() throws IOException {
+ CompilationUnit classSrc = new CompilationUnit("a.A", "package a; public class A { public String[] m(){ return null; } }");
+ IApi api = convert(classSrc);
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ assertEquals(1, sigClass.getMethods().size());
+ IMethod method = sigClass.getMethods().iterator().next();
+ assertTrue(method.getModifiers().contains(Modifier.PUBLIC));
+ assertEquals("m", method.getName());
+ IArrayType arrayType = (IArrayType) method.getReturnType();
+ IClassDefinition clazz = ((IClassReference) arrayType.getComponentType()).getClassDefinition();
+ assertEquals("java.lang.String", clazz.getQualifiedName());
+ }
+
+ @Test
+ public void testParameterConformance1() throws IOException {
+ IApi api = convert(new CompilationUnit("test.A",
+ "package test; " +
+ "import java.util.List;" +
+ "public class A<T> {" +
+ " public String[] a;" +
+ " public String[] b;" +
+ " public List<String> c;" +
+ " public List<String> d;" +
+ " public List<T> e;" +
+ " public List<T> f;" +
+ "}"
+ ));
+ IPackage p = ModelUtil.getPackage(api, "test");
+ assertEquals("test", p.getName());
+ IClassDefinition c = ModelUtil.getClass(p, "A");
+ assertEquals("A", c.getName());
+ assertEquals("test.A", c.getQualifiedName());
+
+ Map<String, IField> fields = new HashMap<String, IField>();
+ for(IField f : c.getFields()){
+ fields.put(f.getName(), f);
+ }
+ assertSame(((IClassReference)((IArrayType)fields.get("a").getType()).getComponentType()).getClassDefinition(), ((IClassReference)((IArrayType)fields.get("b").getType()).getComponentType()).getClassDefinition());
+ assertSame(((IParameterizedType)fields.get("c").getType()).getRawType().getClassDefinition(), ((IParameterizedType)fields.get("d").getType()).getRawType().getClassDefinition());
+ assertSame(((IParameterizedType)fields.get("e").getType()).getRawType().getClassDefinition(), ((IParameterizedType)fields.get("f").getType()).getRawType().getClassDefinition());
+
+ ITypeReference type = fields.get("f").getType();
+ assertTrue(type instanceof IParameterizedType);
+ ITypeReference typeArgument = ((IParameterizedType)type).getTypeArguments().get(0);
+ ITypeVariableDefinition typeParameter = c.getTypeParameters().get(0);
+ assertSame(((ITypeVariableReference)typeArgument).getTypeVariableDefinition(), typeParameter);
+ }
+
+ @Test
+ public void testParameterConformance2() throws IOException {
+ IApi api = convert(new CompilationUnit("test.A",
+ "package test; " +
+ "public class A<T> {" +
+ " public <T> T foo(T t){return null;}" +
+ "}"
+ ));
+ IPackage p = ModelUtil.getPackage(api, "test");
+ assertEquals("test", p.getName());
+
+ IPackage sigPackage = ModelUtil.getPackage(api, "test");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ ITypeVariableDefinition t = sigClass.getTypeParameters().get(0);
+
+ IMethod sigMethod = sigClass.getMethods().iterator().next();
+ ITypeVariableDefinition t1 = sigMethod.getTypeParameters().get(0);
+ IParameter param = sigMethod.getParameters().get(0);
+ ITypeReference t2 = param.getType();
+ ITypeReference t3 = sigMethod.getReturnType();
+
+ assertSame(t1, ((ITypeVariableReference)t2).getTypeVariableDefinition());
+ assertSame(((ITypeVariableReference)t2).getTypeVariableDefinition(), ((ITypeVariableReference)t3).getTypeVariableDefinition());
+
+ assertNotSame(t, t1);
+ }
+
+ @Test
+ public void testInnerReferenceToOuterTypeVariable() throws IOException {
+ IApi api = convert(new CompilationUnit("test.A",
+ "package test; " +
+ "public class A<T> {" +
+ " public class B {" +
+ " public T f;" +
+ " } " +
+ "}"
+ ));
+ IPackage p = ModelUtil.getPackage(api, "test");
+ assertEquals("test", p.getName());
+
+ IPackage sigPackage = ModelUtil.getPackage(api, "test");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+ ITypeVariableDefinition t = sigClass.getTypeParameters().get(0);
+
+ IClassDefinition innerClass = ModelUtil.getClass(sigPackage, "A.B");
+ IField field = ModelUtil.getField(innerClass, "f");
+
+ assertSame(t, ((ITypeVariableReference)field.getType()).getTypeVariableDefinition());
+ }
+
+
+ @Test
+ public void convertTypeVariableMultipleUpperBound() throws IOException {
+ String source =
+ "package a; " +
+ "public class A<T extends Comparable<T> & java.io.Serializable> {}";
+ IApi api = convert(new CompilationUnit("a.A", source));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition sigClass = ModelUtil.getClass(sigPackage, "A");
+
+ List<ITypeVariableDefinition> typeParameters = sigClass.getTypeParameters();
+ assertEquals(1, typeParameters.size());
+
+ ITypeVariableDefinition typeVariable = typeParameters.get(0);
+ List<ITypeReference> upperBounds = typeVariable.getUpperBounds();
+ assertEquals(2, upperBounds.size());
+ ITypeReference firstBound = upperBounds.get(0);
+ ITypeReference secondBound = upperBounds.get(1);
+
+ assertTrue(firstBound instanceof IParameterizedType);
+
+ IParameterizedType parametrizedType = (IParameterizedType)firstBound;
+
+ IClassReference rawType = parametrizedType.getRawType();
+ assertEquals("Comparable", rawType.getClassDefinition().getName());
+ assertEquals(1, parametrizedType.getTypeArguments().size());
+ ITypeVariableReference variable = (ITypeVariableReference) parametrizedType.getTypeArguments().get(0);
+ assertSame(typeVariable, variable.getTypeVariableDefinition());
+
+ assertTrue(secondBound instanceof IClassReference);
+ IClassReference secondBoundClass = (IClassReference) secondBound;
+ assertEquals("Serializable", secondBoundClass.getClassDefinition().getName());
+ }
+
+ @Test
+ public void convertPrivateStaticInnerClass0() throws IOException {
+ String source =
+ "package a; " +
+ "public class A { " +
+ " private static class I{}" +
+ " private transient Object i = new I(); " +
+ "}";
+ IApi api = convert(Visibility.PRIVATE, new CompilationUnit("a.A", source));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition innerClass = ModelUtil.getClass(sigPackage, "A.I");
+ assertEquals("A.I", innerClass.getName());
+ Set<IConstructor> constructors = innerClass.getConstructors();
+ assertEquals(1, constructors.size());
+ }
+
+ @Test
+ public void convertPrivateStaticInnerClass1() throws IOException {
+ String source =
+ "package a; " +
+ "public class A {" +
+ " private static class B {" +
+ " public static class C {}" +
+ " }" +
+ "}";
+ IApi api = convert(new CompilationUnit("a.A", source));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ assertEquals(1, sigPackage.getClasses().size());
+ }
+
+ /**
+ * Tests whether the first constructor argument is removed.
+ */
+ @Test
+ public void convertNonStaticInnerClassConstructor0() throws IOException {
+ String source =
+ "package a; " +
+ "public class A {" +
+ " public class B {" +
+ " public B(){}" +
+ " }" +
+ "}";
+ IApi api = convert(new CompilationUnit("a.A", source));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition innerClass = ModelUtil.getClass(sigPackage, "A.B");
+ assertEquals(1, innerClass.getConstructors().size());
+ Set<IConstructor> constructors = innerClass.getConstructors();
+ IConstructor first = constructors.iterator().next();
+ //implicit A.this reference must be removed
+ assertEquals(0, first.getParameters().size());
+ }
+
+ /**
+ * Tests whether the first constructor argument is removed.
+ */
+ @Test
+ public void convertNonStaticInnerClassConstructor1() throws IOException {
+ String source =
+ "package a; " +
+ "public class A {" +
+ " public class B {}" +
+ "}";
+ IApi api = convert(new CompilationUnit("a.A", source));
+ IPackage sigPackage = ModelUtil.getPackage(api, "a");
+ IClassDefinition innerClass = ModelUtil.getClass(sigPackage, "A.B");
+ assertEquals(1, innerClass.getConstructors().size());
+ Set<IConstructor> constructors = innerClass.getConstructors();
+ IConstructor first = constructors.iterator().next();
+ //implicit A.this reference must be removed
+ assertEquals(0, first.getParameters().size());
+ }
+
+
+
+}