package net.sf.jsptest.assertion; import net.sf.jsptest.HtmlTestCase; import junit.framework.AssertionFailedError; /** * @author Lasse Koskela */ public abstract class ExpectedAssertionFailure { private HtmlTestCase testcase; /** * Override this method to perform a test that should fail with an exception. */ protected abstract void run() throws Exception; /** * @param testcase * The <tt>HtmlTestCase</tt> that serves as the context for this operation. */ public ExpectedAssertionFailure(HtmlTestCase testcase) throws Exception { this(testcase, "Operation should've failed but it didn't."); } /** * @param testcase * The <tt>HtmlTestCase</tt> that serves as the context for this operation. * @param message * The message to display if the specified operation doesn't throw an * AssertionFailedError. */ public ExpectedAssertionFailure(HtmlTestCase testcase, String message) throws Exception { this.testcase = testcase; verify(message); } /** * Gives access to a <tt>PageAssertion</tt> object, enabling page-oriented (HTML) assertions. */ protected PageAssertion page() { return testcase.page(); } /** * Gives access to an <tt>OutputAssertion</tt> object, enabling raw output-oriented * assertions. */ protected OutputAssertion output() { return testcase.output(); } /** * Gives access to an <tt>ElementAssertion</tt> object for the HTML element identified by the * given XPath expression. * * @param xpath * @return */ protected ElementAssertion element(String xpath) { return testcase.element(xpath); } private void verify(String message) { try { run(); throw new NoExceptionWasThrown(); } catch (AssertionFailedError expected) { // everything went according to the plan! } catch (NoExceptionWasThrown e) { throw new AssertionFailedError(message); } catch (Throwable e) { throw new IncorrectExceptionError("A non-assertion exception was thrown: " + e.getClass().getName(), e); } } /** * Thrown from an assertion method indicating that the wrong kind of exception was thrown by the * code under test. * * @author Lasse Koskela */ public static class IncorrectExceptionError extends RuntimeException { public IncorrectExceptionError(String message, Throwable e) { super(message, e); } } /** * Thrown from an assertion method indicating that no exception was thrown by the code under * test against the expectations. This class is only used internally and is never passed to * client code (test written by a JspTest user). * * @author Lasse Koskela */ private static class NoExceptionWasThrown extends Exception { } }