package junitparams.internal; import java.lang.reflect.Method; import java.util.Iterator; import java.util.List; import org.junit.runner.Description; import org.junit.runner.manipulation.Filter; import org.junit.runner.manipulation.Filterable; import org.junit.runner.manipulation.NoTestsRemainException; import org.junit.runners.model.FrameworkMethod; /** * A {@link FrameworkMethod} that represents a parameterized method. * * <p>This contains a list of {@link InstanceFrameworkMethod} that represent the individual * instances of this method, one per parameter set. */ public class ParameterisedFrameworkMethod extends DescribableFrameworkMethod implements Filterable { /** * The base description, used as a template when creating {@link Description}. */ private final Description baseDescription; /** * The list of {@link InstanceFrameworkMethod} that represent individual instances of this * method. */ private List<InstanceFrameworkMethod> instanceMethods; /** * The {@link Description}, created lazily and updated after filtering. */ private Description description; public ParameterisedFrameworkMethod(Method method, Description baseDescription, List<InstanceFrameworkMethod> instanceMethods) { super(method); this.baseDescription = baseDescription; this.instanceMethods = instanceMethods; } @Override public Description getDescription() { if (description == null) { description = baseDescription.childlessCopy(); for (InstanceFrameworkMethod instanceMethod : instanceMethods) { description.addChild(instanceMethod.getInstanceDescription()); } } return description; } public List<InstanceFrameworkMethod> getMethods() { return instanceMethods; } @Override public void filter(Filter filter) throws NoTestsRemainException { int count = instanceMethods.size(); for (Iterator<InstanceFrameworkMethod> i = instanceMethods.iterator(); i.hasNext(); ) { InstanceFrameworkMethod instanceMethod = i.next(); if (filter.shouldRun(instanceMethod.getInstanceDescription())) { try { filter.apply(instanceMethod); } catch (NoTestsRemainException e) { i.remove(); } } else { i.remove(); } } if (instanceMethods.size() != count) { // Some instance methods have been filtered out, so invalidate the description. description = null; } if (instanceMethods.isEmpty()) { throw new NoTestsRemainException(); } } }