1package junit.framework;
2
3import java.util.List;
4
5import org.junit.Ignore;
6import org.junit.runner.Describable;
7import org.junit.runner.Description;
8import org.junit.runner.Request;
9import org.junit.runner.Runner;
10import org.junit.runner.manipulation.Filter;
11import org.junit.runner.manipulation.Filterable;
12import org.junit.runner.manipulation.NoTestsRemainException;
13import org.junit.runner.manipulation.Sortable;
14import org.junit.runner.manipulation.Sorter;
15
16public class JUnit4TestAdapter implements Test, Filterable, Sortable, Describable {
17	private final Class<?> fNewTestClass;
18
19	private final Runner fRunner;
20
21	private final JUnit4TestAdapterCache fCache;
22
23	public JUnit4TestAdapter(Class<?> newTestClass) {
24		this(newTestClass, JUnit4TestAdapterCache.getDefault());
25	}
26
27	public JUnit4TestAdapter(final Class<?> newTestClass,
28			JUnit4TestAdapterCache cache) {
29		fCache = cache;
30		fNewTestClass = newTestClass;
31		fRunner = Request.classWithoutSuiteMethod(newTestClass).getRunner();
32	}
33
34	public int countTestCases() {
35		return fRunner.testCount();
36	}
37
38	public void run(TestResult result) {
39		fRunner.run(fCache.getNotifier(result, this));
40	}
41
42	// reflective interface for Eclipse
43	public List<Test> getTests() {
44		return fCache.asTestList(getDescription());
45	}
46
47	// reflective interface for Eclipse
48	public Class<?> getTestClass() {
49		return fNewTestClass;
50	}
51
52	public Description getDescription() {
53		Description description= fRunner.getDescription();
54		return removeIgnored(description);
55	}
56
57	private Description removeIgnored(Description description) {
58		if (isIgnored(description))
59			return Description.EMPTY;
60		Description result = description.childlessCopy();
61		for (Description each : description.getChildren()) {
62			Description child= removeIgnored(each);
63			if (! child.isEmpty())
64				result.addChild(child);
65		}
66		return result;
67	}
68
69	private boolean isIgnored(Description description) {
70		return description.getAnnotation(Ignore.class) != null;
71	}
72
73	@Override
74	public String toString() {
75		return fNewTestClass.getName();
76	}
77
78	public void filter(Filter filter) throws NoTestsRemainException {
79		filter.apply(fRunner);
80	}
81
82	public void sort(Sorter sorter) {
83		sorter.apply(fRunner);
84	}
85}