package junitparams.internal;

import java.lang.reflect.Method;

import org.junit.runner.Description;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.Statement;

/**
 * Encapsulates a {@link Throwable} that was caught during initialization so that it can be
 * thrown during execution in order to preserve previous behavior.
 */
public class DeferredErrorFrameworkMethod extends InvokableFrameworkMethod {

    private final Throwable throwable;

    DeferredErrorFrameworkMethod(Method method, Description description,
            Throwable throwable) {
        super(method, description);
        this.throwable = throwable;
    }

    @Override
    public Statement getInvokeStatement(Object test) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                throw throwable;
            }
        };
    }

    @Override
    public void run(MethodBlockSupplier supplier, RunNotifier notifier) {
        // Do not call the MethodBlockSupplier as that could introduce additional errors, simply
        // throw the encapsulated Throwable immediately.
        runMethodInvoker(notifier, getInvokeStatement(notifier), getDescription());
    }
}
