2 * Copyright (C) 2008 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package tests.api.java.lang.reflect;
19 import dalvik.annotation.BrokenTest;
20 import dalvik.annotation.KnownFailure;
21 import dalvik.annotation.TestTargets;
22 import dalvik.annotation.TestLevel;
23 import dalvik.annotation.TestTargetNew;
24 import dalvik.annotation.TestTargetClass;
26 import java.lang.reflect.Method;
27 import java.lang.reflect.ParameterizedType;
28 import java.lang.reflect.Type;
29 import java.lang.reflect.TypeVariable;
30 import java.lang.reflect.WildcardType;
33 * Tests generic reflection in more complicated cases. In particular: Scoping of
34 * type parameters, equality of type parameters, wildcard types, parameterized
35 * types and multiple bounds.
37 @TestTargetClass(Method.class)
38 public class GenericReflectionCornerCases extends GenericReflectionTestsBase {
40 static class Pair<T, S> {}
42 static class WildcardEquality<T> {
43 void wildcardEquality(Pair<? extends T, ? extends T> param) {}
47 level = TestLevel.PARTIAL,
48 notes = "Stress test.",
49 method = "getTypeParameters",
53 level = TestLevel.PARTIAL,
54 notes = "Stress test.",
55 method = "getGenericParameterTypes",
59 @SuppressWarnings("unchecked")
60 public void testWildcardEquality() throws Exception {
61 Class<? extends WildcardEquality> clazz = WildcardEquality.class;
63 Method method = clazz.getDeclaredMethod("wildcardEquality", Pair.class);
64 TypeVariable<?>[] typeParameters = clazz.getTypeParameters();
65 assertLenghtOne(typeParameters);
66 TypeVariable<?> typeParameter = typeParameters[0];
68 Type[] parameterTypes = method.getGenericParameterTypes();
69 assertLenghtOne(parameterTypes);
70 Type parameter = parameterTypes[0];
71 assertInstanceOf(ParameterizedType.class, parameter);
72 ParameterizedType paramType = (ParameterizedType) parameter;
73 Type[] actualTypeArguments = paramType.getActualTypeArguments();
74 assertEquals(2, actualTypeArguments.length);
76 Type firstArgument = actualTypeArguments[0];
77 assertInstanceOf(WildcardType.class, firstArgument);
78 WildcardType firstWildcardArgument = (WildcardType) firstArgument;
79 Type secondArgument = actualTypeArguments[1];
80 assertInstanceOf(WildcardType.class, secondArgument);
81 WildcardType secondWildcardArgument = (WildcardType) secondArgument;
83 assertEquals(firstWildcardArgument, secondWildcardArgument);
85 Type[] firstWildcardArgumentUpperBounds = firstWildcardArgument.getUpperBounds();
86 assertLenghtOne(firstWildcardArgumentUpperBounds);
87 Type firstWildcardArgumentUpperBoundsType = firstWildcardArgumentUpperBounds[0];
89 Type[] secondWildcardArgumentUpperBounds = secondWildcardArgument.getUpperBounds();
90 assertLenghtOne(secondWildcardArgumentUpperBounds);
91 Type secondWildcardArgumentUpperBoundsType = secondWildcardArgumentUpperBounds[0];
93 assertEquals(firstWildcardArgumentUpperBoundsType, secondWildcardArgumentUpperBoundsType);
95 assertEquals(typeParameter, firstWildcardArgumentUpperBoundsType);
96 assertEquals(typeParameter, secondWildcardArgumentUpperBoundsType);
99 static class WildcardUnEquality<T> {
100 void wildcardUnEquality(Pair<? extends T, ? super T> param) {}
104 level = TestLevel.PARTIAL,
105 notes = "Stress test.",
106 method = "getTypeParameters",
110 level = TestLevel.PARTIAL,
111 notes = "Stress test.",
112 method = "getGenericParameterTypes",
116 @SuppressWarnings("unchecked")
117 public void testWildcardUnEquality() throws Exception {
118 Class<? extends WildcardUnEquality> clazz = WildcardUnEquality.class;
120 Method method = clazz.getDeclaredMethod("wildcardUnEquality", Pair.class);
121 TypeVariable<?>[] typeParameters = clazz.getTypeParameters();
122 assertLenghtOne(typeParameters);
123 TypeVariable<?> typeParameter = typeParameters[0];
125 Type[] parameterTypes = method.getGenericParameterTypes();
126 assertLenghtOne(parameterTypes);
127 Type parameter = parameterTypes[0];
128 assertInstanceOf(ParameterizedType.class, parameter);
129 ParameterizedType paramType = (ParameterizedType) parameter;
130 Type[] actualTypeArguments = paramType.getActualTypeArguments();
131 assertEquals(2, actualTypeArguments.length);
133 Type firstArgument = actualTypeArguments[0];
134 assertInstanceOf(WildcardType.class, firstArgument);
135 WildcardType firstWildcardArgument = (WildcardType) firstArgument;
136 Type secondArgument = actualTypeArguments[1];
137 assertInstanceOf(WildcardType.class, secondArgument);
138 WildcardType secondWildcardArgument = (WildcardType) secondArgument;
140 assertNotEquals(firstWildcardArgument, secondWildcardArgument);
142 Type[] firstWildcardArgumentUpperBounds = firstWildcardArgument.getUpperBounds();
143 assertLenghtOne(firstWildcardArgumentUpperBounds);
144 Type firstWildcardArgumentUpperBoundsType = firstWildcardArgumentUpperBounds[0];
146 Type[] secondWildcardArgumentLowerBounds = secondWildcardArgument.getLowerBounds();
147 assertLenghtOne(secondWildcardArgumentLowerBounds);
148 Type secondWildcardArgumentLoweroundsType = secondWildcardArgumentLowerBounds[0];
150 assertEquals(firstWildcardArgumentUpperBoundsType, secondWildcardArgumentLoweroundsType);
151 assertEquals(typeParameter, firstWildcardArgumentUpperBoundsType);
152 assertEquals(typeParameter, secondWildcardArgumentLoweroundsType);
155 static class MultipleBoundedWildcardUnEquality<T extends Object & Comparable<MultipleBoundedWildcardUnEquality<T>>> {
156 void multipleBoundedWildcardUnEquality(Pair<? extends T, ? super T> param) {}
160 level = TestLevel.PARTIAL,
161 notes = "Stress test.",
162 method = "getTypeParameters",
166 level = TestLevel.PARTIAL,
167 notes = "Stress test.",
168 method = "getGenericParameterTypes",
172 @SuppressWarnings("unchecked")
173 @BrokenTest(value = "fails when run using CTS harness bug 2155700")
174 public void testMultipleBoundedWildcardUnEquality() throws Exception {
175 Class<? extends MultipleBoundedWildcardUnEquality> clazz = MultipleBoundedWildcardUnEquality.class;
177 // new WildcardEquality<Object>().wildcardEquality(new Pair<String,
180 Method method = clazz.getDeclaredMethod("multipleBoundedWildcardUnEquality", Pair.class);
181 TypeVariable<?>[] typeParameters = clazz.getTypeParameters();
182 assertLenghtOne(typeParameters);
183 TypeVariable<?> typeParameter = typeParameters[0];
184 Type[] typeParameterBounds = typeParameter.getBounds();
185 assertEquals(2, typeParameterBounds.length);
186 assertEquals(Object.class, typeParameterBounds[0]);
187 assertInstanceOf(ParameterizedType.class, typeParameterBounds[1]);
188 ParameterizedType parameterizedType = (ParameterizedType) typeParameterBounds[1];
189 assertEquals(Comparable.class, parameterizedType.getRawType());
190 Type[] typeArguments = parameterizedType.getActualTypeArguments();
191 assertLenghtOne(typeArguments);
192 assertInstanceOf(ParameterizedType.class, typeArguments[0]);
193 ParameterizedType type = (ParameterizedType) typeArguments[0];
194 assertEquals(typeParameter, type.getActualTypeArguments()[0]);
195 assertEquals(MultipleBoundedWildcardUnEquality.class, type.getRawType());
197 Type[] parameterTypes = method.getGenericParameterTypes();
198 assertLenghtOne(parameterTypes);
199 Type parameter = parameterTypes[0];
200 assertInstanceOf(ParameterizedType.class, parameter);
201 ParameterizedType paramType = (ParameterizedType) parameter;
202 Type[] actualTypeArguments = paramType.getActualTypeArguments();
203 assertEquals(2, actualTypeArguments.length);
205 Type firstArgument = actualTypeArguments[0];
206 assertInstanceOf(WildcardType.class, firstArgument);
207 WildcardType firstWildcardArgument = (WildcardType) firstArgument;
208 Type secondArgument = actualTypeArguments[1];
209 assertInstanceOf(WildcardType.class, secondArgument);
210 WildcardType secondWildcardArgument = (WildcardType) secondArgument;
212 assertNotEquals(firstWildcardArgument, secondWildcardArgument);
214 Type[] firstWildcardArgumentUpperBounds = firstWildcardArgument.getUpperBounds();
215 assertLenghtOne(firstWildcardArgumentUpperBounds);
216 Type firstWildcardArgumentUpperBoundsType = firstWildcardArgumentUpperBounds[0];
218 Type[] secondWildcardArgumentLowerBounds = secondWildcardArgument.getLowerBounds();
219 assertLenghtOne(secondWildcardArgumentLowerBounds);
220 Type secondWildcardArgumentLoweroundsType = secondWildcardArgumentLowerBounds[0];
222 assertEquals(firstWildcardArgumentUpperBoundsType, secondWildcardArgumentLoweroundsType);
225 static class MultipleBoundedWildcardEquality<T extends Object & Comparable<MultipleBoundedWildcardEquality<T>>> {
226 void multipleBoundedWildcardEquality(Pair<? extends T, ? extends T> param) {}
230 level = TestLevel.PARTIAL,
231 notes = "Stress test.",
232 method = "getTypeParameters",
236 level = TestLevel.PARTIAL,
237 notes = "Stress test.",
238 method = "getGenericParameterTypes",
242 @SuppressWarnings("unchecked")
243 @BrokenTest(value = "fails when run using CTS harness bug 2155700")
244 public void testMultipleBoundedWildcard() throws Exception {
245 Class<? extends MultipleBoundedWildcardEquality> clazz = MultipleBoundedWildcardEquality.class;
247 Method method = clazz.getDeclaredMethod("multipleBoundedWildcardEquality", Pair.class);
248 TypeVariable<?>[] typeParameters = clazz.getTypeParameters();
249 assertLenghtOne(typeParameters);
250 TypeVariable<?> typeParameter = typeParameters[0];
251 Type[] typeParameterBounds = typeParameter.getBounds();
252 assertEquals(2, typeParameterBounds.length);
253 assertEquals(Object.class, typeParameterBounds[0]);
254 assertInstanceOf(ParameterizedType.class, typeParameterBounds[1]);
255 ParameterizedType parameterizedType = (ParameterizedType) typeParameterBounds[1];
256 assertEquals(Comparable.class, parameterizedType.getRawType());
257 Type[] typeArguments = parameterizedType.getActualTypeArguments();
258 assertLenghtOne(typeArguments);
259 assertInstanceOf(ParameterizedType.class, typeArguments[0]);
260 ParameterizedType type = (ParameterizedType) typeArguments[0];
261 assertEquals(typeParameter, type.getActualTypeArguments()[0]);
262 assertEquals(MultipleBoundedWildcardEquality.class, type.getRawType());
264 Type[] parameterTypes = method.getGenericParameterTypes();
265 assertLenghtOne(parameterTypes);
266 Type parameter = parameterTypes[0];
267 assertInstanceOf(ParameterizedType.class, parameter);
268 ParameterizedType paramType = (ParameterizedType) parameter;
269 Type[] actualTypeArguments = paramType.getActualTypeArguments();
270 assertEquals(2, actualTypeArguments.length);
272 Type firstArgument = actualTypeArguments[0];
273 assertInstanceOf(WildcardType.class, firstArgument);
274 WildcardType firstWildcardArgument = (WildcardType) firstArgument;
275 Type secondArgument = actualTypeArguments[1];
276 assertInstanceOf(WildcardType.class, secondArgument);
277 WildcardType secondWildcardArgument = (WildcardType) secondArgument;
279 assertEquals(firstWildcardArgument, secondWildcardArgument);
281 Type[] firstWildcardArgumentUpperBounds = firstWildcardArgument.getUpperBounds();
282 assertLenghtOne(firstWildcardArgumentUpperBounds);
283 Type firstWildcardArgumentUpperBoundsType = firstWildcardArgumentUpperBounds[0];
285 Type[] secondWildcardArgumentUpperBounds = secondWildcardArgument.getUpperBounds();
286 assertLenghtOne(secondWildcardArgumentUpperBounds);
287 Type secondWildcardArgumentLoweroundsType = secondWildcardArgumentUpperBounds[0];
289 assertEquals(firstWildcardArgumentUpperBoundsType, secondWildcardArgumentLoweroundsType);