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, JUnit4TestAdapterCache cache) {
28        fCache = cache;
29        fNewTestClass = newTestClass;
30        fRunner = Request.classWithoutSuiteMethod(newTestClass).getRunner();
31    }
32
33    public int countTestCases() {
34        return fRunner.testCount();
35    }
36
37    public void run(TestResult result) {
38        fRunner.run(fCache.getNotifier(result, this));
39    }
40
41    // reflective interface for Eclipse
42    public List<Test> getTests() {
43        return fCache.asTestList(getDescription());
44    }
45
46    // reflective interface for Eclipse
47    public Class<?> getTestClass() {
48        return fNewTestClass;
49    }
50
51    public Description getDescription() {
52        Description description = fRunner.getDescription();
53        return removeIgnored(description);
54    }
55
56    private Description removeIgnored(Description description) {
57        if (isIgnored(description)) {
58            return Description.EMPTY;
59        }
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        }
67        return result;
68    }
69
70    private boolean isIgnored(Description description) {
71        return description.getAnnotation(Ignore.class) != null;
72    }
73
74    @Override
75    public String toString() {
76        return fNewTestClass.getName();
77    }
78
79    public void filter(Filter filter) throws NoTestsRemainException {
80        filter.apply(fRunner);
81    }
82
83    public void sort(Sorter sorter) {
84        sorter.apply(fRunner);
85    }
86}