package cucumber.runtime.gosu; import cucumber.runtime.JdkPatternArgumentMatcher; import cucumber.runtime.ParameterInfo; import cucumber.runtime.StepDefinition; import gherkin.I18n; import gherkin.formatter.Argument; import gherkin.formatter.model.Step; import gw.lang.function.AbstractBlock; import gw.lang.reflect.IType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class GosuStepDefinition implements StepDefinition { private final Pattern pattern; private final StackTraceElement location; private final AbstractBlock block; private final JdkPatternArgumentMatcher argumentMatcher; private final List<ParameterInfo> parameterInfos; public GosuStepDefinition(Pattern pattern, AbstractBlock block, StackTraceElement location) { this.block = block; this.pattern = pattern; this.location = location; this.argumentMatcher = new JdkPatternArgumentMatcher(pattern); this.parameterInfos = getParameterInfos(); } private List<ParameterInfo> getParameterInfos() { IType[] parameterTypes = block.getFunctionType().getParameterTypes(); List<ParameterInfo> result = new ArrayList<ParameterInfo>(parameterTypes.length); for (IType parameterType : parameterTypes) { // TODO: Can we get more info from the parameterType? result.add(new ParameterInfo(String.class, null, null, null)); } return result; } @Override public List<Argument> matchedArguments(Step step) { return argumentMatcher.argumentsFrom(step.getName()); } @Override public String getLocation(boolean detail) { return location.getFileName() + ":" + location.getLineNumber(); } @Override public Integer getParameterCount() { return parameterInfos.size(); } @Override public ParameterInfo getParameterType(int n, Type argumentType) { return parameterInfos.get(n); } @Override public void execute(I18n i18n, Object[] args) throws Throwable { // TODO: Add timeout block.invokeWithArgs(args); } @Override public boolean isDefinedAt(StackTraceElement stackTraceElement) { return location.getFileName().equals(stackTraceElement.getFileName()); } @Override public String getPattern() { return pattern.pattern(); } @Override public boolean isScenarioScoped() { return false; } }