package org.mockitoutil;

import static org.junit.Assert.assertEquals;

/**
 * Clean asserts for exception handling
 */
public class ThrowableAssert {

    private Throwable reportedException;

    private ThrowableAssert(Runnable runnable) {
        try {
            runnable.run();
        } catch (Throwable t) {
            this.reportedException = t;
            return;
        }
        throw new AssertionError("Expected runnable to throw an exception but it didn't");
    }

    public ThrowableAssert throwsException(Class<? extends Throwable> exceptionType) {
        if(!exceptionType.isInstance(reportedException)) {
            throw new AssertionError("Exception should be of type: "
                    + exceptionType.getSimpleName() + " but it was: "
                    + reportedException.getClass().getSimpleName());
        }
        return this;
    }

    public ThrowableAssert throwsMessage(String exceptionMessage) {
        assertEquals(exceptionMessage, reportedException.getMessage());
        return this;
    }

    /**
     * Executes provided runnable, expects it to throw an exception.
     * Then, it offers ways to assert on the expected exception.
     */
    public static ThrowableAssert assertThat(Runnable runnable) {
        return new ThrowableAssert(runnable);
    }
}
