1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.internal.runners;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.annotation.Annotation;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Method;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Modifier;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.ArrayList;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.After;
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.AfterClass;
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.Before;
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.BeforeClass;
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.Test;
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.BlockJUnit4ClassRunner;
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @deprecated Included for backwards compatibility with JUnit 4.4. Will be
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *             removed in the next release. Please use
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *             {@link BlockJUnit4ClassRunner} in place of {@link JUnit4ClassRunner}.
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot@Deprecated
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class MethodValidator {
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final List<Throwable> fErrors= new ArrayList<Throwable>();
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private TestClass fTestClass;
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public MethodValidator(TestClass testClass) {
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fTestClass = testClass;
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void validateInstanceMethods() {
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateTestMethods(After.class, false);
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateTestMethods(Before.class, false);
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateTestMethods(Test.class, false);
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		List<Method> methods= fTestClass.getAnnotatedMethods(Test.class);
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		if (methods.size() == 0)
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			fErrors.add(new Exception("No runnable methods"));
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void validateStaticMethods() {
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateTestMethods(BeforeClass.class, true);
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateTestMethods(AfterClass.class, true);
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public List<Throwable> validateMethodsForDefaultRunner() {
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateNoArgConstructor();
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateStaticMethods();
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateInstanceMethods();
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return fErrors;
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void assertValid() throws InitializationError {
55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		if (!fErrors.isEmpty())
56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			throw new InitializationError(fErrors);
57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void validateNoArgConstructor() {
60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		try {
61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			fTestClass.getConstructor();
62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		} catch (Exception e) {
63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			fErrors.add(new Exception("Test class should have public zero-argument constructor", e));
64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		}
65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private void validateTestMethods(Class<? extends Annotation> annotation,
68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			boolean isStatic) {
69b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		List<Method> methods= fTestClass.getAnnotatedMethods(annotation);
70b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Method each : methods) {
72b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			if (Modifier.isStatic(each.getModifiers()) != isStatic) {
73b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				String state= isStatic ? "should" : "should not";
74b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				fErrors.add(new Exception("Method " + each.getName() + "() "
75b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot						+ state + " be static"));
76b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			}
77b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			if (!Modifier.isPublic(each.getDeclaringClass().getModifiers()))
78b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				fErrors.add(new Exception("Class " + each.getDeclaringClass().getName()
79b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot						+ " should be public"));
80b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			if (!Modifier.isPublic(each.getModifiers()))
81b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				fErrors.add(new Exception("Method " + each.getName()
82b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot						+ " should be public"));
83b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			if (each.getReturnType() != Void.TYPE)
84b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				fErrors.add(new Exception("Method " + each.getName()
85b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot						+ " should be void"));
86b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			if (each.getParameterTypes().length != 0)
87b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				fErrors.add(new Exception("Method " + each.getName()
88b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot						+ " should have no parameters"));
89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		}
90b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
91b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}
92