1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.lang.reflect;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.lang.reflect.Constructor;
204557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.lang.reflect.Method;
214557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.lang.reflect.ParameterizedType;
224557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.lang.reflect.Type;
234557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.lang.reflect.TypeVariable;
24747f40360f7e98bb9c88f9c945b68c04cd36a8d0Jesse Wilsonimport tests.api.java.lang.reflect.GenericReflectionTestsBase;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests type parameters declared on classes.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
30747f40360f7e98bb9c88f9c945b68c04cd36a8d0Jesse Wilsonpublic class OldGenericTypesTest extends GenericReflectionTestsBase {
31f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class GenericType<T>{
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        T methodGenericType(T t){ return t;}
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @SuppressWarnings("hiding")
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        <T> T hidingMethodGenericType(T t){ return t;}
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        static <T> T staticMethodGenericType(T t){ return t;}
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
38f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class MultipleBoundedGenericTypes<T,S extends T>{
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void multipleBoundedGenericTypesTS(T t, S s){}
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
42f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class SimpleInheritance <T> extends GenericType<T>{}
44f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class ConstructorGenericType<T>{
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ConstructorGenericType(T t){}
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class InnerClassTest<T>{
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        class InnerClass {
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InnerClass(T t) {}
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            void innerMethod(T t){}
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
55f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class ExceptionTest<T extends Exception>{
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void exceptionTest() throws T{}
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        class InnerClass{
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            void innerExceptionTest() throws T{}
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static interface InterfaceTest<T>{}
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testConstructorGenericType() throws Exception {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends ConstructorGenericType> clazz = ConstructorGenericType.class;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> typeVariable = getTypeParameter(clazz);
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Constructor<?> constructor = clazz.getDeclaredConstructor(Object.class);
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] genericParameterTypes = constructor.getGenericParameterTypes();
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(genericParameterTypes);
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type parameterType = genericParameterTypes[0];
72f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariable, parameterType);
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testStaticMethodGenericType() throws Exception {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends GenericType> clazz = GenericType.class;
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> typeVariable = getTypeParameter(clazz);
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method method = clazz.getDeclaredMethod("staticMethodGenericType", Object.class);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] genericParameterTypes = method.getGenericParameterTypes();
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(genericParameterTypes);
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type parameterType = genericParameterTypes[0];
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotEquals(typeVariable, parameterType);
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(TypeVariable.class, parameterType);
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(method, ((TypeVariable)parameterType).getGenericDeclaration());
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testHidingMethodGenericType() throws Exception {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends GenericType> clazz = GenericType.class;
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> typeVariable = getTypeParameter(clazz);
92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method method = clazz.getDeclaredMethod("hidingMethodGenericType",  Object.class);
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] genericParameterTypes = method.getGenericParameterTypes();
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(genericParameterTypes);
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type parameterType = genericParameterTypes[0];
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotEquals(typeVariable, parameterType);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(TypeVariable.class, parameterType);
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(method, ((TypeVariable)parameterType).getGenericDeclaration());
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
101f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class MultipleGenericTypes<T,S>{
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void multipleGenericTypesT(T t){}
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void multipleGenericTypesS(S s){}
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        void multipleGenericTypesTS(T t, S s){}
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testMultipleGenericTypes() throws Exception {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //Type parameters
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends MultipleGenericTypes> clazz = MultipleGenericTypes.class;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?>[] typeParameters = clazz.getTypeParameters();
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(2, typeParameters.length);
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> typeVariableT = typeParameters[0];
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz, typeVariableT.getGenericDeclaration());
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("T", typeVariableT.getName());
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> typeVariableS = typeParameters[1];
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("S", typeVariableS.getName());
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz, typeVariableS.getGenericDeclaration());
119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // multipleGenericTypesT
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method multipleGenericTypesT = clazz.getDeclaredMethod("multipleGenericTypesT", new Class[]{Object.class});
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] multipleGenericTypesTTypes = multipleGenericTypesT.getGenericParameterTypes();
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(multipleGenericTypesTTypes);
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type multipleGenericTypesTType = multipleGenericTypesTTypes[0];
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariableT, multipleGenericTypesTType);
126f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // multipleGenericTypesS
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method multipleGenericTypesS = clazz.getDeclaredMethod("multipleGenericTypesS", new Class[]{Object.class});
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] multipleGenericTypesSTypes = multipleGenericTypesS.getGenericParameterTypes();
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(multipleGenericTypesSTypes);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type multipleGenericTypesSType = multipleGenericTypesSTypes[0];
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariableS, multipleGenericTypesSType);
133f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // multipleGenericTypesS
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method multipleGenericTypesTS = clazz.getDeclaredMethod("multipleGenericTypesTS", new Class[]{Object.class, Object.class});
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] multipleGenericTypesTSTypes = multipleGenericTypesTS.getGenericParameterTypes();
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(2, multipleGenericTypesTSTypes.length);
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type multipleGenericTypesTSTypeT = multipleGenericTypesTSTypes[0];
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariableT, multipleGenericTypesTSTypeT);
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type multipleGenericTypesTSTypeS = multipleGenericTypesTSTypes[1];
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariableS, multipleGenericTypesTSTypeS);
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testMultipleBoundedGenericTypes() throws Exception {
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //Type parameters
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends MultipleBoundedGenericTypes> clazz = MultipleBoundedGenericTypes.class;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?>[] typeParameters = clazz.getTypeParameters();
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(2, typeParameters.length);
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> typeVariableT = typeParameters[0];
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz, typeVariableT.getGenericDeclaration());
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("T", typeVariableT.getName());
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> typeVariableS = typeParameters[1];
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("S", typeVariableS.getName());
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz, typeVariableS.getGenericDeclaration());
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] boundsS = typeVariableS.getBounds();
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(boundsS);
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type boundS = boundsS[0];
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariableT, boundS);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testSimpleInheritance() throws Exception {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends SimpleInheritance> clazz = SimpleInheritance.class;
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> subTypeVariable = getTypeParameter(clazz);
165f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(ParameterizedType.class, clazz.getGenericSuperclass());
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ParameterizedType parameterizedSuperType = (ParameterizedType) clazz.getGenericSuperclass();
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(Class.class, parameterizedSuperType.getRawType());
169f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> superTypeParameter = getTypeParameter((Class<?>)parameterizedSuperType.getRawType());
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> typeParameter = getTypeParameter(GenericType.class);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(superTypeParameter, typeParameter);
173f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotEquals(subTypeVariable, superTypeParameter);
175f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] actualTypeArguments = parameterizedSuperType.getActualTypeArguments();
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(actualTypeArguments);
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(TypeVariable.class, actualTypeArguments[0]);
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable actualSuperTypeVariable = (TypeVariable) actualTypeArguments[0];
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(subTypeVariable, actualSuperTypeVariable);
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testInnerClassTest() throws Exception {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends InnerClassTest> clazz =InnerClassTest.class;
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> typeVariable = getTypeParameter(clazz);
186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?>[] declaredClasses = clazz.getDeclaredClasses();
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(declaredClasses);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?> innerClazz = declaredClasses[0];
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(InnerClassTest.InnerClass.class, innerClazz);
191f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
192f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        //constructor
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Constructor<?>[] declaredConstructors = innerClazz.getDeclaredConstructors();
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(declaredConstructors);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Constructor<?> declaredConstructor = declaredConstructors[0];
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] genericParameterTypes = declaredConstructor.getGenericParameterTypes();
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(genericParameterTypes);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariable, genericParameterTypes[0]);
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(TypeVariable.class, genericParameterTypes[0]);
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> constructorTypeVariable = (TypeVariable<?>) genericParameterTypes[0];
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz ,constructorTypeVariable.getGenericDeclaration());
202f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //method
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method declaredMethods = innerClazz.getDeclaredMethod("innerMethod", Object.class);
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] methodParameterTypes = declaredMethods.getGenericParameterTypes();
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(methodParameterTypes);
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariable, methodParameterTypes[0]);
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(TypeVariable.class, methodParameterTypes[0]);
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> methodTypeVariable = (TypeVariable<?>) methodParameterTypes[0];
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz, methodTypeVariable.getGenericDeclaration());
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testException() throws Exception {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<? extends ExceptionTest> clazz = ExceptionTest.class;
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<Class> typeVariable = getTypeParameter(clazz);
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method method = clazz.getDeclaredMethod("exceptionTest");
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] genericExceptionTypes = method.getGenericExceptionTypes();
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(genericExceptionTypes);
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariable, genericExceptionTypes[0]);
220f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?>[] declaredClasses = clazz.getDeclaredClasses();
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(declaredClasses);
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?> innerClazz = declaredClasses[0];
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(ExceptionTest.InnerClass.class, innerClazz);
225f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //method
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Method declaredMethods = innerClazz.getDeclaredMethod("innerExceptionTest");
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Type[] exceptionTypes = declaredMethods.getGenericExceptionTypes();
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertLenghtOne(exceptionTypes);
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(typeVariable, exceptionTypes[0]);
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertInstanceOf(TypeVariable.class, exceptionTypes[0]);
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TypeVariable<?> methodTypeVariable = (TypeVariable<?>) exceptionTypes[0];
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(clazz, methodTypeVariable.getGenericDeclaration());
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
236