/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.utils;
import java.lang.reflect.Method;
import java.sql.SQLException;
import org.h2.message.DbException;
/**
* Helper class to simplify negative testing. Usage:
* <pre>
* new AssertThrows() { public void test() {
* Integer.parseInt("not a number");
* }};
* </pre>
*/
public abstract class AssertThrows {
/**
* Create a new assertion object, and call the test method to verify the
* expected exception is thrown.
*
* @param expectedExceptionClass the expected exception class
*/
public AssertThrows(final Class<? extends Exception> expectedExceptionClass) {
this(new ResultVerifier() {
public boolean verify(Object returnValue, Throwable t, Method m, Object... args) {
if (t == null) {
throw new AssertionError("Expected an exception of type " +
expectedExceptionClass.getSimpleName() +
" to be thrown, but the method returned successfully");
}
if (!expectedExceptionClass.isAssignableFrom(t.getClass())) {
AssertionError ae = new AssertionError(
"Expected an exception of type\n" +
expectedExceptionClass.getSimpleName() +
" to be thrown, but the method under test threw an exception of type\n" +
t.getClass().getSimpleName() +
" (see in the 'Caused by' for the exception that was thrown)");
ae.initCause(t);
throw ae;
}
return false;
}
});
}
/**
* Create a new assertion object, and call the test method to verify the
* expected exception is thrown.
*/
public AssertThrows() {
this(new ResultVerifier() {
public boolean verify(Object returnValue, Throwable t, Method m, Object... args) {
if (t != null) {
throw new AssertionError(
"Expected an exception to be thrown, but the method returned successfully");
}
// all exceptions are fine
return false;
}
});
}
/**
* Create a new assertion object, and call the test method to verify the
* expected exception is thrown.
*
* @param expectedErrorCode the error code of the exception
*/
public AssertThrows(final int expectedErrorCode) {
this(new ResultVerifier() {
public boolean verify(Object returnValue, Throwable t, Method m, Object... args) {
int errorCode;
if (t instanceof DbException) {
errorCode = ((DbException) t).getErrorCode();
} else if (t instanceof SQLException) {
errorCode = ((SQLException) t).getErrorCode();
} else {
errorCode = 0;
}
if (errorCode != expectedErrorCode) {
AssertionError ae = new AssertionError(
"Expected an SQLException or DbException with error code " +
expectedErrorCode);
ae.initCause(t);
throw ae;
}
return false;
}
});
}
private AssertThrows(ResultVerifier verifier) {
try {
test();
verifier.verify(null, null, null);
} catch (Exception e) {
verifier.verify(null, e, null);
}
}
/**
* The test method that is called.
*
* @throws Exception the exception
*/
public abstract void test() throws Exception;
}