package junit.extensions;

import junit.framework.*;

/**
 * A TestCase that expects an Exception of class fExpected to be thrown.
 * The other way to check that an expected exception is thrown is:
 * <pre>
 * try {
 *   shouldThrow();
 * }
 * catch (SpecialException e) {
 *   return;
 * }
 * fail("Expected SpecialException");
 * </pre>
 *
 * To use ExceptionTestCase, create a TestCase like:
 * <pre>
 * new ExceptionTestCase("testShouldThrow", SpecialException.class);
 * </pre>
 */
public class ExceptionTestCase extends TestCase {
    Class fExpected;

    public ExceptionTestCase(String name, Class exception) {
        super(name);
        fExpected= exception;
    }
    /**
     * Execute the test method expecting that an Exception of
     * class fExpected or one of its subclasses will be thrown
     */
    protected void runTest() throws Throwable {
        try {
            super.runTest();
        }
        catch (Exception e) {
            if (fExpected.isAssignableFrom(e.getClass()))
                return;
            else
                throw e;
        }
        fail("Expected exception " + fExpected);
    }
}
