    001    package org.junit.experimental.results;
    002
    003    import java.io.ByteArrayOutputStream;
    004    import java.io.PrintStream;
    005    import java.util.List;
    006
    007    import org.junit.internal.TextListener;
    008    import org.junit.runner.JUnitCore;
    009    import org.junit.runner.Request;
    010    import org.junit.runner.Result;
    011    import org.junit.runner.notification.Failure;
    012
    013    /**
    014     * A test result that prints nicely in error messages.
    015     * This is only intended to be used in JUnit self-tests.
    016     * For example:
    017     *
    018     * <pre>
    019     *    assertThat(testResult(HasExpectedException.class), isSuccessful());
    020     * </pre>
    021     */
    022    public class PrintableResult {
    023        private Result result;
    024
    025        /**
    026         * The result of running JUnit on {@code type}
    027         */
    028        public static PrintableResult testResult(Class<?> type) {
    029            return testResult(Request.aClass(type));
    030        }
    031
    032        /**
    033         * The result of running JUnit on Request {@code request}
    034         */
    035        public static PrintableResult testResult(Request request) {
    036            return new PrintableResult(new JUnitCore().run(request));
    037        }
    038
    039        /**
    040         * A result that includes the given {@code failures}
    041         */
    042        public PrintableResult(List<Failure> failures) {
    043            this(new FailureList(failures).result());
    044        }
    045
    046        private PrintableResult(Result result) {
    047            this.result = result;
    048        }
    049
    050        /**
    051         * Returns the number of failures in this result.
    052         */
    053        public int failureCount() {
    054            return result.getFailures().size();
    055        }
    056
    057        /**
    058         * Returns the failures in this result.
    059         *
    060         * @since 4.13
    061         */
    062        public List<Failure> failures() {
    063            return result.getFailures();
    064        }
    065
    066        @Override
    067        public String toString() {
    068            ByteArrayOutputStream stream = new ByteArrayOutputStream();
    069            new TextListener(new PrintStream(stream)).testRunFinished(result);
    070            return stream.toString();
    071        }
    072    }