| /* |
| * Copyright (C) 2010 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 libcore.java.lang.reflect; |
| |
| import java.io.IOException; |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.Method; |
| import java.lang.reflect.Type; |
| import java.lang.reflect.TypeVariable; |
| import java.util.Arrays; |
| import java.util.List; |
| import junit.framework.TestCase; |
| |
| public final class GenericExceptionsTest extends TestCase { |
| |
| public void testGenericExceptionsOfMethodsWithTypeParameters() throws Exception { |
| Method method = Thrower.class.getMethod("parameterizedMethod"); |
| assertEquals(Arrays.<Type>asList(IOException.class), |
| Arrays.asList(method.getGenericExceptionTypes())); |
| } |
| |
| public void testGenericExceptionsOfMethodsWithGenericParameters() throws Exception { |
| Method method = Thrower.class.getMethod("genericParameters", List.class); |
| assertEquals(Arrays.<Type>asList(IOException.class), |
| Arrays.asList(method.getGenericExceptionTypes())); |
| } |
| |
| public void testGenericExceptionsOfConstructorsWithTypeParameters() throws Exception { |
| Constructor constructor = Thrower.class.getConstructor(); |
| assertEquals(Arrays.<Type>asList(IOException.class), |
| Arrays.asList(constructor.getGenericExceptionTypes())); |
| } |
| |
| public void testGenericExceptionsOfConstructorsWithGenericParameters() throws Exception { |
| Constructor constructor = Thrower.class.getConstructor(List.class); |
| assertEquals(Arrays.<Type>asList(IOException.class), |
| Arrays.asList(constructor.getGenericExceptionTypes())); |
| } |
| |
| public void testConstructorThrowingTypeVariable() throws Exception { |
| Constructor constructor = ThrowerT.class.getConstructor(); |
| TypeVariable typeVariable = getOnlyValue(constructor.getGenericExceptionTypes(), |
| TypeVariable.class); |
| assertEquals("T", typeVariable.getName()); |
| assertEquals(Arrays.<Type>asList(Throwable.class), Arrays.asList(typeVariable.getBounds())); |
| } |
| |
| public void testMethodThrowingTypeVariable() throws Exception { |
| Method method = ThrowerT.class.getMethod("throwsTypeVariable"); |
| TypeVariable typeVariable = getOnlyValue(method.getGenericExceptionTypes(), |
| TypeVariable.class); |
| assertEquals("T", typeVariable.getName()); |
| assertEquals(Arrays.<Type>asList(Throwable.class), Arrays.asList(typeVariable.getBounds())); |
| } |
| |
| public void testThrowingMethodTypeParameter() throws Exception { |
| Method method = ThrowerT.class.getMethod("throwsMethodTypeParameter"); |
| TypeVariable typeVariable = getOnlyValue(method.getGenericExceptionTypes(), |
| TypeVariable.class); |
| assertEquals("X", typeVariable.getName()); |
| assertEquals(Arrays.<Type>asList(Exception.class), Arrays.asList(typeVariable.getBounds())); |
| } |
| |
| public void testThrowingMethodThrowsEverything() throws Exception { |
| Method method = ThrowerT.class.getMethod("throwsEverything"); |
| Type[] exceptions = method.getGenericExceptionTypes(); |
| TypeVariable t = (TypeVariable) exceptions[0]; |
| assertEquals(3, exceptions.length); |
| assertEquals("T", t.getName()); |
| assertEquals(Arrays.<Type>asList(Throwable.class), Arrays.asList(t.getBounds())); |
| assertEquals(Exception.class, exceptions[1]); |
| TypeVariable x = (TypeVariable) exceptions[2]; |
| assertEquals("X", x.getName()); |
| assertEquals(Arrays.<Type>asList(Exception.class), Arrays.asList(x.getBounds())); |
| } |
| |
| private <T> T getOnlyValue(Object[] array, Class<T> expectedType) { |
| assertEquals("Expected a " + expectedType.getName() + " but was " + Arrays.toString(array), |
| 1, array.length); |
| assertTrue("Expected a " + expectedType.getName() + " but was " + array[0], |
| expectedType.isInstance(array[0])); |
| return expectedType.cast(array[0]); |
| } |
| |
| static class Thrower { |
| public <T> Thrower() throws IOException {} |
| public Thrower(List<?> unused) throws IOException {} |
| public <T> void parameterizedMethod() throws IOException {} |
| public void genericParameters(List<?> unused) throws IOException {} |
| } |
| |
| static class ThrowerT<T extends Throwable> { |
| public ThrowerT() throws T {} |
| public void throwsTypeVariable() throws T {} |
| public <X extends Exception> void throwsMethodTypeParameter() throws X {} |
| public <X extends Exception> void throwsEverything() throws T, Exception, X{} |
| } |
| } |