package com.squareup.burst;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.junit.runners.ParentRunner;
/**
* Exposes {@link ParentRunner}'s private members.
*/
final class ParentRunnerSpy {
private static final Method getFilteredChildrenMethod;
static {
try {
getFilteredChildrenMethod = ParentRunner.class.getDeclaredMethod("getFilteredChildren");
getFilteredChildrenMethod.setAccessible(true);
} catch (NoSuchMethodException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* Reflectively invokes a {@link ParentRunner}'s getFilteredChildren method. Manipulating this
* list lets us control which tests will be run.
*/
static <T> List<T> getFilteredChildren(ParentRunner<T> parentRunner) {
try {
//noinspection unchecked
return new ArrayList<>((Collection<T>) getFilteredChildrenMethod.invoke(parentRunner));
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to invoke getFilteredChildren()", e);
}
}
private ParentRunnerSpy() {
throw new AssertionError("No instances.");
}
}