/*
* Copyright (C) 2008 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 org.apache.harmony.tests.java.lang.reflect;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
/**
* Tests unbounded type parameters declared on methods.
*/
public class GenericMethodsTests extends GenericReflectionTestsBase{
static class GenericMethods {
public <T> void noParamNoReturn() {}
public <T> void paramNoReturn(T param) {}
@SuppressWarnings("unchecked")
public <T> T noParamReturn() { return (T) new Object(); }
public <T> T paramReturn(T param) {return param;}
}
private static Class<? extends GenericMethods> clazz = GenericMethodsTests.GenericMethods.class;
/**
* Tests that there are no Type Parameters on the Class itself.
*/
public void testGenericMethods() {
assertLenghtZero(clazz.getTypeParameters());
}
/**
* Tests whether the specified method declares a type parameter T.
* @param method the method
*/
private void checkTypeParameter(Method method) {
TypeVariable<Method> typeParameter = getTypeParameter(method);
assertEquals("T", typeParameter.getName());
assertEquals(method, typeParameter.getGenericDeclaration());
}
/**
* Tests whether the specified method declares a parameter with the
* type of the type parameter.
* @param method the method
*/
private void checkParameterType(Method method) {
TypeVariable<Method> typeParameter = getTypeParameter(method);
assertLenghtOne(method.getGenericParameterTypes());
Type genericParameterType = method.getGenericParameterTypes()[0];
assertEquals(typeParameter, genericParameterType);
assertInstanceOf(TypeVariable.class, genericParameterType);
assertEquals(method, ((TypeVariable<?>) genericParameterType).getGenericDeclaration());
}
/**
* Tests whether the type of the return type is the declared type parameter.
* @param method the declaring method
*/
private void checkReturnType(Method method) {
TypeVariable<Method> typeParameter = getTypeParameter(method);
Type genericReturnType = method.getGenericReturnType();
assertEquals(typeParameter, genericReturnType);
assertInstanceOf(TypeVariable.class, genericReturnType);
assertEquals(method, ((TypeVariable<?>) genericReturnType).getGenericDeclaration());
}
public void testNoParamNoReturn() throws Exception {
Method method = clazz.getMethod("noParamNoReturn");
checkTypeParameter(method);
}
public void testParamNoReturn() throws Exception {
Method method = clazz.getMethod("paramNoReturn", Object.class);
checkTypeParameter(method);
checkParameterType(method);
}
public void testNoParamReturn() throws Exception {
Method method = clazz.getMethod("noParamReturn");
checkTypeParameter(method);
assertLenghtZero(method.getGenericParameterTypes());
checkReturnType(method);
}
public void testParamReturn() throws Exception {
Method method = clazz.getMethod("paramReturn", Object.class);
checkTypeParameter(method);
checkParameterType(method);
checkReturnType(method);
}
public void testIndependencyOfMethodTypeParameters() throws Exception {
Method method0 = clazz.getMethod("paramNoReturn", Object.class);
TypeVariable<Method> typeParameter0 = method0.getTypeParameters()[0];
Method method1 = clazz.getMethod("noParamNoReturn");
TypeVariable<Method> typeParameter1 = method1.getTypeParameters()[0];
//Generic method type parameters NAMES are equal
assertEquals(typeParameter0.getName(), typeParameter1.getName());
//Generic method type PARAMETERS are not equal
assertNotEquals(typeParameter0, typeParameter1);
}
}