package org.junit.experimental.results;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;

import org.junit.internal.TextListener;
import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

/**
 * A test result that prints nicely in error messages.
 * This is only intended to be used in JUnit self-tests.
 * For example:
 *
 * <pre>
 *    assertThat(testResult(HasExpectedException.class), isSuccessful());
 * </pre>
 */
public class PrintableResult {
    private Result result;

    /**
     * The result of running JUnit on {@code type}
     */
    public static PrintableResult testResult(Class<?> type) {
        return testResult(Request.aClass(type));
    }

    /**
     * The result of running JUnit on Request {@code request}
     */
    public static PrintableResult testResult(Request request) {
        return new PrintableResult(new JUnitCore().run(request));
    }

    /**
     * A result that includes the given {@code failures}
     */
    public PrintableResult(List<Failure> failures) {
        this(new FailureList(failures).result());
    }

    private PrintableResult(Result result) {
        this.result = result;
    }

    /**
     * Returns the number of failures in this result.
     */
    public int failureCount() {
        return result.getFailures().size();
    }

    /**
     * Returns the failures in this result.
     *
     * @since 4.13
     */
    public List<Failure> failures() {
        return result.getFailures();
    }

    @Override
    public String toString() {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        new TextListener(new PrintStream(stream)).testRunFinished(result);
        return stream.toString();
    }
}