diff options
Diffstat (limited to 'src/main/java/junitparams/internal/ParameterisedFrameworkMethod.java')
-rw-r--r-- | src/main/java/junitparams/internal/ParameterisedFrameworkMethod.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/main/java/junitparams/internal/ParameterisedFrameworkMethod.java b/src/main/java/junitparams/internal/ParameterisedFrameworkMethod.java new file mode 100644 index 0000000..f593f4f --- /dev/null +++ b/src/main/java/junitparams/internal/ParameterisedFrameworkMethod.java @@ -0,0 +1,85 @@ +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(); + } + } +} |