OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tools / signature-tools / test / signature / converter / ConvertClassTest.java
diff --git a/cts/tools/signature-tools/test/signature/converter/ConvertClassTest.java b/cts/tools/signature-tools/test/signature/converter/ConvertClassTest.java
new file mode 100644 (file)
index 0000000..5bcdcb4
--- /dev/null
@@ -0,0 +1,668 @@
+/*
+ * 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());
+    }
+    
+    
+   
+}