package junit.framework;

import java.io.PrintWriter;
import java.io.StringWriter;


/**
 * A <code>TestFailure</code> collects a failed test together with
 * the caught exception.
 * @see TestResult
 */
public class TestFailure extends Object {
    protected Test fFailedTest;
    protected Throwable fThrownException;


    /**
     * Constructs a TestFailure with the given test and exception.
     */
    public TestFailure(Test failedTest, Throwable thrownException) {
        fFailedTest= failedTest;
        fThrownException= thrownException;
    }
    /**
     * Gets the failed test.
     */
    public Test failedTest() {
        return fFailedTest;
    }
    /**
     * Gets the thrown exception.
     */
    public Throwable thrownException() {
        return fThrownException;
    }
    /**
     * Returns a short description of the failure.
     */
    public String toString() {
        StringBuffer buffer= new StringBuffer();
        buffer.append(fFailedTest+": "+fThrownException.getMessage());
        return buffer.toString();
    }
    public String trace() {
        StringWriter stringWriter= new StringWriter();
        PrintWriter writer= new PrintWriter(stringWriter);
        thrownException().printStackTrace(writer);
        StringBuffer buffer= stringWriter.getBuffer();
        return buffer.toString();
    }
    public String exceptionMessage() {
        return thrownException().getMessage();
    }
    public boolean isFailure() {
        return thrownException() instanceof AssertionFailedError;
    }
}
