package cucumber.runtime.groovy;
import cucumber.api.Scenario;
import cucumber.runtime.HookDefinition;
import cucumber.runtime.Timeout;
import gherkin.TagExpression;
import gherkin.formatter.model.Tag;
import groovy.lang.Closure;
import java.util.Collection;
public class GroovyHookDefinition implements HookDefinition {
private final TagExpression tagExpression;
private final long timeoutMillis;
private final int order;
private final Closure body;
private final GroovyBackend backend;
private final StackTraceElement location;
public GroovyHookDefinition(
TagExpression tagExpression,
long timeoutMillis,
int order,
Closure body,
StackTraceElement location,
GroovyBackend backend) {
this.tagExpression = tagExpression;
this.timeoutMillis = timeoutMillis;
this.order = order;
this.body = body;
this.location = location;
this.backend = backend;
}
@Override
public String getLocation(boolean detail) {
return location.getFileName() + ":" + location.getLineNumber();
}
@Override
public void execute(final Scenario scenario) throws Throwable {
Timeout.timeout(new Timeout.Callback<Object>() {
@Override
public Object call() throws Throwable {
backend.invoke(body, new Object[]{scenario});
return null;
}
}, timeoutMillis);
}
@Override
public boolean matches(Collection<Tag> tags) {
return tagExpression.evaluate(tags);
}
@Override
public int getOrder() {
return order;
}
@Override
public boolean isScenarioScoped() {
return false;
}
}