carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/internal/runners/TestClassMethodsRunner.java
changeset 0 20e4ed35fd3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/internal/runners/TestClassMethodsRunner.java	Fri Apr 03 17:08:57 2009 +0100
@@ -0,0 +1,102 @@
+package org.junit.internal.runners;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.manipulation.Filter;
+import org.junit.runner.manipulation.Filterable;
+import org.junit.runner.manipulation.NoTestsRemainException;
+import org.junit.runner.manipulation.Sortable;
+import org.junit.runner.manipulation.Sorter;
+import org.junit.runner.notification.RunNotifier;
+
+public class TestClassMethodsRunner extends Runner implements Filterable, Sortable {
+	private final List<Method> fTestMethods;
+	private final Class<?> fTestClass;
+
+	// This assumes that some containing runner will perform validation of the test methods	
+	public TestClassMethodsRunner(Class<?> klass) {
+		fTestClass= klass;
+		fTestMethods= new TestIntrospector(getTestClass()).getTestMethods(Test.class);
+	}
+	
+	@Override
+	public void run(RunNotifier notifier) {
+		if (fTestMethods.isEmpty())
+			notifier.testAborted(getDescription(), new Exception("No runnable methods"));
+		for (Method method : fTestMethods)
+			invokeTestMethod(method, notifier);
+	}
+
+	@Override
+	public Description getDescription() {
+		Description spec= Description.createSuiteDescription(getName());
+		List<Method> testMethods= fTestMethods;
+		for (Method method : testMethods)
+				spec.addChild(methodDescription(method));
+		return spec;
+	}
+
+	protected String getName() {
+		return getTestClass().getName();
+	}
+	
+	protected Object createTest() throws Exception {
+		return getTestClass().getConstructor().newInstance();
+	}
+
+	protected void invokeTestMethod(Method method, RunNotifier notifier) {
+		Object test;
+		try {
+			test= createTest();
+		} catch (InvocationTargetException e) {
+			notifier.testAborted(methodDescription(method), e.getCause());
+			return;			
+		} catch (Exception e) {
+			notifier.testAborted(methodDescription(method), e);
+			return;
+		}
+		createMethodRunner(test, method, notifier).run();
+	}
+
+	protected TestMethodRunner createMethodRunner(Object test, Method method, RunNotifier notifier) {
+		return new TestMethodRunner(test, method, notifier, methodDescription(method));
+	}
+
+	protected String testName(Method method) {
+		return method.getName();
+	}
+
+	protected Description methodDescription(Method method) {
+		return Description.createTestDescription(getTestClass(), testName(method));
+	}
+
+	public void filter(Filter filter) throws NoTestsRemainException {
+		for (Iterator<Method> iter= fTestMethods.iterator(); iter.hasNext();) {
+			Method method= iter.next();
+			if (!filter.shouldRun(methodDescription(method)))
+				iter.remove();
+		}
+		if (fTestMethods.isEmpty())
+			throw new NoTestsRemainException();
+	}
+
+	public void sort(final Sorter sorter) {
+		Collections.sort(fTestMethods, new Comparator<Method>() {
+			public int compare(Method o1, Method o2) {
+				return sorter.compare(methodDescription(o1), methodDescription(o2));
+			}
+		});
+	}
+
+	protected Class<?> getTestClass() {
+		return fTestClass;
+	}
+}
\ No newline at end of file