package cucumber.runtime.jruby;
import cucumber.api.Scenario;
import cucumber.runtime.HookDefinition;
import gherkin.TagExpression;
import gherkin.formatter.model.Tag;
import org.jruby.RubyObject;
import java.util.Collection;
import java.util.List;
import static java.util.Arrays.asList;
public class JRubyHookDefinition implements HookDefinition {
private final TagExpression tagExpression;
private final RubyObject hookRunner;
private String file;
private Long line;
private final JRubyBackend jRubyBackend;
public JRubyHookDefinition(JRubyBackend jRubyBackend, String[] tagExpressions, RubyObject hookRunner) {
this.jRubyBackend = jRubyBackend;
this.tagExpression = new TagExpression(asList(tagExpressions));
this.hookRunner = hookRunner;
}
@Override
public String getLocation(boolean detail) {
if (file == null) {
List fileAndLine = (List) hookRunner.callMethod("file_and_line").toJava(List.class);
file = (String) fileAndLine.get(0);
line = (Long) fileAndLine.get(1);
}
return file + ":" + line;
}
@Override
public void execute(Scenario scenario) throws Throwable {
jRubyBackend.executeHook(hookRunner, scenario);
}
@Override
public boolean matches(Collection<Tag> tags) {
return tagExpression.evaluate(tags);
}
@Override
public int getOrder() {
return 0;
}
@Override
public boolean isScenarioScoped() {
return false;
}
}