package com.squareup.burst;

import java.lang.reflect.Method;
import org.junit.internal.runners.model.ReflectiveCallable;
import org.junit.runners.model.FrameworkMethod;

import static com.squareup.burst.BurstJUnit4.nameWithArguments;
import static com.squareup.burst.Util.checkNotNull;

final class BurstMethod extends FrameworkMethod {
  private final Enum<?>[] methodArgs;

  BurstMethod(Method method, Enum<?>[] methodArgs) {
    super(checkNotNull(method, "method"));
    this.methodArgs = checkNotNull(methodArgs, "methodArgs");
  }

  @Override public Object invokeExplosively(final Object target, Object... params)
      throws Throwable {
    checkNotNull(target, "target");

    ReflectiveCallable callable = new ReflectiveCallable() {
      @Override protected Object runReflectiveCall() throws Throwable {
        return getMethod().invoke(target, methodArgs);
      }
    };
    return callable.run();
  }

  @Override public String getName() {
    return nameWithArguments(super.getName(), methodArgs, getMethod().getParameterAnnotations());
  }
}