    001    package org.junit.runner;
    002
    003    import org.junit.runners.Suite;
    004    import org.junit.runners.model.InitializationError;
    005    import org.junit.runners.model.RunnerBuilder;
    006
    007    /**
    008     * Represents a strategy for computing runners and suites.
    009     * WARNING: this class is very likely to undergo serious changes in version 4.8 and
    010     * beyond.
    011     *
    012     * @since 4.6
    013     */
    014    public class Computer {
    015        /**
    016         * Returns a new default computer, which runs tests in serial order
    017         */
    018        public static Computer serial() {
    019            return new Computer();
    020        }
    021
    022        /**
    023         * Create a suite for {@code classes}, building Runners with {@code builder}.
    024         * Throws an InitializationError if Runner construction fails
    025         */
    026        public Runner getSuite(final RunnerBuilder builder,
    027                Class<?>[] classes) throws InitializationError {
    028            return new Suite(new RunnerBuilder() {
    029                @Override
    030                public Runner runnerForClass(Class<?> testClass) throws Throwable {
    031                    return getRunner(builder, testClass);
    032                }
    033            }, classes) {
    034                @Override
    035                protected String getName() {
    036                    /*
    037                     * #1320 The generated suite is not based on a real class so
    038                     * only a 'null' description can be generated from it. This name
    039                     * will be overridden here.
    040                     */
    041                    return "classes";
    042                }
    043            };
    044        }
    045
    046        /**
    047         * Create a single-class runner for {@code testClass}, using {@code builder}
    048         */
    049        protected Runner getRunner(RunnerBuilder builder, Class<?> testClass) throws Throwable {
    050            return builder.runnerForClass(testClass);
    051        }
    052    }