1package org.junit.runners.model;
2
3import java.lang.reflect.GenericArrayType;
4import java.lang.reflect.Method;
5import java.lang.reflect.ParameterizedType;
6import java.lang.reflect.Type;
7import java.lang.reflect.TypeVariable;
8import java.lang.reflect.WildcardType;
9import java.util.List;
10
11class NoGenericTypeParametersValidator {
12	private final Method fMethod;
13
14	NoGenericTypeParametersValidator(Method method) {
15		this.fMethod = method;
16	}
17
18	void validate(List<Throwable> errors) {
19		for (Type each : fMethod.getGenericParameterTypes())
20			validateNoTypeParameterOnType(each, errors);
21	}
22
23	private void validateNoTypeParameterOnType(Type type, List<Throwable> errors) {
24		if (type instanceof TypeVariable<?>) {
25			errors.add(new Exception("Method " + fMethod.getName()
26					+ "() contains unresolved type variable " + type));
27		} else if (type instanceof ParameterizedType)
28			validateNoTypeParameterOnParameterizedType((ParameterizedType) type, errors);
29		else if (type instanceof WildcardType)
30			validateNoTypeParameterOnWildcardType((WildcardType) type, errors);
31		else if (type instanceof GenericArrayType)
32			validateNoTypeParameterOnGenericArrayType((GenericArrayType) type, errors);
33	}
34
35	private void validateNoTypeParameterOnParameterizedType(ParameterizedType parameterized,
36			List<Throwable> errors) {
37		for (Type each : parameterized.getActualTypeArguments())
38			validateNoTypeParameterOnType(each, errors);
39	}
40
41	private void validateNoTypeParameterOnWildcardType(WildcardType wildcard,
42			List<Throwable> errors) {
43		for (Type each : wildcard.getUpperBounds())
44		    validateNoTypeParameterOnType(each, errors);
45		for (Type each : wildcard.getLowerBounds())
46		    validateNoTypeParameterOnType(each, errors);
47	}
48
49	private void validateNoTypeParameterOnGenericArrayType(
50			GenericArrayType arrayType, List<Throwable> errors) {
51		validateNoTypeParameterOnType(arrayType.getGenericComponentType(), errors);
52	}
53}