All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
cucumber.runtime.Runtime Maven / Gradle / Ivy
package cucumber.runtime;
import cucumber.api.StepDefinitionReporter;
import cucumber.api.SummaryPrinter;
import cucumber.api.event.TestRunFinished;
import cucumber.runner.EventBus;
import cucumber.runner.Runner;
import cucumber.runner.TimeService;
import cucumber.runtime.io.ResourceLoader;
import cucumber.runtime.model.CucumberFeature;
import cucumber.runtime.xstream.LocalizedXStreams;
import gherkin.events.PickleEvent;
import gherkin.pickles.Compiler;
import gherkin.pickles.Pickle;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* This is the main entry point for running Cucumber features.
*/
public class Runtime {
final Stats stats; // package private to be avaiable for tests.
private final UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker();
private final RuntimeOptions runtimeOptions;
private final ResourceLoader resourceLoader;
private final ClassLoader classLoader;
private final Runner runner;
private final List filters;
private final EventBus bus;
private final Compiler compiler = new Compiler();
public Runtime(ResourceLoader resourceLoader, ClassFinder classFinder, ClassLoader classLoader, RuntimeOptions runtimeOptions) {
this(resourceLoader, classLoader, loadBackends(resourceLoader, classFinder), runtimeOptions);
}
public Runtime(ResourceLoader resourceLoader, ClassLoader classLoader, Collection extends Backend> backends, RuntimeOptions runtimeOptions) {
this(resourceLoader, classLoader, backends, runtimeOptions, TimeService.SYSTEM, null);
}
public Runtime(ResourceLoader resourceLoader, ClassLoader classLoader, Collection extends Backend> backends,
RuntimeOptions runtimeOptions, Glue optionalGlue) {
this(resourceLoader, classLoader, backends, runtimeOptions, TimeService.SYSTEM, optionalGlue);
}
public Runtime(ResourceLoader resourceLoader, ClassLoader classLoader, Collection extends Backend> backends,
RuntimeOptions runtimeOptions, TimeService stopWatch, Glue optionalGlue) {
if (backends.isEmpty()) {
throw new CucumberException("No backends were found. Please make sure you have a backend module on your CLASSPATH.");
}
this.resourceLoader = resourceLoader;
this.classLoader = classLoader;
this.runtimeOptions = runtimeOptions;
final Glue glue;
glue = optionalGlue == null ? new RuntimeGlue(new LocalizedXStreams(classLoader)) : optionalGlue;
this.stats = new Stats(runtimeOptions.isMonochrome());
this.bus = new EventBus(stopWatch);
this.runner = new Runner(glue, bus, backends, runtimeOptions);
this.filters = new ArrayList();
List tagFilters = runtimeOptions.getTagFilters();
if (!tagFilters.isEmpty()) {
this.filters.add(new TagPredicate(tagFilters));
}
List nameFilters = runtimeOptions.getNameFilters();
if (!nameFilters.isEmpty()) {
this.filters.add(new NamePredicate(nameFilters));
}
Map> lineFilters = runtimeOptions.getLineFilters(resourceLoader);
if (!lineFilters.isEmpty()) {
this.filters.add(new LinePredicate(lineFilters));
}
stats.setEventPublisher(bus);
undefinedStepsTracker.setEventPublisher(bus);
runtimeOptions.setEventBus(bus);
}
private static Collection extends Backend> loadBackends(ResourceLoader resourceLoader, ClassFinder classFinder) {
Reflections reflections = new Reflections(classFinder);
return reflections.instantiateSubclasses(Backend.class, "cucumber.runtime", new Class[]{ResourceLoader.class}, new Object[]{resourceLoader});
}
/**
* This is the main entry point. Used from CLI, but not from JUnit.
*/
public void run() throws IOException {
// Make sure all features parse before initialising any reporters/formatters
List features = runtimeOptions.cucumberFeatures(resourceLoader, bus);
// TODO: This is duplicated in cucumber.api.android.CucumberInstrumentationCore - refactor or keep uptodate
StepDefinitionReporter stepDefinitionReporter = runtimeOptions.stepDefinitionReporter(classLoader);
reportStepDefinitions(stepDefinitionReporter);
for (CucumberFeature cucumberFeature : features) {
runFeature(cucumberFeature);
}
bus.send(new TestRunFinished(bus.getTime()));
printSummary();
}
public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) {
runner.reportStepDefinitions(stepDefinitionReporter);
}
public void runFeature(CucumberFeature feature) {
List pickleEvents = compileFeature(feature);
for (PickleEvent pickleEvent : pickleEvents) {
if (matchesFilters(pickleEvent)) {
runner.runPickle(pickleEvent);
}
}
}
public List compileFeature(CucumberFeature feature) {
List pickleEvents = new ArrayList();
for (Pickle pickle : compiler.compile(feature.getGherkinFeature())) {
pickleEvents.add(new PickleEvent(feature.getUri(), pickle));
}
return pickleEvents;
}
public boolean matchesFilters(PickleEvent pickleEvent) {
for (PicklePredicate filter : filters) {
if (!filter.apply(pickleEvent)) {
return false;
}
}
return true;
}
public void printSummary() {
SummaryPrinter summaryPrinter = runtimeOptions.summaryPrinter(classLoader);
summaryPrinter.print(this);
}
void printStats(PrintStream out) {
stats.printStats(out, runtimeOptions.isStrict());
}
public List getErrors() {
return stats.getErrors();
}
public byte exitStatus() {
return stats.exitStatus(runtimeOptions.isStrict());
}
public List getSnippets() {
return undefinedStepsTracker.getSnippets();
}
public Glue getGlue() {
return runner.getGlue();
}
public EventBus getEventBus() {
return bus;
}
public Runner getRunner() {
return runner;
}
}