    001    package junit.framework;
    002
    003    import java.util.List;
    004
    005    import org.junit.Ignore;
    006    import org.junit.runner.Describable;
    007    import org.junit.runner.Description;
    008    import org.junit.runner.Request;
    009    import org.junit.runner.Runner;
    010    import org.junit.runner.manipulation.Filter;
    011    import org.junit.runner.manipulation.Filterable;
    012    import org.junit.runner.manipulation.Orderer;
    013    import org.junit.runner.manipulation.InvalidOrderingException;
    014    import org.junit.runner.manipulation.NoTestsRemainException;
    015    import org.junit.runner.manipulation.Orderable;
    016    import org.junit.runner.manipulation.Sorter;
    017
    018    /**
    019     * The JUnit4TestAdapter enables running JUnit-4-style tests using a JUnit-3-style test runner.
    020     *
    021     * <p> To use it, add the following to a test class:
    022     * <pre>
    023          public static Test suite() {
    024            return new JUnit4TestAdapter(<em>YourJUnit4TestClass</em>.class);
    025          }
    026    </pre>
    027     */
    028    public class JUnit4TestAdapter implements Test, Filterable, Orderable, Describable {
    029        private final Class<?> fNewTestClass;
    030
    031        private final Runner fRunner;
    032
    033        private final JUnit4TestAdapterCache fCache;
    034
    035        public JUnit4TestAdapter(Class<?> newTestClass) {
    036            this(newTestClass, JUnit4TestAdapterCache.getDefault());
    037        }
    038
    039        public JUnit4TestAdapter(final Class<?> newTestClass, JUnit4TestAdapterCache cache) {
    040            fCache = cache;
    041            fNewTestClass = newTestClass;
    042            fRunner = Request.classWithoutSuiteMethod(newTestClass).getRunner();
    043        }
    044
    045        public int countTestCases() {
    046            return fRunner.testCount();
    047        }
    048
    049        public void run(TestResult result) {
    050            fRunner.run(fCache.getNotifier(result, this));
    051        }
    052
    053        // reflective interface for Eclipse
    054        public List<Test> getTests() {
    055            return fCache.asTestList(getDescription());
    056        }
    057
    058        // reflective interface for Eclipse
    059        public Class<?> getTestClass() {
    060            return fNewTestClass;
    061        }
    062
    063        public Description getDescription() {
    064            Description description = fRunner.getDescription();
    065            return removeIgnored(description);
    066        }
    067
    068        private Description removeIgnored(Description description) {
    069            if (isIgnored(description)) {
    070                return Description.EMPTY;
    071            }
    072            Description result = description.childlessCopy();
    073            for (Description each : description.getChildren()) {
    074                Description child = removeIgnored(each);
    075                if (!child.isEmpty()) {
    076                    result.addChild(child);
    077                }
    078            }
    079            return result;
    080        }
    081
    082        private boolean isIgnored(Description description) {
    083            return description.getAnnotation(Ignore.class) != null;
    084        }
    085
    086        @Override
    087        public String toString() {
    088            return fNewTestClass.getName();
    089        }
    090
    091        public void filter(Filter filter) throws NoTestsRemainException {
    092            filter.apply(fRunner);
    093        }
    094
    095        public void sort(Sorter sorter) {
    096            sorter.apply(fRunner);
    097        }
    098
    099        /**
    100         * {@inheritDoc}
    101         *
    102         * @since 4.13
    103         */
    104        public void order(Orderer orderer) throws InvalidOrderingException {
    105            orderer.apply(fRunner);
    106        }
    107    }