diff --git a/continuous-deployment/pom.xml b/continuous-deployment/pom.xml index 790a5fa6c4..409ea71397 100644 --- a/continuous-deployment/pom.xml +++ b/continuous-deployment/pom.xml @@ -3,7 +3,7 @@ cucumber-jvm io.cucumber - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT 4.0.0 continuous-deployment diff --git a/core/pom.xml b/core/pom.xml index 4158c1ae05..af341e4287 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-core @@ -97,7 +97,7 @@ - cucumber.api.cli.Main + io.cucumber.core.api.cli.Main diff --git a/core/src/main/java/cucumber/api/SnippetType.java b/core/src/main/java/cucumber/api/SnippetType.java deleted file mode 100644 index 3809e0ab28..0000000000 --- a/core/src/main/java/cucumber/api/SnippetType.java +++ /dev/null @@ -1,33 +0,0 @@ -package cucumber.api; - -import cucumber.runtime.CucumberException; -import cucumber.runtime.snippets.CamelCaseConcatenator; -import cucumber.runtime.snippets.Concatenator; -import cucumber.runtime.snippets.FunctionNameGenerator; -import cucumber.runtime.snippets.UnderscoreConcatenator; - -public enum SnippetType { - UNDERSCORE("underscore", new UnderscoreConcatenator()), - CAMELCASE("camelcase", new CamelCaseConcatenator()); - - private final String name; - private final Concatenator concatenator; - - SnippetType(String name, Concatenator concatenator) { - this.name = name; - this.concatenator = concatenator; - } - - public static SnippetType fromString(String name) { - for (SnippetType snippetType : SnippetType.values()) { - if (name.equalsIgnoreCase(snippetType.name)) { - return snippetType; - } - } - throw new CucumberException(String.format("Unrecognized SnippetType %s", name)); - } - - public FunctionNameGenerator getFunctionNameGenerator() { - return new FunctionNameGenerator(concatenator); - } -} diff --git a/core/src/main/java/cucumber/api/cli/Main.java b/core/src/main/java/cucumber/api/cli/Main.java index c8c79a0d9b..6434192913 100644 --- a/core/src/main/java/cucumber/api/cli/Main.java +++ b/core/src/main/java/cucumber/api/cli/Main.java @@ -1,29 +1,14 @@ package cucumber.api.cli; -import cucumber.runtime.Runtime; - +/** + * @deprecated use {@link io.cucumber.core.api.cli.Main} + */ +@Deprecated public class Main { - public static void main(String[] argv) { - byte exitStatus = run(argv, Thread.currentThread().getContextClassLoader()); - System.exit(exitStatus); - } - - /** - * Launches the Cucumber-JVM command line. - * - * @param argv runtime options. See details in the {@code cucumber.api.cli.Usage.txt} resource. - * @param classLoader classloader used to load the runtime - * @return 0 if execution was successful, 1 if it was not (test failures) - */ - public static byte run(String[] argv, ClassLoader classLoader) { - - final Runtime runtime = Runtime.builder() - .withArgs(argv) - .withClassLoader(classLoader) - .build(); - runtime.run(); - return runtime.exitStatus(); + public static void main(String[] argv) { + System.err.println("You are using deprecated Main method. Please use io.cucumber.core.api.cli.Main"); + io.cucumber.core.api.cli.Main.main(argv); } } diff --git a/core/src/main/java/cucumber/runner/RunnerSupplier.java b/core/src/main/java/cucumber/runner/RunnerSupplier.java deleted file mode 100644 index 8a8a5c2a4b..0000000000 --- a/core/src/main/java/cucumber/runner/RunnerSupplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runner; - -import cucumber.runner.Runner; - -public interface RunnerSupplier { - Runner get(); -} diff --git a/core/src/main/java/cucumber/runner/UndefinedStepException.java b/core/src/main/java/cucumber/runner/UndefinedStepException.java deleted file mode 100644 index 7bcd461aa8..0000000000 --- a/core/src/main/java/cucumber/runner/UndefinedStepException.java +++ /dev/null @@ -1,9 +0,0 @@ -package cucumber.runner; - -import gherkin.pickles.PickleStep; - -final class UndefinedStepException extends Throwable { - public UndefinedStepException(PickleStep step) { - super(String.format("Undefined Step: %s", step.getText())); - } -} diff --git a/core/src/main/java/cucumber/runtime/DefaultTypeRegistryConfiguration.java b/core/src/main/java/cucumber/runtime/DefaultTypeRegistryConfiguration.java deleted file mode 100644 index 731c1c818d..0000000000 --- a/core/src/main/java/cucumber/runtime/DefaultTypeRegistryConfiguration.java +++ /dev/null @@ -1,20 +0,0 @@ -package cucumber.runtime; - -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; - -import java.util.Locale; - -public class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { - - @Override - public Locale locale() { - return Locale.ENGLISH; - } - - @Override - public void configureTypeRegistry(TypeRegistry typeRegistry) { - //noop - } - -} diff --git a/core/src/main/java/cucumber/runtime/ExitStatus.java b/core/src/main/java/cucumber/runtime/ExitStatus.java deleted file mode 100755 index 6514d9fd77..0000000000 --- a/core/src/main/java/cucumber/runtime/ExitStatus.java +++ /dev/null @@ -1,48 +0,0 @@ -package cucumber.runtime; - -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; - -import java.util.ArrayList; -import java.util.List; - -import static cucumber.api.Result.SEVERITY; -import static java.util.Collections.max; -import static java.util.Collections.min; - -public class ExitStatus implements EventListener { - private static final byte DEFAULT = 0x0; - private static final byte ERRORS = 0x1; - - private final List results = new ArrayList(); - private final RuntimeOptions runtimeOptions; - - private final EventHandler testCaseFinishedHandler = new EventHandler() { - @Override - public void receive(TestCaseFinished event) { - results.add(event.result); - } - }; - - public ExitStatus(RuntimeOptions runtimeOptions) { - this.runtimeOptions = runtimeOptions; - } - - @Override - public void setEventPublisher(EventPublisher publisher) { - publisher.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); - } - - public byte exitStatus() { - if (results.isEmpty()) { return DEFAULT; } - - if (runtimeOptions.isWip()) { - return min(results, SEVERITY).is(Result.Type.PASSED) ? ERRORS : DEFAULT; - } - - return max(results, SEVERITY).isOk(runtimeOptions.isStrict()) ? DEFAULT : ERRORS; - } -} diff --git a/core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java deleted file mode 100644 index fab1995f0b..0000000000 --- a/core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java +++ /dev/null @@ -1,24 +0,0 @@ -package cucumber.runtime; - -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureLoader; - -import java.util.List; - -/** - * Supplies a list of features found on the the feature path provided to RuntimeOptions. - */ -public class FeaturePathFeatureSupplier implements FeatureSupplier { - private final FeatureLoader featureLoader; - private final RuntimeOptions runtimeOptions; - - public FeaturePathFeatureSupplier(FeatureLoader featureLoader, RuntimeOptions runtimeOptions) { - this.featureLoader = featureLoader; - this.runtimeOptions = runtimeOptions; - } - - @Override - public List get() { - return featureLoader.load(runtimeOptions.getFeaturePaths(), System.out); - } -} diff --git a/core/src/main/java/cucumber/runtime/GlueSupplier.java b/core/src/main/java/cucumber/runtime/GlueSupplier.java deleted file mode 100644 index 623fb5f47f..0000000000 --- a/core/src/main/java/cucumber/runtime/GlueSupplier.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.runtime; - -public interface GlueSupplier { - Glue get(); -} diff --git a/core/src/main/java/cucumber/runtime/Supplier.java b/core/src/main/java/cucumber/runtime/Supplier.java deleted file mode 100644 index 7ee00439ae..0000000000 --- a/core/src/main/java/cucumber/runtime/Supplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runtime; - -public interface Supplier { - - T get(); - -} diff --git a/core/src/main/java/cucumber/runtime/Timeout.java b/core/src/main/java/cucumber/runtime/Timeout.java deleted file mode 100644 index 2bc310edfc..0000000000 --- a/core/src/main/java/cucumber/runtime/Timeout.java +++ /dev/null @@ -1,63 +0,0 @@ -package cucumber.runtime; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; - -public class Timeout { - private Timeout() { - } - - public static T timeout(Callback callback, long timeoutMillis) throws Throwable { - if (timeoutMillis == 0) { - return callback.call(); - } - - /* We need to ensure a happens before relation exists between these events; - * a. the timer setting the interrupt flag on the execution thread. - * b. terminating and cleaning up the timer - * To do this we synchronize on monitor. The atomic boolean is merely a convenient container. - */ - final Thread executionThread = Thread.currentThread(); - final Object monitor = new Object(); - final AtomicBoolean done = new AtomicBoolean(); - - ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - ScheduledFuture timer = executorService.schedule(new Runnable() { - @Override - public void run() { - synchronized (monitor) { - if (!done.get()) { - executionThread.interrupt(); - } - } - } - }, timeoutMillis, TimeUnit.MILLISECONDS); - - try { - T result = callback.call(); - // The callback may have been busy waiting. - if (Thread.interrupted()) { - throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); - } - return result; - } catch (InterruptedException timeout) { - throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); - } finally { - synchronized (monitor) { - done.set(true); - timer.cancel(true); - executorService.shutdownNow(); - // Clear the interrupted flag. It may have been set by the timer just before we returned the result. - Thread.interrupted(); - } - } - } - - public interface Callback { - T call() throws Throwable; - } -} diff --git a/core/src/main/java/cucumber/runtime/TooManyInstancesException.java b/core/src/main/java/cucumber/runtime/TooManyInstancesException.java deleted file mode 100644 index 1a07646558..0000000000 --- a/core/src/main/java/cucumber/runtime/TooManyInstancesException.java +++ /dev/null @@ -1,14 +0,0 @@ -package cucumber.runtime; - -import java.util.Collection; - -public class TooManyInstancesException extends CucumberException { - - TooManyInstancesException(Collection instances) { - super(createMessage(instances)); - } - - private static String createMessage(Collection instances) { - return String.format("Expected only one instance, but found too many: " + instances); - } -} diff --git a/core/src/main/java/cucumber/runtime/Utils.java b/core/src/main/java/cucumber/runtime/Utils.java deleted file mode 100644 index 33f998204a..0000000000 --- a/core/src/main/java/cucumber/runtime/Utils.java +++ /dev/null @@ -1,104 +0,0 @@ -package cucumber.runtime; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.net.URL; - -public class Utils { - private Utils() { - } - - public static boolean isInstantiable(Class clazz) { - boolean isNonStaticInnerClass = !Modifier.isStatic(clazz.getModifiers()) && clazz.getEnclosingClass() != null; - return Modifier.isPublic(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()) && !isNonStaticInnerClass; - } - - public static Object invoke(final Object target, final Method method, long timeoutMillis, final Object... args) throws Throwable { - final Method targetMethod = targetMethod(target, method); - return Timeout.timeout(new Timeout.Callback() { - @Override - public Object call() throws Throwable { - boolean accessible = targetMethod.isAccessible(); - try { - targetMethod.setAccessible(true); - return targetMethod.invoke(target, args); - } catch (IllegalArgumentException e) { - throw new CucumberException("Failed to invoke " + MethodFormat.FULL.format(targetMethod) + - ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); - } catch (InvocationTargetException e) { - throw e.getTargetException(); - } catch (IllegalAccessException e) { - throw new CucumberException("Failed to invoke " + MethodFormat.FULL.format(targetMethod) + - ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); - } finally { - targetMethod.setAccessible(accessible); - } - } - }, timeoutMillis); - } - - private static Method targetMethod(final Object target, final Method method) throws NoSuchMethodException { - final Class targetClass = target.getClass(); - final Class declaringClass = method.getDeclaringClass(); - - // Immediately return the provided method if the class loaders are the same. - if (targetClass.getClassLoader().equals(declaringClass.getClassLoader())) { - return method; - } else { - // Check if the method is publicly accessible. Note that methods from interfaces are always public. - if (Modifier.isPublic(method.getModifiers())) { - return targetClass.getMethod(method.getName(), method.getParameterTypes()); - } - - // Loop through all the super classes until the declared method is found. - Class currentClass = targetClass; - while (currentClass != Object.class) { - try { - return currentClass.getDeclaredMethod(method.getName(), method.getParameterTypes()); - } catch (NoSuchMethodException e) { - currentClass = currentClass.getSuperclass(); - } - } - - // The method does not exist in the class hierarchy. - throw new NoSuchMethodException(String.valueOf(method)); - } - } - - public static URL toURL(String pathOrUrl) { - try { - if (!pathOrUrl.endsWith("/")) { - pathOrUrl = pathOrUrl + "/"; - } - if (pathOrUrl.matches("^(file|http|https):.*")) { - return new URL(pathOrUrl); - } else { - return new URL("file:" + pathOrUrl); - } - } catch (MalformedURLException e) { - throw new CucumberException("Bad URL:" + pathOrUrl, e); - } - } - - public static String htmlEscape(String s) { - // https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet - return s - .replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace("\"", """) - .replace("'", "'") - .replace("/", "/"); - } - - public static String getUniqueTestNameForScenarioExample(String testCaseName, int exampleNumber) { - return testCaseName + (includesBlank(testCaseName) ? " " : "_") + exampleNumber; - } - - private static boolean includesBlank(String testCaseName) { - return testCaseName.indexOf(' ') != -1; - } - -} \ No newline at end of file diff --git a/core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java b/core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java deleted file mode 100644 index e68683fd3d..0000000000 --- a/core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java +++ /dev/null @@ -1,95 +0,0 @@ -package cucumber.runtime.autocomplete; - -import gherkin.deps.com.google.gson.Gson; -import gherkin.deps.com.google.gson.GsonBuilder; - -import java.util.ArrayList; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class MetaStepdef { - private static final Gson GSON = new GsonBuilder().create(); - - public final SortedSet steps = new TreeSet(); - public String source; - public String flags; - private transient Pattern pattern; - - public boolean matches(String text) { - Pattern p = pattern(); - Matcher m = p.matcher(text); - return m.matches() || m.hitEnd(); - } - - private Pattern pattern() { - if (pattern == null) { - pattern = Pattern.compile(source); - } - return pattern; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MetaStepdef that = (MetaStepdef) o; - - if (!flags.equals(that.flags)) return false; - if (!source.equals(that.source)) return false; - if (!steps.equals(that.steps)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = steps.hashCode(); - result = 31 * result + source.hashCode(); - result = 31 * result + flags.hashCode(); - return result; - } - - @Override - public String toString() { - return GSON.toJson(this); - } - - public static class MetaStep implements Comparable { - public String name; - public final List args = new ArrayList(); - - @Override - public int compareTo(MetaStep other) { - return name.compareTo(other.name); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MetaStep metaStep = (MetaStep) o; - - if (!args.equals(metaStep.args)) return false; - if (!name.equals(metaStep.name)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = name.hashCode(); - result = 31 * result + args.hashCode(); - return result; - } - } - - public static class MetaArgument { - public int offset; - public String val; - } -} diff --git a/core/src/main/java/cucumber/runtime/filter/Filters.java b/core/src/main/java/cucumber/runtime/filter/Filters.java deleted file mode 100644 index da9a8b2885..0000000000 --- a/core/src/main/java/cucumber/runtime/filter/Filters.java +++ /dev/null @@ -1,57 +0,0 @@ -package cucumber.runtime.filter; - -import cucumber.runtime.RuntimeOptions; -import gherkin.events.PickleEvent; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -public class Filters { - - private final List filters; - private final RuntimeOptions runtimeOptions; - private final RerunFilters rerunFilters; - - public Filters(RuntimeOptions runtimeOptions, RerunFilters rerunFilters) { - this.runtimeOptions = runtimeOptions; - this.rerunFilters = rerunFilters; - - filters = new ArrayList(); - List tagFilters = this.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(); - Map> rerunlineFilters = rerunFilters.processRerunFiles(); - for (Map.Entry> line: rerunlineFilters.entrySet()) { - addLineFilters(lineFilters, line.getKey(), line.getValue()); - } - if (!lineFilters.isEmpty()) { - this.filters.add(new LinePredicate(lineFilters)); - } - } - - public boolean matchesFilters(PickleEvent pickleEvent) { - for (PicklePredicate filter : filters) { - if (!filter.apply(pickleEvent)) { - return false; - } - } - return true; - } - - private void addLineFilters(Map> parsedLineFilters, String key, List lines) { - if (parsedLineFilters.containsKey(key)) { - parsedLineFilters.get(key).addAll(lines); - } else { - parsedLineFilters.put(key, lines); - } - } - -} diff --git a/core/src/main/java/cucumber/runtime/filter/RerunFilters.java b/core/src/main/java/cucumber/runtime/filter/RerunFilters.java deleted file mode 100644 index c8cc769caa..0000000000 --- a/core/src/main/java/cucumber/runtime/filter/RerunFilters.java +++ /dev/null @@ -1,42 +0,0 @@ -package cucumber.runtime.filter; - -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.model.FeatureLoader; -import cucumber.runtime.model.PathWithLines; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class RerunFilters { - private final RuntimeOptions runtimeOptions; - private final FeatureLoader featureLoader; - - public RerunFilters(RuntimeOptions runtimeOptions, FeatureLoader featureLoader) { - this.runtimeOptions = runtimeOptions; - this.featureLoader = featureLoader; - } - - - Map> processRerunFiles() { - final Map> lineFilters = new HashMap>(); - for (String featurePath : runtimeOptions.getFeaturePaths()) { - if (featurePath.startsWith("@")) { - for (PathWithLines pathWithLines : featureLoader.loadRerunFile(featurePath.substring(1))) { - addLineFilters(lineFilters, pathWithLines.path, pathWithLines.lines); - } - } - } - return lineFilters; - } - - private void addLineFilters(Map> parsedLineFilters, String key, List lines) { - if (parsedLineFilters.containsKey(key)) { - parsedLineFilters.get(key).addAll(lines); - } else { - parsedLineFilters.put(key, lines); - } - } - - -} diff --git a/core/src/main/java/cucumber/runtime/formatter/NullSummaryPrinter.java b/core/src/main/java/cucumber/runtime/formatter/NullSummaryPrinter.java deleted file mode 100644 index 856639ea02..0000000000 --- a/core/src/main/java/cucumber/runtime/formatter/NullSummaryPrinter.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.runtime.formatter; - -import cucumber.api.SummaryPrinter; - -class NullSummaryPrinter implements SummaryPrinter { - - @SuppressWarnings("WeakerAccess") // Used by PluginFactory - public NullSummaryPrinter(){ - - } - -} diff --git a/core/src/main/java/cucumber/runtime/formatter/Plugins.java b/core/src/main/java/cucumber/runtime/formatter/Plugins.java deleted file mode 100644 index b0c3bc6cca..0000000000 --- a/core/src/main/java/cucumber/runtime/formatter/Plugins.java +++ /dev/null @@ -1,145 +0,0 @@ -package cucumber.runtime.formatter; - -import cucumber.api.Plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; -import cucumber.runner.CanonicalOrderEventPublisher; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.Utils; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.ArrayList; -import java.util.List; - -public final class Plugins { - private final List plugins; - private final ClassLoader classLoader; - private boolean pluginNamesInstantiated; - - private final PluginFactory pluginFactory; - private final EventPublisher eventPublisher; - private final EventPublisher orderedEventPublisher; - private final RuntimeOptions runtimeOptions; - - public Plugins(ClassLoader classLoader, PluginFactory pluginFactory, EventPublisher eventPublisher, RuntimeOptions runtimeOptions) { - this.classLoader = classLoader; - this.pluginFactory = pluginFactory; - this.eventPublisher = eventPublisher; - this.orderedEventPublisher = createCanonicalOrderEventPublisher(); - this.runtimeOptions = runtimeOptions; - this.plugins = createPlugins(); - } - - private EventPublisher createCanonicalOrderEventPublisher() { - final CanonicalOrderEventPublisher canonicalOrderEventPublisher = new CanonicalOrderEventPublisher(); - this.eventPublisher.registerHandlerFor(Event.class, new EventHandler() { - @Override - public void receive(Event event) { - canonicalOrderEventPublisher.handle(event); - } - }); - return canonicalOrderEventPublisher; - } - - private List createPlugins() { - List plugins = new ArrayList(); - if (!pluginNamesInstantiated) { - for (String pluginName : runtimeOptions.getPluginFormatterNames()) { - Plugin plugin = pluginFactory.create(pluginName); - addPlugin(plugins, plugin); - } - for (String pluginName : runtimeOptions.getPluginStepDefinitionReporterNames()) { - Plugin plugin = pluginFactory.create(pluginName); - addPlugin(plugins, plugin); - } - for (String pluginName : runtimeOptions.getPluginSummaryPrinterNames()) { - Plugin plugin = pluginFactory.create(pluginName); - addPlugin(plugins, plugin); - } - pluginNamesInstantiated = true; - } - return plugins; - } - - public List getPlugins() { - return plugins; - } - - public StepDefinitionReporter stepDefinitionReporter() { - return pluginProxy(StepDefinitionReporter.class); - } - - public void addPlugin(Plugin plugin) { - addPlugin(plugins, plugin); - } - - private void addPlugin(List plugins, Plugin plugin) { - plugins.add(plugin); - setMonochromeOnColorAwarePlugins(plugin); - setStrictOnStrictAwarePlugins(plugin); - setEventBusOnEventListenerPlugins(plugin); - } - - private void setMonochromeOnColorAwarePlugins(Plugin plugin) { - if (plugin instanceof ColorAware) { - ColorAware colorAware = (ColorAware) plugin; - colorAware.setMonochrome(runtimeOptions.isMonochrome()); - } - } - - private void setStrictOnStrictAwarePlugins(Plugin plugin) { - if (plugin instanceof StrictAware) { - StrictAware strictAware = (StrictAware) plugin; - strictAware.setStrict(runtimeOptions.isStrict()); - } - } - - private void setEventBusOnEventListenerPlugins(Plugin plugin) { - if (plugin instanceof ConcurrentEventListener) { - ConcurrentEventListener formatter = (ConcurrentEventListener) plugin; - formatter.setEventPublisher(eventPublisher); - } else if (plugin instanceof EventListener) { - EventListener formatter = (EventListener) plugin; - formatter.setEventPublisher(orderedEventPublisher); - } - } - - /** - * Creates a dynamic proxy that multiplexes method invocations to all plugins of the same type. - * - * @param type proxy type - * @param generic proxy type - * @return a proxy - */ - private T pluginProxy(final Class type) { - Object proxy = Proxy.newProxyInstance(classLoader, new Class[]{type}, new InvocationHandler() { - @Override - public Object invoke(Object target, Method method, Object[] args) throws Throwable { - for (Object plugin : getPlugins()) { - if (type.isInstance(plugin)) { - try { - Utils.invoke(plugin, method, 0, args); - } catch (Throwable t) { - if (!method.getName().equals("startOfScenarioLifeCycle") && !method.getName().equals("endOfScenarioLifeCycle")) { - // IntelliJ has its own formatter which doesn't yet implement these methods. - throw t; - } - } - } - } - return null; - } - }); - return type.cast(proxy); - } - - -} diff --git a/core/src/main/java/cucumber/runtime/io/UTF8OutputStreamWriter.java b/core/src/main/java/cucumber/runtime/io/UTF8OutputStreamWriter.java deleted file mode 100644 index 4c638a3fb1..0000000000 --- a/core/src/main/java/cucumber/runtime/io/UTF8OutputStreamWriter.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.runtime.io; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.nio.charset.Charset; - -public class UTF8OutputStreamWriter extends OutputStreamWriter { - public UTF8OutputStreamWriter(OutputStream out) throws IOException { - super(out, Charset.forName("UTF-8")); - } -} diff --git a/core/src/main/java/cucumber/runtime/snippets/CamelCaseConcatenator.java b/core/src/main/java/cucumber/runtime/snippets/CamelCaseConcatenator.java deleted file mode 100644 index e05e031e4c..0000000000 --- a/core/src/main/java/cucumber/runtime/snippets/CamelCaseConcatenator.java +++ /dev/null @@ -1,22 +0,0 @@ -package cucumber.runtime.snippets; - -public class CamelCaseConcatenator implements Concatenator { - @Override - public String concatenate(String[] words) { - StringBuilder functionName = new StringBuilder(); - boolean firstWord = true; - for (String word : words) { - if (firstWord) { - functionName.append(word.toLowerCase()); - firstWord = false; - } else { - functionName.append(capitalize(word)); - } - } - return functionName.toString(); - } - - private String capitalize(String line) { - return Character.toUpperCase(line.charAt(0)) + line.substring(1); - } -} diff --git a/core/src/main/java/cucumber/runtime/snippets/Concatenator.java b/core/src/main/java/cucumber/runtime/snippets/Concatenator.java deleted file mode 100644 index d086e406b7..0000000000 --- a/core/src/main/java/cucumber/runtime/snippets/Concatenator.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.runtime.snippets; - -public interface Concatenator { - String concatenate(String[] words); -} diff --git a/core/src/main/java/cucumber/runtime/snippets/FunctionNameGenerator.java b/core/src/main/java/cucumber/runtime/snippets/FunctionNameGenerator.java deleted file mode 100644 index 7a4e77f7a5..0000000000 --- a/core/src/main/java/cucumber/runtime/snippets/FunctionNameGenerator.java +++ /dev/null @@ -1,35 +0,0 @@ -package cucumber.runtime.snippets; - -public class FunctionNameGenerator { - private static final Character SUBST = ' '; - private final Concatenator concatenator; - - public FunctionNameGenerator(Concatenator concatenator) { - this.concatenator = concatenator; - } - - public String generateFunctionName(String sentence) { - - sentence = removeIllegalCharacters(sentence); - sentence = sentence.trim(); - String[] words = sentence.split("\\s"); - - return concatenator.concatenate(words); - } - - private String removeIllegalCharacters(String sentence) { - if (sentence.isEmpty()) { - throw new IllegalArgumentException("Cannot create function name from empty sentence"); - } - StringBuilder sanitized = new StringBuilder(); - sanitized.append(Character.isJavaIdentifierStart(sentence.charAt(0)) ? sentence.charAt(0) : SUBST); - for (int i = 1; i < sentence.length(); i++) { - if (Character.isJavaIdentifierPart(sentence.charAt(i))) { - sanitized.append(sentence.charAt(i)); - } else if (sanitized.charAt(sanitized.length() - 1) != SUBST && i != sentence.length() - 1) { - sanitized.append(SUBST); - } - } - return sanitized.toString(); - } -} diff --git a/core/src/main/java/cucumber/runtime/snippets/UnderscoreConcatenator.java b/core/src/main/java/cucumber/runtime/snippets/UnderscoreConcatenator.java deleted file mode 100644 index 30dfc8ad4e..0000000000 --- a/core/src/main/java/cucumber/runtime/snippets/UnderscoreConcatenator.java +++ /dev/null @@ -1,19 +0,0 @@ -package cucumber.runtime.snippets; - -public class UnderscoreConcatenator implements Concatenator { - @Override - public String concatenate(String[] words) { - StringBuilder functionName = new StringBuilder(); - boolean firstWord = true; - for (String word : words) { - if (firstWord) { - word = word.toLowerCase(); - } else { - functionName.append('_'); - } - functionName.append(word); - firstWord = false; - } - return functionName.toString(); - } -} diff --git a/core/src/main/java/cucumber/api/Scenario.java b/core/src/main/java/io/cucumber/core/api/Scenario.java similarity index 96% rename from core/src/main/java/cucumber/api/Scenario.java rename to core/src/main/java/io/cucumber/core/api/Scenario.java index 0d6226cb97..47cc5d4926 100644 --- a/core/src/main/java/cucumber/api/Scenario.java +++ b/core/src/main/java/io/cucumber/core/api/Scenario.java @@ -1,4 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api; + +import io.cucumber.core.api.event.Result; import java.util.Collection; import java.util.List; diff --git a/core/src/main/java/cucumber/api/TypeRegistry.java b/core/src/main/java/io/cucumber/core/api/TypeRegistry.java similarity index 97% rename from core/src/main/java/cucumber/api/TypeRegistry.java rename to core/src/main/java/io/cucumber/core/api/TypeRegistry.java index b72ba1ce69..c61709e49a 100644 --- a/core/src/main/java/cucumber/api/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistry.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTableType; diff --git a/core/src/main/java/cucumber/api/TypeRegistryConfigurer.java b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java similarity index 83% rename from core/src/main/java/cucumber/api/TypeRegistryConfigurer.java rename to core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java index 865ce7331a..cd90a71bd9 100644 --- a/core/src/main/java/cucumber/api/TypeRegistryConfigurer.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api; import java.util.Locale; diff --git a/core/src/main/java/io/cucumber/core/api/cli/Main.java b/core/src/main/java/io/cucumber/core/api/cli/Main.java new file mode 100644 index 0000000000..2da085d7a2 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/api/cli/Main.java @@ -0,0 +1,29 @@ +package io.cucumber.core.api.cli; + +import io.cucumber.core.runtime.Runtime; + +public final class Main { + + public static void main(String[] argv) { + byte exitStatus = run(argv, Thread.currentThread().getContextClassLoader()); + System.exit(exitStatus); + } + + /** + * Launches the Cucumber-JVM command line. + * + * @param argv runtime options. See details in the {@code cucumber.api.cucumber.api.cli.Usage.txt} resource. + * @param classLoader classloader used to load the runtime + * @return 0 if execution was successful, 1 if it was not (test failures) + */ + public static byte run(String[] argv, ClassLoader classLoader) { + + final Runtime runtime = Runtime.builder() + .withArgs(argv) + .withClassLoader(classLoader) + .build(); + + runtime.run(); + return runtime.exitStatus(); + } +} diff --git a/core/src/main/java/cucumber/api/Argument.java b/core/src/main/java/io/cucumber/core/api/event/Argument.java similarity index 91% rename from core/src/main/java/cucumber/api/Argument.java rename to core/src/main/java/io/cucumber/core/api/event/Argument.java index 13906ace1f..bc3f1ea623 100644 --- a/core/src/main/java/cucumber/api/Argument.java +++ b/core/src/main/java/io/cucumber/core/api/event/Argument.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; /** * Represents an argument in for a step definition. diff --git a/core/src/main/java/cucumber/api/event/CanonicalEventOrder.java b/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java similarity index 98% rename from core/src/main/java/cucumber/api/event/CanonicalEventOrder.java rename to core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java index f960b7cd4b..998fd70d9a 100644 --- a/core/src/main/java/cucumber/api/event/CanonicalEventOrder.java +++ b/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; import java.util.Comparator; import java.util.List; diff --git a/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java b/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java similarity index 82% rename from core/src/main/java/cucumber/api/event/ConcurrentEventListener.java rename to core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java index 3da8faf1d1..616e24b9ca 100644 --- a/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java @@ -1,11 +1,11 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; -import cucumber.api.Plugin; +import io.cucumber.core.api.plugin.Plugin; /** * When cucumber executes test in parallel or in a framework * that supports parallel execution (e.g. JUnit or TestNG) - * {@link cucumber.api.TestCase} events from different + * {@link TestCase} events from different * pickles may interleave. *

* This interface marks an {@link EventListener} as capable of @@ -30,7 +30,7 @@ public interface ConcurrentEventListener extends Plugin { /** - * Set the event publisher. The formatter can register event listeners with the publisher. + * Set the event publisher. The plugin can register event listeners with the publisher. * * @param publisher the event publisher */ diff --git a/core/src/main/java/cucumber/api/event/EmbedEvent.java b/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java similarity index 84% rename from core/src/main/java/cucumber/api/event/EmbedEvent.java rename to core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java index 97204c48c6..8a6b080504 100644 --- a/core/src/main/java/cucumber/api/event/EmbedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class EmbedEvent extends TestCaseEvent { public final byte[] data; diff --git a/core/src/main/java/cucumber/api/event/Event.java b/core/src/main/java/io/cucumber/core/api/event/Event.java similarity index 95% rename from core/src/main/java/cucumber/api/event/Event.java rename to core/src/main/java/io/cucumber/core/api/event/Event.java index b5c88f2208..6e3d00d0e2 100644 --- a/core/src/main/java/cucumber/api/event/Event.java +++ b/core/src/main/java/io/cucumber/core/api/event/Event.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; import java.util.Comparator; diff --git a/core/src/main/java/cucumber/api/event/EventHandler.java b/core/src/main/java/io/cucumber/core/api/event/EventHandler.java similarity index 69% rename from core/src/main/java/cucumber/api/event/EventHandler.java rename to core/src/main/java/io/cucumber/core/api/event/EventHandler.java index ed4d2ff334..ae514f4ff6 100644 --- a/core/src/main/java/cucumber/api/event/EventHandler.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventHandler.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public interface EventHandler { diff --git a/core/src/main/java/cucumber/api/event/EventListener.java b/core/src/main/java/io/cucumber/core/api/event/EventListener.java similarity index 82% rename from core/src/main/java/cucumber/api/event/EventListener.java rename to core/src/main/java/io/cucumber/core/api/event/EventListener.java index f14e070ff2..2b027d738c 100644 --- a/core/src/main/java/cucumber/api/event/EventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventListener.java @@ -1,6 +1,6 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; -import cucumber.api.Plugin; +import io.cucumber.core.api.plugin.Plugin; /** * This is the interface you should implement if your plugin listens to cucumber execution events diff --git a/core/src/main/java/cucumber/api/event/EventPublisher.java b/core/src/main/java/io/cucumber/core/api/event/EventPublisher.java similarity index 98% rename from core/src/main/java/cucumber/api/event/EventPublisher.java rename to core/src/main/java/io/cucumber/core/api/event/EventPublisher.java index d14ad16e47..0c002de9e8 100644 --- a/core/src/main/java/cucumber/api/event/EventPublisher.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventPublisher.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public interface EventPublisher { diff --git a/core/src/main/java/cucumber/api/HookTestStep.java b/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java similarity index 51% rename from core/src/main/java/cucumber/api/HookTestStep.java rename to core/src/main/java/io/cucumber/core/api/event/HookTestStep.java index c014c498ac..579833c5e8 100644 --- a/core/src/main/java/cucumber/api/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java @@ -1,11 +1,16 @@ -package cucumber.api; +package io.cucumber.core.api.event; + +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestStep; /** * Hooks are invoked before and after each scenario and before and * after each gherkin step in a scenario. * - * @see cucumber.api.event.TestCaseStarted - * @see cucumber.api.event.TestCaseFinished + * @see TestCaseStarted + * @see TestCaseFinished */ public interface HookTestStep extends TestStep { diff --git a/core/src/main/java/cucumber/api/HookType.java b/core/src/main/java/io/cucumber/core/api/event/HookType.java similarity index 82% rename from core/src/main/java/cucumber/api/HookType.java rename to core/src/main/java/io/cucumber/core/api/event/HookType.java index acd0923678..5c11fda48b 100644 --- a/core/src/main/java/cucumber/api/HookType.java +++ b/core/src/main/java/io/cucumber/core/api/event/HookType.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; public enum HookType { Before, After, BeforeStep, AfterStep; diff --git a/core/src/main/java/cucumber/api/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java similarity index 97% rename from core/src/main/java/cucumber/api/PickleStepTestStep.java rename to core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java index 3ad92d4d17..9659331868 100644 --- a/core/src/main/java/cucumber/api/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; import java.util.List; diff --git a/core/src/main/java/cucumber/api/Result.java b/core/src/main/java/io/cucumber/core/api/event/Result.java similarity index 98% rename from core/src/main/java/cucumber/api/Result.java rename to core/src/main/java/io/cucumber/core/api/event/Result.java index 7c65ac36c7..1093f4a6ab 100644 --- a/core/src/main/java/cucumber/api/Result.java +++ b/core/src/main/java/io/cucumber/core/api/event/Result.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/core/src/main/java/cucumber/api/event/SnippetsSuggestedEvent.java b/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java similarity index 94% rename from core/src/main/java/cucumber/api/event/SnippetsSuggestedEvent.java rename to core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java index d5cc0d8a31..2d7c9554fe 100644 --- a/core/src/main/java/cucumber/api/event/SnippetsSuggestedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; import gherkin.pickles.PickleLocation; diff --git a/core/src/main/java/cucumber/api/TestCase.java b/core/src/main/java/io/cucumber/core/api/event/TestCase.java similarity index 87% rename from core/src/main/java/cucumber/api/TestCase.java rename to core/src/main/java/io/cucumber/core/api/event/TestCase.java index 90fcce0bcb..a25bd827b3 100644 --- a/core/src/main/java/cucumber/api/TestCase.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCase.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/cucumber/api/event/TestCaseEvent.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java similarity index 82% rename from core/src/main/java/cucumber/api/event/TestCaseEvent.java rename to core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java index 5454791a80..a187eab55f 100644 --- a/core/src/main/java/cucumber/api/event/TestCaseEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public abstract class TestCaseEvent extends TimeStampedEvent { diff --git a/core/src/main/java/cucumber/api/event/TestCaseFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java similarity index 78% rename from core/src/main/java/cucumber/api/event/TestCaseFinished.java rename to core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java index 1925f5f07a..6c9e8cf9b2 100644 --- a/core/src/main/java/cucumber/api/event/TestCaseFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java @@ -1,7 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.Result; -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class TestCaseFinished extends TestCaseEvent { public final Result result; diff --git a/core/src/main/java/cucumber/api/event/TestCaseStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java similarity index 80% rename from core/src/main/java/cucumber/api/event/TestCaseStarted.java rename to core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java index 8931d46156..151df6d18c 100644 --- a/core/src/main/java/cucumber/api/event/TestCaseStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class TestCaseStarted extends TestCaseEvent { public final TestCase testCase; diff --git a/core/src/main/java/cucumber/api/event/TestRunFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java similarity index 79% rename from core/src/main/java/cucumber/api/event/TestRunFinished.java rename to core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java index bff272433b..9a76474578 100644 --- a/core/src/main/java/cucumber/api/event/TestRunFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public final class TestRunFinished extends TimeStampedEvent { diff --git a/core/src/main/java/cucumber/api/event/TestRunStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java similarity index 79% rename from core/src/main/java/cucumber/api/event/TestRunStarted.java rename to core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java index 1dc1453a2b..49158b15a8 100644 --- a/core/src/main/java/cucumber/api/event/TestRunStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public final class TestRunStarted extends TimeStampedEvent { diff --git a/core/src/main/java/cucumber/api/event/TestSourceRead.java b/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java similarity index 88% rename from core/src/main/java/cucumber/api/event/TestSourceRead.java rename to core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java index 56e85650c9..c5ea11eff3 100644 --- a/core/src/main/java/cucumber/api/event/TestSourceRead.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public final class TestSourceRead extends TimeStampedEvent { public final String uri; diff --git a/core/src/main/java/cucumber/api/TestStep.java b/core/src/main/java/io/cucumber/core/api/event/TestStep.java similarity index 64% rename from core/src/main/java/cucumber/api/TestStep.java rename to core/src/main/java/io/cucumber/core/api/event/TestStep.java index fcd3eb05e1..af57497b06 100644 --- a/core/src/main/java/cucumber/api/TestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStep.java @@ -1,11 +1,14 @@ -package cucumber.api; +package io.cucumber.core.api.event; + +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; /** * A test step can either represent the execution of a hook * or a pickle step. Each step is tied to some glue code. * - * @see cucumber.api.event.TestCaseStarted - * @see cucumber.api.event.TestCaseFinished + * @see TestCaseStarted + * @see TestCaseFinished */ public interface TestStep { diff --git a/core/src/main/java/cucumber/api/event/TestStepFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java similarity index 82% rename from core/src/main/java/cucumber/api/event/TestStepFinished.java rename to core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java index 7c132771eb..cae97cd152 100644 --- a/core/src/main/java/cucumber/api/event/TestStepFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java @@ -1,10 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.HookTestStep; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; +package io.cucumber.core.api.event; /** * A test step finished event is broadcast when ever a step finishes. diff --git a/core/src/main/java/cucumber/api/event/TestStepStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java similarity index 83% rename from core/src/main/java/cucumber/api/event/TestStepStarted.java rename to core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java index 1748f3669e..d180ba9e31 100644 --- a/core/src/main/java/cucumber/api/event/TestStepStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java @@ -1,9 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.HookTestStep; -import cucumber.api.PickleStepTestStep; -import cucumber.api.TestCase; -import cucumber.api.TestStep; +package io.cucumber.core.api.event; /** * A test step started event is broadcast when ever a step starts. diff --git a/core/src/main/java/cucumber/api/event/TimeStampedEvent.java b/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java similarity index 87% rename from core/src/main/java/cucumber/api/event/TimeStampedEvent.java rename to core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java index 576a69a7bb..26ecdd1197 100644 --- a/core/src/main/java/cucumber/api/event/TimeStampedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; abstract class TimeStampedEvent implements Event { private final Long timeStamp; diff --git a/core/src/main/java/cucumber/api/event/WriteEvent.java b/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java similarity index 79% rename from core/src/main/java/cucumber/api/event/WriteEvent.java rename to core/src/main/java/io/cucumber/core/api/event/WriteEvent.java index 9ddc693650..2be0df6878 100644 --- a/core/src/main/java/cucumber/api/event/WriteEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class WriteEvent extends TestCaseEvent { public final String text; diff --git a/core/src/main/java/cucumber/api/CucumberOptions.java b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java similarity index 94% rename from core/src/main/java/cucumber/api/CucumberOptions.java rename to core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java index ac0b57e4c4..e22c425b07 100644 --- a/core/src/main/java/cucumber/api/CucumberOptions.java +++ b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java @@ -1,4 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api.options; + +import io.cucumber.core.api.cli.Main; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,7 +8,7 @@ import java.lang.annotation.Target; /** - * This annotation provides the same options as the cucumber command line, {@link cucumber.api.cli.Main}. + * This annotation provides the same options as the cucumber command line, {@link Main}. */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) diff --git a/core/src/main/java/io/cucumber/core/api/options/SnippetType.java b/core/src/main/java/io/cucumber/core/api/options/SnippetType.java new file mode 100644 index 0000000000..c17f3fcb0c --- /dev/null +++ b/core/src/main/java/io/cucumber/core/api/options/SnippetType.java @@ -0,0 +1,105 @@ +package io.cucumber.core.api.options; + +public enum SnippetType { + UNDERSCORE("underscore", new UnderscoreJoiner()), + CAMELCASE("camelcase", new CamelCaseJoiner()); + + private final String name; + private final Joiner joiner; + + SnippetType(String name, Joiner joiner) { + this.name = name; + this.joiner = joiner; + } + + public static SnippetType fromString(String name) { + for (SnippetType snippetType : SnippetType.values()) { + if (name.equalsIgnoreCase(snippetType.name)) { + return snippetType; + } + } + throw new IllegalArgumentException(String.format("Unrecognized SnippetType %s", name)); + } + + public FunctionNameGenerator getFunctionNameGenerator() { + return new FunctionNameGenerator(joiner); + } + + private static final class CamelCaseJoiner implements Joiner { + + @Override + public String concatenate(String[] words) { + StringBuilder functionName = new StringBuilder(); + boolean firstWord = true; + for (String word : words) { + if (firstWord) { + functionName.append(word.toLowerCase()); + firstWord = false; + } else { + functionName.append(capitalize(word)); + } + } + return functionName.toString(); + } + + private String capitalize(String line) { + return Character.toUpperCase(line.charAt(0)) + line.substring(1); + } + } + + private static class UnderscoreJoiner implements Joiner { + @Override + public String concatenate(String[] words) { + StringBuilder functionName = new StringBuilder(); + boolean firstWord = true; + for (String word : words) { + if (firstWord) { + word = word.toLowerCase(); + } else { + functionName.append('_'); + } + functionName.append(word); + firstWord = false; + } + return functionName.toString(); + } + } + + private interface Joiner { + String concatenate(String[] words); + } + + public static final class FunctionNameGenerator { + private static final Character SUBST = ' '; + private final Joiner joiner; + + private FunctionNameGenerator(Joiner joiner) { + this.joiner = joiner; + } + + public String generateFunctionName(String sentence) { + + sentence = removeIllegalCharacters(sentence); + sentence = sentence.trim(); + String[] words = sentence.split("\\s"); + + return joiner.concatenate(words); + } + + private String removeIllegalCharacters(String sentence) { + if (sentence.isEmpty()) { + throw new IllegalArgumentException("Cannot create function name from empty sentence"); + } + StringBuilder sanitized = new StringBuilder(); + sanitized.append(Character.isJavaIdentifierStart(sentence.charAt(0)) ? sentence.charAt(0) : SUBST); + for (int i = 1; i < sentence.length(); i++) { + if (Character.isJavaIdentifierPart(sentence.charAt(i))) { + sanitized.append(sentence.charAt(i)); + } else if (sanitized.charAt(sanitized.length() - 1) != SUBST && i != sentence.length() - 1) { + sanitized.append(SUBST); + } + } + return sanitized.toString(); + } + } +} diff --git a/core/src/main/java/cucumber/api/formatter/ColorAware.java b/core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java similarity index 87% rename from core/src/main/java/cucumber/api/formatter/ColorAware.java rename to core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java index 1bbce1521c..642a1c7905 100644 --- a/core/src/main/java/cucumber/api/formatter/ColorAware.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java @@ -1,6 +1,4 @@ -package cucumber.api.formatter; - -import cucumber.api.Plugin; +package io.cucumber.core.api.plugin; /** * Interface for Plugins that use ANSI escape codes to print coloured output. diff --git a/core/src/main/java/cucumber/api/formatter/Formatter.java b/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java similarity index 72% rename from core/src/main/java/cucumber/api/formatter/Formatter.java rename to core/src/main/java/io/cucumber/core/api/plugin/Formatter.java index 4bc2389f2c..d8fecd4033 100644 --- a/core/src/main/java/cucumber/api/formatter/Formatter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java @@ -1,7 +1,6 @@ -package cucumber.api.formatter; +package io.cucumber.core.api.plugin; -import cucumber.api.Plugin; -import cucumber.api.event.EventListener; +import io.cucumber.core.api.event.EventListener; /** * @deprecated as of version 4.0.0; use {@link EventListener } and {@link Plugin } instead. diff --git a/core/src/main/java/cucumber/api/Plugin.java b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java similarity index 66% rename from core/src/main/java/cucumber/api/Plugin.java rename to core/src/main/java/io/cucumber/core/api/plugin/Plugin.java index e566927a1f..467a04e23e 100644 --- a/core/src/main/java/cucumber/api/Plugin.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java @@ -1,4 +1,8 @@ -package cucumber.api; +package io.cucumber.core.api.plugin; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventListener; import java.io.File; import java.net.URI; @@ -25,12 +29,12 @@ *

* Plugins may also implement one of these interfaces: *

    - *
  • {@link cucumber.api.formatter.ColorAware}
  • - *
  • {@link cucumber.api.formatter.StrictAware}
  • - *
  • {@link cucumber.api.event.EventListener}
  • - *
  • {@link cucumber.api.event.ConcurrentEventListener}
  • - *
  • {@link cucumber.api.StepDefinitionReporter}
  • - *
  • {@link cucumber.api.SummaryPrinter}
  • + *
  • {@link ColorAware}
  • + *
  • {@link StrictAware}
  • + *
  • {@link EventListener}
  • + *
  • {@link ConcurrentEventListener}
  • + *
  • {@link StepDefinitionReporter}
  • + *
  • {@link SummaryPrinter}
  • *
*/ public interface Plugin { diff --git a/core/src/main/java/cucumber/api/StepDefinitionReporter.java b/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java similarity index 64% rename from core/src/main/java/cucumber/api/StepDefinitionReporter.java rename to core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java index 81c317c57f..7552aecb63 100644 --- a/core/src/main/java/cucumber/api/StepDefinitionReporter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java @@ -1,6 +1,7 @@ -package cucumber.api; +package io.cucumber.core.api.plugin; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.backend.StepDefinition; public interface StepDefinitionReporter extends Plugin { /** diff --git a/core/src/main/java/cucumber/api/formatter/StrictAware.java b/core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java similarity index 84% rename from core/src/main/java/cucumber/api/formatter/StrictAware.java rename to core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java index 6faa35efdc..6955552df3 100755 --- a/core/src/main/java/cucumber/api/formatter/StrictAware.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java @@ -1,6 +1,4 @@ -package cucumber.api.formatter; - -import cucumber.api.Plugin; +package io.cucumber.core.api.plugin; /** * Interface for Plugins that need to know if the Runtime is strict. diff --git a/core/src/main/java/cucumber/api/SummaryPrinter.java b/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java similarity index 64% rename from core/src/main/java/cucumber/api/SummaryPrinter.java rename to core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java index a5ba643673..8e0576c708 100644 --- a/core/src/main/java/cucumber/api/SummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java @@ -1,4 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api.plugin; + +import io.cucumber.core.api.plugin.Plugin; /** * Interface for plugins that print a summary after test execution. diff --git a/core/src/main/java/cucumber/runtime/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java similarity index 71% rename from core/src/main/java/cucumber/runtime/Backend.java rename to core/src/main/java/io/cucumber/core/backend/Backend.java index 91dc41668b..23020b3278 100644 --- a/core/src/main/java/cucumber/runtime/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.api.options.SnippetType; import gherkin.pickles.PickleStep; import java.util.List; @@ -22,5 +22,5 @@ public interface Backend { */ void disposeWorld(); - List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator); + List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator); } diff --git a/core/src/main/java/cucumber/runtime/BackendSupplier.java b/core/src/main/java/io/cucumber/core/backend/BackendSupplier.java similarity index 76% rename from core/src/main/java/cucumber/runtime/BackendSupplier.java rename to core/src/main/java/io/cucumber/core/backend/BackendSupplier.java index 59506410ef..a4fbb4672d 100644 --- a/core/src/main/java/cucumber/runtime/BackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/backend/BackendSupplier.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.backend; import java.util.Collection; diff --git a/core/src/main/java/cucumber/runtime/DuplicateStepDefinitionException.java b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java similarity index 66% rename from core/src/main/java/cucumber/runtime/DuplicateStepDefinitionException.java rename to core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java index f62890b807..c2346b1f7f 100644 --- a/core/src/main/java/cucumber/runtime/DuplicateStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java @@ -1,6 +1,8 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -public class DuplicateStepDefinitionException extends CucumberException { +import io.cucumber.core.exception.CucumberException; + +public final class DuplicateStepDefinitionException extends CucumberException { public DuplicateStepDefinitionException(StepDefinition a, StepDefinition b) { super(createMessage(a, b)); } diff --git a/core/src/main/java/cucumber/runtime/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java similarity index 85% rename from core/src/main/java/cucumber/runtime/Glue.java rename to core/src/main/java/io/cucumber/core/backend/Glue.java index f8db770287..a85631e10f 100644 --- a/core/src/main/java/cucumber/runtime/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.backend; public interface Glue { @@ -12,5 +12,4 @@ public interface Glue { void addAfterStepHook(HookDefinition hookDefinition); - void removeScenarioScopedGlue(); } diff --git a/core/src/main/java/cucumber/runtime/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java similarity index 89% rename from core/src/main/java/cucumber/runtime/HookDefinition.java rename to core/src/main/java/io/cucumber/core/backend/HookDefinition.java index 02683bb746..4570a9c043 100644 --- a/core/src/main/java/cucumber/runtime/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleTag; import java.util.Collection; diff --git a/core/src/main/java/cucumber/api/Pending.java b/core/src/main/java/io/cucumber/core/backend/Pending.java similarity index 90% rename from core/src/main/java/cucumber/api/Pending.java rename to core/src/main/java/io/cucumber/core/backend/Pending.java index c8460c5298..cba5693a47 100644 --- a/core/src/main/java/cucumber/api/Pending.java +++ b/core/src/main/java/io/cucumber/core/backend/Pending.java @@ -1,4 +1,5 @@ -package cucumber.api; +package io.cucumber.core.backend; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -9,8 +10,6 @@ * Any exception class annotated with this annotation will be treated as a "pending" exception. * That is - if the exception is thrown from a step definition or hook, the scenario's status will * be pending instead of failed. - * - * @see PendingException */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/core/src/main/java/cucumber/runtime/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java similarity index 94% rename from core/src/main/java/cucumber/runtime/StepDefinition.java rename to core/src/main/java/io/cucumber/core/backend/StepDefinition.java index f2aeb19237..beff2262b9 100644 --- a/core/src/main/java/cucumber/runtime/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/StepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java similarity index 72% rename from core/src/main/java/cucumber/runtime/StepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java index 30435a9e74..c9a04f08dc 100644 --- a/core/src/main/java/cucumber/runtime/StepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; public interface StepDefinitionMatch { void runStep(Scenario scenario) throws Throwable; diff --git a/core/src/main/java/cucumber/runner/AbstractEventBus.java b/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java similarity index 53% rename from core/src/main/java/cucumber/runner/AbstractEventBus.java rename to core/src/main/java/io/cucumber/core/event/AbstractEventBus.java index 391b2285e7..6d163cbb9f 100644 --- a/core/src/main/java/cucumber/runner/AbstractEventBus.java +++ b/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.event; -import cucumber.api.event.Event; +import io.cucumber.core.api.event.Event; -abstract class AbstractEventBus extends AbstractEventPublisher implements EventBus { +public abstract class AbstractEventBus extends AbstractEventPublisher implements EventBus { @Override public void send(Event event) { diff --git a/core/src/main/java/cucumber/runner/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java similarity index 86% rename from core/src/main/java/cucumber/runner/AbstractEventPublisher.java rename to core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java index f3661b6ebb..e231cea99d 100644 --- a/core/src/main/java/cucumber/runner/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java @@ -1,15 +1,15 @@ -package cucumber.runner; +package io.cucumber.core.event; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -class AbstractEventPublisher implements EventPublisher { +public abstract class AbstractEventPublisher implements EventPublisher { protected Map, List> handlers = new HashMap, List>(); @Override diff --git a/core/src/main/java/cucumber/runner/EventBus.java b/core/src/main/java/io/cucumber/core/event/EventBus.java similarity index 54% rename from core/src/main/java/cucumber/runner/EventBus.java rename to core/src/main/java/io/cucumber/core/event/EventBus.java index 859e8aae98..f0ae9765c9 100644 --- a/core/src/main/java/cucumber/runner/EventBus.java +++ b/core/src/main/java/io/cucumber/core/event/EventBus.java @@ -1,7 +1,7 @@ -package cucumber.runner; +package io.cucumber.core.event; -import cucumber.api.event.Event; -import cucumber.api.event.EventPublisher; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventPublisher; public interface EventBus extends EventPublisher { diff --git a/core/src/main/java/cucumber/runtime/CucumberException.java b/core/src/main/java/io/cucumber/core/exception/CucumberException.java similarity index 89% rename from core/src/main/java/cucumber/runtime/CucumberException.java rename to core/src/main/java/io/cucumber/core/exception/CucumberException.java index 4ce81aa33a..07e58a1957 100644 --- a/core/src/main/java/cucumber/runtime/CucumberException.java +++ b/core/src/main/java/io/cucumber/core/exception/CucumberException.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.exception; public class CucumberException extends RuntimeException { public CucumberException(String message) { diff --git a/core/src/main/java/io/cucumber/core/filter/Filters.java b/core/src/main/java/io/cucumber/core/filter/Filters.java new file mode 100644 index 0000000000..ba4bfed509 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/filter/Filters.java @@ -0,0 +1,39 @@ +package io.cucumber.core.filter; + +import gherkin.events.PickleEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public final class Filters { + + private final List filters; + + public Filters(Options options) { + filters = new ArrayList<>(); + List tagFilters = options.getTagFilters(); + if (!tagFilters.isEmpty()) { + this.filters.add(new TagPredicate(tagFilters)); + } + List nameFilters = options.getNameFilters(); + if (!nameFilters.isEmpty()) { + this.filters.add(new NamePredicate(nameFilters)); + } + Map> lineFilters = options.getLineFilters(); + if (!lineFilters.isEmpty()) { + this.filters.add(new LinePredicate(lineFilters)); + } + } + + public boolean matchesFilters(PickleEvent pickleEvent) { + for (PicklePredicate filter : filters) { + if (!filter.apply(pickleEvent)) { + return false; + } + } + return true; + } + +} diff --git a/core/src/main/java/cucumber/runtime/filter/LinePredicate.java b/core/src/main/java/io/cucumber/core/filter/LinePredicate.java similarity index 89% rename from core/src/main/java/cucumber/runtime/filter/LinePredicate.java rename to core/src/main/java/io/cucumber/core/filter/LinePredicate.java index 44f57d4b5b..aea92371ff 100644 --- a/core/src/main/java/cucumber/runtime/filter/LinePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/LinePredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -class LinePredicate implements PicklePredicate { +final class LinePredicate implements PicklePredicate { private Map> lineFilters; LinePredicate(Map> lineFilters) { diff --git a/core/src/main/java/cucumber/runtime/filter/NamePredicate.java b/core/src/main/java/io/cucumber/core/filter/NamePredicate.java similarity index 85% rename from core/src/main/java/cucumber/runtime/filter/NamePredicate.java rename to core/src/main/java/io/cucumber/core/filter/NamePredicate.java index b69ca5577d..37c1aff1ac 100644 --- a/core/src/main/java/cucumber/runtime/filter/NamePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/NamePredicate.java @@ -1,11 +1,11 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import java.util.List; import java.util.regex.Pattern; -class NamePredicate implements PicklePredicate { +final class NamePredicate implements PicklePredicate { private List patterns; NamePredicate(List patterns) { diff --git a/core/src/main/java/io/cucumber/core/filter/Options.java b/core/src/main/java/io/cucumber/core/filter/Options.java new file mode 100644 index 0000000000..7b44cc257a --- /dev/null +++ b/core/src/main/java/io/cucumber/core/filter/Options.java @@ -0,0 +1,13 @@ +package io.cucumber.core.filter; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public interface Options { + List getTagFilters(); + + List getNameFilters(); + + Map> getLineFilters(); +} diff --git a/core/src/main/java/cucumber/runtime/filter/PicklePredicate.java b/core/src/main/java/io/cucumber/core/filter/PicklePredicate.java similarity index 77% rename from core/src/main/java/cucumber/runtime/filter/PicklePredicate.java rename to core/src/main/java/io/cucumber/core/filter/PicklePredicate.java index e4c2a362df..0319fe9a16 100644 --- a/core/src/main/java/cucumber/runtime/filter/PicklePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/PicklePredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; diff --git a/core/src/main/java/cucumber/runtime/filter/TagExpressionOld.java b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java similarity index 98% rename from core/src/main/java/cucumber/runtime/filter/TagExpressionOld.java rename to core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java index e527b986ce..2372c15bc2 100644 --- a/core/src/main/java/cucumber/runtime/filter/TagExpressionOld.java +++ b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.pickles.PickleTag; @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -class TagExpressionOld { +final class TagExpressionOld { private final Map limits = new HashMap(); private And and = new And(); diff --git a/core/src/main/java/cucumber/runtime/filter/TagPredicate.java b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java similarity index 94% rename from core/src/main/java/cucumber/runtime/filter/TagPredicate.java rename to core/src/main/java/io/cucumber/core/filter/TagPredicate.java index 9f1bcfe7e2..3e00268fc3 100644 --- a/core/src/main/java/cucumber/runtime/filter/TagPredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.PickleTag; @@ -12,7 +12,7 @@ import static java.util.Arrays.asList; -public class TagPredicate implements PicklePredicate { +public final class TagPredicate implements PicklePredicate { private final List expressions = new ArrayList(); private final List oldStyleExpressions = new ArrayList(); diff --git a/core/src/main/java/cucumber/runtime/ClassFinder.java b/core/src/main/java/io/cucumber/core/io/ClassFinder.java similarity index 89% rename from core/src/main/java/cucumber/runtime/ClassFinder.java rename to core/src/main/java/io/cucumber/core/io/ClassFinder.java index 7e2da8036e..bf7bd3972d 100644 --- a/core/src/main/java/cucumber/runtime/ClassFinder.java +++ b/core/src/main/java/io/cucumber/core/io/ClassFinder.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.io; import java.util.Collection; diff --git a/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java similarity index 78% rename from core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java rename to core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java index 77c6133f1f..08f9f6575d 100644 --- a/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java @@ -1,15 +1,13 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URL; -import java.net.URLDecoder; import java.util.Enumeration; import java.util.Iterator; -public class ClasspathResourceIterable implements Iterable { +final class ClasspathResourceIterable implements Iterable { private final ResourceIteratorFactory resourceIteratorFactory = new DelegatingResourceIteratorFactory(new ZipThenFileResourceIteratorFactory()); @@ -17,7 +15,7 @@ public class ClasspathResourceIterable implements Iterable { private final String path; private final String suffix; - public ClasspathResourceIterable(ClassLoader classLoader, String path, String suffix) { + ClasspathResourceIterable(ClassLoader classLoader, String path, String suffix) { this.classLoader = classLoader; this.path = path; this.suffix = suffix; diff --git a/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java similarity index 62% rename from core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java rename to core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java index a6843e4b00..0336768082 100644 --- a/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java @@ -1,9 +1,9 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -public class ClasspathResourceLoader implements ResourceLoader { +final class ClasspathResourceLoader implements ResourceLoader { private final ClassLoader classLoader; - public ClasspathResourceLoader(ClassLoader classLoader) { + ClasspathResourceLoader(ClassLoader classLoader) { this.classLoader = classLoader; } diff --git a/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java similarity index 86% rename from core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java index 87a5747062..87046eb698 100644 --- a/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java @@ -1,6 +1,6 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.net.URL; import java.util.Iterator; @@ -11,7 +11,7 @@ * A {@link ResourceIteratorFactory} implementation which delegates to * factories found by the ServiceLoader class. */ -public class DelegatingResourceIteratorFactory implements ResourceIteratorFactory { +final class DelegatingResourceIteratorFactory implements ResourceIteratorFactory { private final Iterable delegates = ServiceLoader.load(ResourceIteratorFactory.class); @@ -24,7 +24,7 @@ public class DelegatingResourceIteratorFactory implements ResourceIteratorFactor * @param fallbackResourceIteratorFactory The factory to use when an * appropriate one couldn't be found otherwise. */ - public DelegatingResourceIteratorFactory(ResourceIteratorFactory fallbackResourceIteratorFactory) { + DelegatingResourceIteratorFactory(ResourceIteratorFactory fallbackResourceIteratorFactory) { this.fallbackResourceIteratorFactory = fallbackResourceIteratorFactory; } diff --git a/core/src/main/java/cucumber/runtime/io/FileResource.java b/core/src/main/java/io/cucumber/core/io/FileResource.java similarity index 86% rename from core/src/main/java/cucumber/runtime/io/FileResource.java rename to core/src/main/java/io/cucumber/core/io/FileResource.java index 4d1494087e..bc5b75578a 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResource.java +++ b/core/src/main/java/io/cucumber/core/io/FileResource.java @@ -1,20 +1,20 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -public class FileResource implements Resource { +final class FileResource implements Resource { private final File root; private final File file; private final boolean classpathFileResource; - public static FileResource createFileResource(File root, File file) { + static FileResource createFileResource(File root, File file) { return new FileResource(root, file, false); } - public static FileResource createClasspathFileResource(File root, File file) { + static FileResource createClasspathFileResource(File root, File file) { return new FileResource(root, file, true); } diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIterable.java b/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java similarity index 69% rename from core/src/main/java/cucumber/runtime/io/FileResourceIterable.java rename to core/src/main/java/io/cucumber/core/io/FileResourceIterable.java index e0cb4ae795..e14a5c0140 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java @@ -1,14 +1,14 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.util.Iterator; -public class FileResourceIterable implements Iterable { +final class FileResourceIterable implements Iterable { private final File root; private final File file; private final String suffix; - public FileResourceIterable(File root, File file, String suffix) { + FileResourceIterable(File root, File file, String suffix) { this.root = root; this.file = file; this.suffix = suffix; diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java b/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java similarity index 88% rename from core/src/main/java/cucumber/runtime/io/FileResourceIterator.java rename to core/src/main/java/io/cucumber/core/io/FileResourceIterator.java index 9a9a650850..79e98640b4 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java @@ -1,20 +1,20 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.io.FileFilter; import java.util.Iterator; -import static cucumber.runtime.io.Helpers.hasSuffix; +import static io.cucumber.core.io.Helpers.hasSuffix; import static java.util.Arrays.asList; -public class FileResourceIterator implements Iterator { +final class FileResourceIterator implements Iterator { private final FlatteningIterator flatteningIterator = new FlatteningIterator(); - public static FileResourceIterator createFileResourceIterator(File root, File file, final String suffix) { + static FileResourceIterator createFileResourceIterator(File root, File file, final String suffix) { return new FileResourceIterator(root, file, suffix, false); } - public static FileResourceIterator createClasspathFileResourceIterator(File root, File file, final String suffix) { + static FileResourceIterator createClasspathFileResourceIterator(File root, File file, final String suffix) { return new FileResourceIterator(root, file, suffix, true); } diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java similarity index 86% rename from core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java index 746a382acf..17835c72b3 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java @@ -1,10 +1,10 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.net.URL; import java.util.Iterator; -import static cucumber.runtime.io.Helpers.filePath; +import static io.cucumber.core.io.Helpers.filePath; /** * Factory which creates {@link FileResourceIterator}s. @@ -16,7 +16,7 @@ * service implementation for {@link ResourceIteratorFactory} as it could * easily hide other service implementations.

*/ -public class FileResourceIteratorFactory implements ResourceIteratorFactory { +final class FileResourceIteratorFactory implements ResourceIteratorFactory { @Override public boolean isFactoryFor(URL url) { diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java b/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java similarity index 70% rename from core/src/main/java/cucumber/runtime/io/FileResourceLoader.java rename to core/src/main/java/io/cucumber/core/io/FileResourceLoader.java index 8785e249e2..9c27e38469 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java @@ -1,8 +1,8 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; -public class FileResourceLoader implements ResourceLoader { +final class FileResourceLoader implements ResourceLoader { @Override public Iterable resources(String path, String suffix) { File root = new File(path); diff --git a/core/src/main/java/cucumber/runtime/io/FlatteningIterator.java b/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java similarity index 94% rename from core/src/main/java/cucumber/runtime/io/FlatteningIterator.java rename to core/src/main/java/io/cucumber/core/io/FlatteningIterator.java index 1ea9c99293..4191f704e1 100644 --- a/core/src/main/java/cucumber/runtime/io/FlatteningIterator.java +++ b/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java @@ -1,11 +1,11 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.util.ArrayDeque; import java.util.Deque; import java.util.Iterator; import java.util.NoSuchElementException; -public class FlatteningIterator implements Iterator { +final class FlatteningIterator implements Iterator { private final Deque> iterators = new ArrayDeque>(); private T next; diff --git a/core/src/main/java/cucumber/runtime/io/Helpers.java b/core/src/main/java/io/cucumber/core/io/Helpers.java similarity index 91% rename from core/src/main/java/cucumber/runtime/io/Helpers.java rename to core/src/main/java/io/cucumber/core/io/Helpers.java index 16c7805cd4..3ae2f00ac6 100644 --- a/core/src/main/java/cucumber/runtime/io/Helpers.java +++ b/core/src/main/java/io/cucumber/core/io/Helpers.java @@ -1,12 +1,12 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; -public class Helpers { +final class Helpers { private Helpers() { } diff --git a/core/src/main/java/cucumber/runtime/io/MultiLoader.java b/core/src/main/java/io/cucumber/core/io/MultiLoader.java similarity index 94% rename from core/src/main/java/cucumber/runtime/io/MultiLoader.java rename to core/src/main/java/io/cucumber/core/io/MultiLoader.java index f4856b471d..538362d627 100644 --- a/core/src/main/java/cucumber/runtime/io/MultiLoader.java +++ b/core/src/main/java/io/cucumber/core/io/MultiLoader.java @@ -1,9 +1,9 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.util.ArrayList; import java.util.List; -public class MultiLoader implements ResourceLoader { +public final class MultiLoader implements ResourceLoader { public static final String CLASSPATH_SCHEME = "classpath:"; private final ClasspathResourceLoader classpath; diff --git a/core/src/main/java/cucumber/runtime/io/Resource.java b/core/src/main/java/io/cucumber/core/io/Resource.java similarity index 89% rename from core/src/main/java/cucumber/runtime/io/Resource.java rename to core/src/main/java/io/cucumber/core/io/Resource.java index 7b52b5fd04..7a57523e04 100644 --- a/core/src/main/java/cucumber/runtime/io/Resource.java +++ b/core/src/main/java/io/cucumber/core/io/Resource.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.io.InputStream; diff --git a/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java similarity index 91% rename from core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java index 912bfd1aee..6680459868 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.net.URL; import java.util.Iterator; @@ -6,7 +6,7 @@ /** * Factory contract for creating resource iterators. */ -public interface ResourceIteratorFactory { +interface ResourceIteratorFactory { /** * Gets a value indicating whether the factory can create iterators for the diff --git a/core/src/main/java/cucumber/runtime/io/ResourceLoader.java b/core/src/main/java/io/cucumber/core/io/ResourceLoader.java similarity index 77% rename from core/src/main/java/cucumber/runtime/io/ResourceLoader.java rename to core/src/main/java/io/cucumber/core/io/ResourceLoader.java index 8920da4e43..34906d48ae 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceLoader.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; public interface ResourceLoader { Iterable resources(String path, String suffix); diff --git a/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java similarity index 84% rename from core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java rename to core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java index 9085bddece..ce3db56e72 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java @@ -1,12 +1,10 @@ -package cucumber.runtime.io; - -import cucumber.runtime.ClassFinder; +package io.cucumber.core.io; import java.io.File; import java.util.Collection; import java.util.HashSet; -public class ResourceLoaderClassFinder implements ClassFinder { +public final class ResourceLoaderClassFinder implements ClassFinder { private final ResourceLoader resourceLoader; private final ClassLoader classLoader; @@ -27,8 +25,7 @@ public Collection> getDescendants(Class parentType, St if (clazz != null && !parentType.equals(clazz) && parentType.isAssignableFrom(clazz)) { result.add(clazz.asSubclass(parentType)); } - } catch (ClassNotFoundException ignore) { - } catch (NoClassDefFoundError ignore) { + } catch (ClassNotFoundException | NoClassDefFoundError ignore) { } } return result; diff --git a/core/src/main/java/cucumber/runtime/io/ZipResource.java b/core/src/main/java/io/cucumber/core/io/ZipResource.java similarity index 85% rename from core/src/main/java/cucumber/runtime/io/ZipResource.java rename to core/src/main/java/io/cucumber/core/io/ZipResource.java index 228d4966b6..9c23ae00b9 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResource.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResource.java @@ -1,15 +1,15 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -public class ZipResource implements Resource { +final class ZipResource implements Resource { private final ZipFile jarFile; private final ZipEntry jarEntry; - public ZipResource(ZipFile jarFile, ZipEntry jarEntry) { + ZipResource(ZipFile jarFile, ZipEntry jarEntry) { this.jarFile = jarFile; this.jarEntry = jarEntry; } diff --git a/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java b/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java similarity index 87% rename from core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java rename to core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java index fe0f8abdbf..deccfe76e4 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.util.Enumeration; @@ -7,14 +7,14 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -public class ZipResourceIterator implements Iterator { +final class ZipResourceIterator implements Iterator { private final String path; private final String suffix; private final ZipFile jarFile; private final Enumeration entries; private Resource next; - public ZipResourceIterator(String zipPath, String path, String suffix) throws IOException { + ZipResourceIterator(String zipPath, String path, String suffix) throws IOException { this.path = path; this.suffix = suffix; jarFile = new ZipFile(zipPath); diff --git a/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java similarity index 80% rename from core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java index 2b2e41dba8..89acbebfa6 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java @@ -1,16 +1,16 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.net.URL; import java.util.Iterator; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; /** * Factory which creates {@link ZipResourceIterator}s for URL's with "jar", "zip" and "wsjar" * protocols. */ -public class ZipResourceIteratorFactory implements ResourceIteratorFactory { +final class ZipResourceIteratorFactory implements ResourceIteratorFactory { @Override public boolean isFactoryFor(URL url) { diff --git a/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java similarity index 88% rename from core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java index 09a96939df..af3c7a0310 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.net.URL; import java.util.Iterator; @@ -6,7 +6,7 @@ /** * Resource iterator factory implementation which delegates to zip then file. */ -public class ZipThenFileResourceIteratorFactory implements ResourceIteratorFactory { +final class ZipThenFileResourceIteratorFactory implements ResourceIteratorFactory { private final ResourceIteratorFactory zipResourceIteratorFactory = new ZipResourceIteratorFactory(); private final ResourceIteratorFactory fileResourceIteratorFactory = new FileResourceIteratorFactory(); diff --git a/core/src/main/java/cucumber/runtime/model/CucumberFeature.java b/core/src/main/java/io/cucumber/core/model/CucumberFeature.java similarity index 64% rename from core/src/main/java/cucumber/runtime/model/CucumberFeature.java rename to core/src/main/java/io/cucumber/core/model/CucumberFeature.java index 07d308bbdd..3939b09978 100644 --- a/core/src/main/java/cucumber/runtime/model/CucumberFeature.java +++ b/core/src/main/java/io/cucumber/core/model/CucumberFeature.java @@ -1,18 +1,14 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.api.event.TestSourceRead; -import cucumber.runner.EventBus; import gherkin.ast.GherkinDocument; import java.io.Serializable; import java.util.Comparator; -public class CucumberFeature implements Serializable { - private static final long serialVersionUID = 1L; +public final class CucumberFeature{ private final String uri; - private GherkinDocument gherkinDocument; - private String gherkinSource; - + private final GherkinDocument gherkinDocument; + private final String gherkinSource; public CucumberFeature(GherkinDocument gherkinDocument, String uri, String gherkinSource) { this.gherkinDocument = gherkinDocument; @@ -28,8 +24,8 @@ public String getUri() { return uri; } - public void sendTestSourceRead(EventBus bus) { - bus.send(new TestSourceRead(bus.getTime(), uri, gherkinSource)); + public String getGherkinSource() { + return gherkinSource; } public static class CucumberFeatureUriComparator implements Comparator { diff --git a/core/src/main/java/cucumber/util/Encoding.java b/core/src/main/java/io/cucumber/core/model/Encoding.java similarity index 81% rename from core/src/main/java/cucumber/util/Encoding.java rename to core/src/main/java/io/cucumber/core/model/Encoding.java index 15e19b954e..0016f4fcdd 100644 --- a/core/src/main/java/cucumber/util/Encoding.java +++ b/core/src/main/java/io/cucumber/core/model/Encoding.java @@ -1,6 +1,7 @@ -package cucumber.util; +package io.cucumber.core.model; -import cucumber.runtime.io.Resource; +import io.cucumber.core.io.Resource; +import io.cucumber.core.util.FixJava; import java.io.IOException; import java.io.InputStreamReader; @@ -10,12 +11,12 @@ /** * Utilities for reading the encoding of a file. */ -public class Encoding { +final class Encoding { private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^\\s*#|^\\s*$"); private static final Pattern ENCODING_PATTERN = Pattern.compile("^\\s*#\\s*encoding\\s*:\\s*([0-9a-zA-Z\\-]+)", Pattern.CASE_INSENSITIVE); - public static final String DEFAULT_ENCODING = "UTF-8"; + private static final String DEFAULT_ENCODING = "UTF-8"; - public static String readFile(Resource resource) throws RuntimeException, IOException { + static String readFile(Resource resource) throws RuntimeException, IOException { String source = FixJava.readReader(new InputStreamReader(resource.getInputStream(), DEFAULT_ENCODING)); String enc = encoding(source); if(!enc.equals(DEFAULT_ENCODING)) { diff --git a/core/src/main/java/cucumber/runtime/model/FeatureBuilder.java b/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java similarity index 84% rename from core/src/main/java/cucumber/runtime/model/FeatureBuilder.java rename to core/src/main/java/io/cucumber/core/model/FeatureBuilder.java index 728c2e1c69..0cad9e6100 100644 --- a/core/src/main/java/cucumber/runtime/model/FeatureBuilder.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java @@ -1,8 +1,7 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.Resource; -import cucumber.util.Encoding; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.Resource; import gherkin.AstBuilder; import gherkin.Parser; import gherkin.ParserException; @@ -19,14 +18,14 @@ import java.util.List; import java.util.Map; -public class FeatureBuilder { +final class FeatureBuilder { private static final Charset UTF8 = Charset.forName("UTF-8"); private final List cucumberFeatures; private final char fileSeparatorChar; private final MessageDigest md5; private final Map pathsByChecksum = new HashMap(); - public FeatureBuilder(List cucumberFeatures) { + FeatureBuilder(List cucumberFeatures) { this(cucumberFeatures, File.separatorChar); } @@ -40,7 +39,7 @@ public FeatureBuilder(List cucumberFeatures) { } } - public void parse(Resource resource) { + void parse(Resource resource) { String gherkin = read(resource); String checksum = checksum(gherkin); @@ -59,7 +58,7 @@ public void parse(Resource resource) { } catch (ParserException e) { throw new CucumberException(e); } - } + } private String convertFileSeparatorToForwardSlash(String path) { return path.replace(fileSeparatorChar, '/'); @@ -69,10 +68,9 @@ private String checksum(String gherkin) { return new BigInteger(1, md5.digest(gherkin.getBytes(UTF8))).toString(16); } - public String read(Resource resource) { + private String read(Resource resource) { try { - String source = Encoding.readFile(resource); - return source; + return Encoding.readFile(resource); } catch (IOException e) { throw new CucumberException("Failed to read resource:" + resource.getPath(), e); } diff --git a/core/src/main/java/cucumber/runtime/FeatureCompiler.java b/core/src/main/java/io/cucumber/core/model/FeatureCompiler.java similarity index 88% rename from core/src/main/java/cucumber/runtime/FeatureCompiler.java rename to core/src/main/java/io/cucumber/core/model/FeatureCompiler.java index 75acc1c336..cbd8769e3c 100644 --- a/core/src/main/java/cucumber/runtime/FeatureCompiler.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureCompiler.java @@ -1,6 +1,5 @@ -package cucumber.runtime; +package io.cucumber.core.model; -import cucumber.runtime.model.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; diff --git a/core/src/main/java/cucumber/runtime/model/FeatureLoader.java b/core/src/main/java/io/cucumber/core/model/FeatureLoader.java similarity index 58% rename from core/src/main/java/cucumber/runtime/model/FeatureLoader.java rename to core/src/main/java/io/cucumber/core/model/FeatureLoader.java index 28983b2ac9..131d949b6c 100644 --- a/core/src/main/java/cucumber/runtime/model/FeatureLoader.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureLoader.java @@ -1,24 +1,14 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.Resource; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureBuilder; -import cucumber.runtime.model.PathWithLines; -import cucumber.util.Encoding; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; -import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public final class FeatureLoader { - private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); private final ResourceLoader resourceLoader; @@ -42,46 +32,12 @@ public List load(List featurePaths) { final List cucumberFeatures = new ArrayList(); final FeatureBuilder builder = new FeatureBuilder(cucumberFeatures); for (String featurePath : featurePaths) { - if (featurePath.startsWith("@")) { - loadFromRerunFile(builder, resourceLoader, featurePath.substring(1)); - } else { - loadFromFeaturePath(builder, resourceLoader, featurePath, false); - } + loadFromFileSystemOrClasspath(builder, resourceLoader, featurePath); } - Collections.sort(cucumberFeatures, new CucumberFeature.CucumberFeatureUriComparator()); + cucumberFeatures.sort(new CucumberFeature.CucumberFeatureUriComparator()); return cucumberFeatures; } - - private void loadFromRerunFile(FeatureBuilder builder, ResourceLoader resourceLoader, String rerunPath) { - for (PathWithLines pathWithLines : loadRerunFile(rerunPath)) { - loadFromFileSystemOrClasspath(builder, resourceLoader, pathWithLines.path); - } - } - - public List loadRerunFile(String rerunPath) { - List featurePaths = new ArrayList(); - Iterable resources = resourceLoader.resources(rerunPath, null); - for (Resource resource : resources) { - String source = read(resource); - if (!source.isEmpty()) { - Matcher matcher = RERUN_PATH_SPECIFICATION.matcher(source); - while (matcher.find()) { - featurePaths.add(new PathWithLines(matcher.group(1))); - } - } - } - return featurePaths; - } - private static String read(Resource resource) { - try { - return Encoding.readFile(resource); - } catch (IOException e) { - throw new CucumberException("Failed to read resource:" + resource.getPath(), e); - } - } - - private static void loadFromFileSystemOrClasspath(FeatureBuilder builder, ResourceLoader resourceLoader, String featurePath) { try { loadFromFeaturePath(builder, resourceLoader, featurePath, false); diff --git a/core/src/main/java/cucumber/runtime/model/PathWithLines.java b/core/src/main/java/io/cucumber/core/model/PathWithLines.java similarity index 76% rename from core/src/main/java/cucumber/runtime/model/PathWithLines.java rename to core/src/main/java/io/cucumber/core/model/PathWithLines.java index 4a1e06297b..060a04dd4a 100644 --- a/core/src/main/java/cucumber/runtime/model/PathWithLines.java +++ b/core/src/main/java/io/cucumber/core/model/PathWithLines.java @@ -1,11 +1,11 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class PathWithLines { +public final class PathWithLines { private static final Pattern FILE_COLON_LINE_PATTERN = Pattern.compile("^([\\w\\W]*?):([\\d:]+)$"); public final String path; @@ -15,15 +15,6 @@ public static boolean hasLineFilters(String pathName) { return FILE_COLON_LINE_PATTERN.matcher(pathName).matches(); } - public static String stripLineFilters(String pathName) { - Matcher matcher = FILE_COLON_LINE_PATTERN.matcher(pathName); - if (matcher.matches()) { - return matcher.group(1); - } else { - return pathName; - } - } - public PathWithLines(String pathName) { Matcher matcher = FILE_COLON_LINE_PATTERN.matcher(pathName); if (matcher.matches()) { diff --git a/core/src/main/java/cucumber/runtime/Env.java b/core/src/main/java/io/cucumber/core/options/Env.java similarity index 96% rename from core/src/main/java/cucumber/runtime/Env.java rename to core/src/main/java/io/cucumber/core/options/Env.java index 60afa48225..9b2222645e 100644 --- a/core/src/main/java/cucumber/runtime/Env.java +++ b/core/src/main/java/io/cucumber/core/options/Env.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import java.util.HashMap; import java.util.Map; @@ -14,7 +14,7 @@ *
  • Resource bundle
  • * */ -public class Env { +public final class Env { public static final Env INSTANCE = new Env("cucumber"); private final Map map = new HashMap(); diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java new file mode 100644 index 0000000000..6564fb44c7 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -0,0 +1,113 @@ +package io.cucumber.core.options; + +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.plugin.SummaryPrinter; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.DefaultSummaryPrinter; +import io.cucumber.core.plugin.HTMLFormatter; +import io.cucumber.core.plugin.JSONFormatter; +import io.cucumber.core.plugin.JUnitFormatter; +import io.cucumber.core.plugin.NullSummaryPrinter; +import io.cucumber.core.plugin.Options; +import io.cucumber.core.plugin.PrettyFormatter; +import io.cucumber.core.plugin.ProgressFormatter; +import io.cucumber.core.plugin.RerunFormatter; +import io.cucumber.core.plugin.TestNGFormatter; +import io.cucumber.core.plugin.TimelineFormatter; +import io.cucumber.core.plugin.UsageFormatter; + +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PluginOption implements Options.Plugin { + + private static final Pattern PLUGIN_WITH_ARGUMENT_PATTERN = Pattern.compile("([^:]+):(.*)"); + private static final HashMap> PLUGIN_CLASSES = new HashMap>() {{ + put("junit", JUnitFormatter.class); + put("testng", TestNGFormatter.class); + put("html", HTMLFormatter.class); + put("pretty", PrettyFormatter.class); + put("progress", ProgressFormatter.class); + put("json", JSONFormatter.class); + put("usage", UsageFormatter.class); + put("rerun", RerunFormatter.class); + put("default_summary", DefaultSummaryPrinter.class); + put("null_summary", NullSummaryPrinter.class); + put("timeline", TimelineFormatter.class); + }}; + + private final String pluginString; + private final Class pluginClass; + private final String argument; + + private PluginOption(String pluginString, Class pluginClass, String argument) { + this.pluginString = pluginString; + this.pluginClass = pluginClass; + this.argument = argument; + } + + @Override + public Class pluginClass() { + return pluginClass; + } + + @Override + public String argument() { + return argument; + } + + @Override + public String pluginString() { + return pluginString; + } + + boolean isFormatter() { + return EventListener.class.isAssignableFrom(pluginClass) || ConcurrentEventListener.class.isAssignableFrom(pluginClass); + } + + boolean isStepDefinitionReporter() { + return StepDefinitionReporter.class.isAssignableFrom(pluginClass); + } + + boolean isSummaryPrinter() { + return SummaryPrinter.class.isAssignableFrom(pluginClass); + } + + static PluginOption parse(String pluginArgumentPattern) { + Matcher pluginWithFile = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(pluginArgumentPattern); + if (!pluginWithFile.matches()) { + return new PluginOption(pluginArgumentPattern, parsePluginName(pluginArgumentPattern), null); + } + + Class pluginClass = parsePluginName(pluginWithFile.group(1)); + return new PluginOption(pluginArgumentPattern, pluginClass, pluginWithFile.group(2)); + } + + private static Class parsePluginName(String pluginName) { + Class pluginClass = PLUGIN_CLASSES.get(pluginName); + if (pluginClass == null) { + pluginClass = loadClass(pluginName); + } + return pluginClass; + } + + @SuppressWarnings("unchecked") + private static Class loadClass(String className) { + try { + Class aClass = Thread.currentThread().getContextClassLoader().loadClass(className); + + if (Plugin.class.isAssignableFrom(aClass)) { + return (Class) aClass; + } + throw new CucumberException("Couldn't load plugin class: " + className + ". It does not implement " + Plugin.class.getName()); + } catch (ClassNotFoundException e) { + throw new CucumberException("Couldn't load plugin class: " + className, e); + } + } + + +} diff --git a/core/src/main/java/cucumber/runtime/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java similarity index 64% rename from core/src/main/java/cucumber/runtime/RuntimeOptions.java rename to core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 8161ec1cf6..687a838772 100644 --- a/core/src/main/java/cucumber/runtime/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -1,16 +1,18 @@ -package cucumber.runtime; +package io.cucumber.core.options; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; import io.cucumber.datatable.DataTable; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.model.PathWithLines; -import cucumber.util.FixJava; -import cucumber.util.Mapper; +import io.cucumber.core.model.PathWithLines; +import io.cucumber.core.util.FixJava; +import io.cucumber.core.util.Mapper; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; import gherkin.IGherkinDialectProvider; -import io.cucumber.datatable.DataTable; +import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; @@ -18,16 +20,23 @@ import java.util.List; import java.util.Map; import java.util.ResourceBundle; +import java.util.regex.Matcher; import java.util.regex.Pattern; -import static cucumber.util.FixJava.join; -import static cucumber.util.FixJava.map; +import static io.cucumber.core.util.FixJava.join; +import static io.cucumber.core.util.FixJava.map; import static java.util.Arrays.asList; // IMPORTANT! Make sure USAGE.txt is always uptodate if this class changes. -public class RuntimeOptions { - public static final String VERSION = ResourceBundle.getBundle("cucumber.version").getString("cucumber-jvm.version"); - public static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; +public final class RuntimeOptions + implements + io.cucumber.core.plugin.Options, + io.cucumber.core.runner.Options, + io.cucumber.core.filter.Options { + + static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); + private static final String USAGE_RESOURCE = "/io/cucumber/core/api/cli/USAGE.txt"; + private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); static String usageText; @@ -58,21 +67,11 @@ public String map(String keyword) { private SnippetType snippetType = SnippetType.UNDERSCORE; private int threads = 1; - private final List pluginFormatterNames = new ArrayList(); - private final List pluginStepDefinitionReporterNames = new ArrayList(); - private final List pluginSummaryPrinterNames = new ArrayList(); - + private final List formatters = new ArrayList<>(); + private final List stepDefinitionReporters = new ArrayList<>(); + private final List summaryPrinters = new ArrayList<>(); - /** - * Create a new instance from a string of options, for example: - *

    - * - * - * @param argv the arguments - */ - public RuntimeOptions(String argv) { - this(Shellwords.parse(argv)); - } + private final ResourceLoader resourceLoader; /** * Create a new instance from a list of options, for example: @@ -81,24 +80,25 @@ public RuntimeOptions(String argv) { * * @param argv the arguments */ - public RuntimeOptions(List argv) { - this(Env.INSTANCE, argv); + public RuntimeOptions(ResourceLoader resourceLoader, List argv) { + this(resourceLoader, Env.INSTANCE, argv); } - public RuntimeOptions(Env env, List argv) { + public RuntimeOptions(ResourceLoader resourceLoader, Env env, List argv) { + this.resourceLoader = resourceLoader; argv = new ArrayList(argv); // in case the one passed in is unmodifiable. parse(argv); String cucumberOptionsFromEnv = env.get("cucumber.options"); if (cucumberOptionsFromEnv != null) { - parse(Shellwords.parse(cucumberOptionsFromEnv)); + parse(ShellWords.parse(cucumberOptionsFromEnv)); } - if (pluginFormatterNames.isEmpty()) { - pluginFormatterNames.add("progress"); + if (formatters.isEmpty()) { + formatters.add(PluginOption.parse("progress")); } - if (pluginSummaryPrinterNames.isEmpty()) { - pluginSummaryPrinterNames.add("default_summary"); + if (summaryPrinters.isEmpty()) { + summaryPrinters.add(PluginOption.parse("default_summary")); } } @@ -107,20 +107,17 @@ public boolean isMultiThreaded() { } public RuntimeOptions noSummaryPrinter() { - pluginSummaryPrinterNames.clear(); + summaryPrinters.clear(); return this; } - public List getPluginFormatterNames() { - return pluginFormatterNames; - } - - public List getPluginSummaryPrinterNames() { - return pluginSummaryPrinterNames; - } - - public List getPluginStepDefinitionReporterNames() { - return pluginStepDefinitionReporterNames; + @Override + public List plugins() { + List plugins = new ArrayList<>(); + plugins.addAll(formatters); + plugins.addAll(stepDefinitionReporters); + plugins.addAll(summaryPrinters); + return plugins; } private void parse(List args) { @@ -177,13 +174,10 @@ private void parse(List args) { } else if (arg.startsWith("-")) { printUsage(); throw new CucumberException("Unknown option: " + arg); + } else if (arg.startsWith("@")) { + processPathWitheLinesFromRerunFile(parsedLineFilters, parsedFeaturePaths, arg.substring(1)); } else { - PathWithLines pathWithLines = new PathWithLines(arg); - parsedFeaturePaths.add(pathWithLines.path); - if (!pathWithLines.lines.isEmpty()) { - String key = pathWithLines.path.replace("classpath:", ""); - addLineFilters(parsedLineFilters, key, pathWithLines.lines); - } + processPathWithLines(parsedLineFilters, parsedFeaturePaths, new PathWithLines(arg)); } } if (!parsedTagFilters.isEmpty() || !parsedNameFilters.isEmpty() || !parsedLineFilters.isEmpty() || haveLineFilters(parsedFeaturePaths)) { @@ -210,9 +204,9 @@ private void parse(List args) { junitOptions.addAll(parsedJunitOptions); } - parsedPluginData.updatePluginFormatterNames(pluginFormatterNames); - parsedPluginData.updatePluginStepDefinitionReporterNames(pluginStepDefinitionReporterNames); - parsedPluginData.updatePluginSummaryPrinterNames(pluginSummaryPrinterNames); + parsedPluginData.updateFormatters(formatters); + parsedPluginData.updateStepDefinitionReporters(stepDefinitionReporters); + parsedPluginData.updateSummaryPrinters(summaryPrinters); } private void addLineFilters(Map> parsedLineFilters, String key, List lines) { @@ -223,9 +217,46 @@ private void addLineFilters(Map> parsedLineFilters, String ke } } + private void processPathWithLines(Map> parsedLineFilters, List parsedFeaturePaths, PathWithLines pathWithLines) { + parsedFeaturePaths.add(pathWithLines.path); + if (!pathWithLines.lines.isEmpty()) { + String key = pathWithLines.path.replace("classpath:", ""); + addLineFilters(parsedLineFilters, key, pathWithLines.lines); + } + } + + private void processPathWitheLinesFromRerunFile(Map> parsedLineFilters, List parsedFeaturePaths, String rerunPath) { + for (PathWithLines pathWithLines : loadRerunFile(rerunPath)) { + processPathWithLines(parsedLineFilters, parsedFeaturePaths, pathWithLines); + } + } + + private List loadRerunFile(String rerunPath) { + List featurePaths = new ArrayList<>(); + Iterable resources = resourceLoader.resources(rerunPath, null); + for (Resource resource : resources) { + String source = read(resource); + if (!source.isEmpty()) { + Matcher matcher = RERUN_PATH_SPECIFICATION.matcher(source); + while (matcher.find()) { + featurePaths.add(new PathWithLines(matcher.group(1))); + } + } + } + return featurePaths; + } + + private static String read(Resource resource) { + try { + return FixJava.readReader(new InputStreamReader(resource.getInputStream())); + } catch (IOException e) { + throw new CucumberException("Failed to read resource:" + resource.getPath(), e); + } + } + private boolean haveLineFilters(List parsedFeaturePaths) { for (String pathName : parsedFeaturePaths) { - if (pathName.startsWith("@") || PathWithLines.hasLineFilters(pathName)) { + if (PathWithLines.hasLineFilters(pathName)) { return true; } } @@ -348,55 +379,55 @@ public int getThreads() { return threads; } - class ParsedPluginData { - ParsedOptionNames formatterNames = new ParsedOptionNames(); - ParsedOptionNames stepDefinitionReporterNames = new ParsedOptionNames(); - ParsedOptionNames summaryPrinterNames = new ParsedOptionNames(); - - public void addPluginName(String name, boolean isAddPlugin) { - if (PluginFactory.isStepDefinitionReporterName(name)) { - stepDefinitionReporterNames.addName(name, isAddPlugin); - } else if (PluginFactory.isSummaryPrinterName(name)) { - summaryPrinterNames.addName(name, isAddPlugin); - } else if (PluginFactory.isFormatterName(name)) { - formatterNames.addName(name, isAddPlugin); + static final class ParsedPluginData { + private ParsedPlugins formatters = new ParsedPlugins(); + private ParsedPlugins stepDefinitionReporters = new ParsedPlugins(); + private ParsedPlugins summaryPrinters = new ParsedPlugins(); + + void addPluginName(String name, boolean isAddPlugin) { + PluginOption pluginOption = PluginOption.parse(name); + if (pluginOption.isStepDefinitionReporter()) { + stepDefinitionReporters.addName(pluginOption, isAddPlugin); + } else if (pluginOption.isSummaryPrinter()) { + summaryPrinters.addName(pluginOption, isAddPlugin); + } else if (pluginOption.isFormatter()) { + formatters.addName(pluginOption, isAddPlugin); } else { throw new CucumberException("Unrecognized plugin: " + name); } } - public void updatePluginFormatterNames(List pluginFormatterNames) { - formatterNames.updateNameList(pluginFormatterNames); + void updateFormatters(List formatter) { + this.formatters.updateNameList(formatter); } - public void updatePluginStepDefinitionReporterNames(List pluginStepDefinitionReporterNames) { - stepDefinitionReporterNames.updateNameList(pluginStepDefinitionReporterNames); + void updateStepDefinitionReporters(List stepDefintionReporter) { + stepDefinitionReporters.updateNameList(stepDefintionReporter); } - public void updatePluginSummaryPrinterNames(List pluginSummaryPrinterNames) { - summaryPrinterNames.updateNameList(pluginSummaryPrinterNames); + void updateSummaryPrinters(List pluginSummaryPrinterNames) { + summaryPrinters.updateNameList(pluginSummaryPrinterNames); } - } - class ParsedOptionNames { - private List names = new ArrayList(); - private boolean clobber = false; + private static class ParsedPlugins { + private List names = new ArrayList<>(); + private boolean clobber = false; - public void addName(String name, boolean isAddOption) { - names.add(name); - if (!isAddOption) { - clobber = true; + void addName(Plugin name, boolean isAddOption) { + names.add(name); + if (!isAddOption) { + clobber = true; + } } - } - public void updateNameList(List nameList) { - if (!names.isEmpty()) { - if (clobber) { - nameList.clear(); + void updateNameList(List nameList) { + if (!names.isEmpty()) { + if (clobber) { + nameList.clear(); + } + nameList.addAll(names); } - nameList.addAll(names); } } } - } diff --git a/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java similarity index 90% rename from core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java rename to core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java index d4e2ec1795..4241a7404d 100644 --- a/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java @@ -1,7 +1,9 @@ -package cucumber.runtime; +package io.cucumber.core.options; -import cucumber.api.CucumberOptions; -import cucumber.runtime.io.MultiLoader; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; import java.util.ArrayList; import java.util.Collections; @@ -9,18 +11,24 @@ import static java.util.Arrays.asList; -public class RuntimeOptionsFactory { +public final class RuntimeOptionsFactory { private final Class clazz; + private final ResourceLoader resoureceLoader; private boolean featuresSpecified = false; private boolean overridingGlueSpecified = false; public RuntimeOptionsFactory(Class clazz) { + this(clazz, new MultiLoader(clazz.getClassLoader())); + } + + public RuntimeOptionsFactory(Class clazz, ResourceLoader resourceLoader) { this.clazz = clazz; + this.resoureceLoader = resourceLoader; } public RuntimeOptions create() { List args = buildArgsFromOptions(); - return new RuntimeOptions(args); + return new RuntimeOptions(resoureceLoader, args); } private List buildArgsFromOptions() { diff --git a/core/src/main/java/cucumber/runtime/Shellwords.java b/core/src/main/java/io/cucumber/core/options/ShellWords.java similarity index 72% rename from core/src/main/java/cucumber/runtime/Shellwords.java rename to core/src/main/java/io/cucumber/core/options/ShellWords.java index 5835b9078b..c6583e49c3 100644 --- a/core/src/main/java/cucumber/runtime/Shellwords.java +++ b/core/src/main/java/io/cucumber/core/options/ShellWords.java @@ -1,18 +1,18 @@ -package cucumber.runtime; +package io.cucumber.core.options; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Shellwords { +class ShellWords { private static final Pattern SHELLWORDS_PATTERN = Pattern.compile("[^\\s'\"]+|[']([^']*)[']|[\"]([^\"]*)[\"]"); - private Shellwords() { + private ShellWords() { } - public static List parse(String cmdline) { - List matchList = new ArrayList(); + static List parse(String cmdline) { + List matchList = new ArrayList<>(); Matcher shellwordsMatcher = SHELLWORDS_PATTERN.matcher(cmdline); while (shellwordsMatcher.find()) { if (shellwordsMatcher.group(1) != null) { @@ -20,8 +20,8 @@ public static List parse(String cmdline) { } else { String shellword = shellwordsMatcher.group(); if (shellword.startsWith("\"") - && shellword.endsWith("\"") - && shellword.length() > 2) { + && shellword.endsWith("\"") + && shellword.length() > 2) { shellword = shellword.substring(1, shellword.length() - 1); } matchList.add(shellword); diff --git a/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java b/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java similarity index 95% rename from core/src/main/java/cucumber/api/formatter/AnsiEscapes.java rename to core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java index 389488a4e3..b4db85d6b8 100644 --- a/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java +++ b/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java @@ -1,6 +1,6 @@ -package cucumber.api.formatter; +package io.cucumber.core.plugin; -public class AnsiEscapes { +final class AnsiEscapes { private static final char ESC = 27; private static final char BRACKET = '['; diff --git a/core/src/main/java/cucumber/runtime/formatter/AnsiFormats.java b/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java similarity index 96% rename from core/src/main/java/cucumber/runtime/formatter/AnsiFormats.java rename to core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java index 132da9fd4d..167c1e6109 100644 --- a/core/src/main/java/cucumber/runtime/formatter/AnsiFormats.java +++ b/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java @@ -1,6 +1,4 @@ -package cucumber.runtime.formatter; - -import cucumber.api.formatter.AnsiEscapes; +package io.cucumber.core.plugin; import java.util.HashMap; import java.util.Map; @@ -8,7 +6,7 @@ final class AnsiFormats implements Formats { private static final Map formats = new HashMap() {{ put("undefined", new ColorFormat(AnsiEscapes.YELLOW)); - put("undefined_arg", new ColorFormat(AnsiEscapes.YELLOW, AnsiEscapes.INTENSITY_BOLD)); // Never used, but avoids NPE in formatters. + put("undefined_arg", new ColorFormat(AnsiEscapes.YELLOW, AnsiEscapes.INTENSITY_BOLD)); // Never used, but avoids NPE in plugin. put("pending", new ColorFormat(AnsiEscapes.YELLOW)); put("pending_arg", new ColorFormat(AnsiEscapes.YELLOW, AnsiEscapes.INTENSITY_BOLD)); put("executing", new ColorFormat(AnsiEscapes.GREY)); diff --git a/core/src/main/java/cucumber/runner/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java similarity index 61% rename from core/src/main/java/cucumber/runner/CanonicalOrderEventPublisher.java rename to core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java index 712df8077c..659b5d73d0 100644 --- a/core/src/main/java/cucumber/runner/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java @@ -1,13 +1,14 @@ -package cucumber.runner; +package io.cucumber.core.plugin; -import cucumber.api.event.Event; -import cucumber.api.event.TestRunFinished; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.event.AbstractEventPublisher; import java.util.Collections; import java.util.LinkedList; import java.util.List; -public class CanonicalOrderEventPublisher extends AbstractEventPublisher { +final class CanonicalOrderEventPublisher extends AbstractEventPublisher { private final List queue = new LinkedList<>(); diff --git a/core/src/main/java/cucumber/runtime/formatter/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java similarity index 77% rename from core/src/main/java/cucumber/runtime/formatter/DefaultSummaryPrinter.java rename to core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index e8457edc7e..c766a5b1cb 100644 --- a/core/src/main/java/cucumber/runtime/formatter/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -1,18 +1,17 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.SummaryPrinter; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestRunFinished; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; -import cucumber.runtime.UndefinedStepsTracker; +import io.cucumber.core.api.plugin.SummaryPrinter; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; import java.io.PrintStream; import java.util.List; -class DefaultSummaryPrinter implements SummaryPrinter, ColorAware, StrictAware, EventListener { +public final class DefaultSummaryPrinter implements SummaryPrinter, ColorAware, StrictAware, EventListener { private final Stats stats = new Stats(); private final UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker(); diff --git a/core/src/main/java/cucumber/runtime/formatter/Format.java b/core/src/main/java/io/cucumber/core/plugin/Format.java similarity index 62% rename from core/src/main/java/cucumber/runtime/formatter/Format.java rename to core/src/main/java/io/cucumber/core/plugin/Format.java index 4b60cf4392..73a9c52b13 100644 --- a/core/src/main/java/cucumber/runtime/formatter/Format.java +++ b/core/src/main/java/io/cucumber/core/plugin/Format.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; public interface Format { String text(String text); diff --git a/core/src/main/java/cucumber/runtime/formatter/Formats.java b/core/src/main/java/io/cucumber/core/plugin/Formats.java similarity index 69% rename from core/src/main/java/cucumber/runtime/formatter/Formats.java rename to core/src/main/java/io/cucumber/core/plugin/Formats.java index c803eab5a9..ad777901fe 100644 --- a/core/src/main/java/cucumber/runtime/formatter/Formats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Formats.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; public interface Formats { Format get(String key); diff --git a/core/src/main/java/cucumber/runtime/formatter/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java similarity index 94% rename from core/src/main/java/cucumber/runtime/formatter/HTMLFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index bc9b3d899e..a3ef5a8eff 100644 --- a/core/src/main/java/cucumber/runtime/formatter/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -1,22 +1,20 @@ -package cucumber.runtime.formatter; - -import cucumber.api.HookTestStep; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.NiceAppendable; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.HookTestStep; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.exception.CucumberException; import gherkin.ast.Background; import gherkin.ast.DataTable; import gherkin.ast.DocString; @@ -50,7 +48,7 @@ import java.util.List; import java.util.Map; -final class HTMLFormatter implements EventListener { +public final class HTMLFormatter implements EventListener { private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static final String JS_FORMATTER_VAR = "formatter"; private static final String JS_REPORT_FILENAME = "report.js"; @@ -120,6 +118,7 @@ public void receive(TestRunFinished event) { } }; + @SuppressWarnings("WeakerAccess") // Used by PluginFactory public HTMLFormatter(URL htmlReportDir) { this(htmlReportDir, createJsOut(htmlReportDir)); } @@ -147,7 +146,7 @@ private void handleTestSourceRead(TestSourceRead event) { private void handleTestCaseStarted(TestCaseStarted event) { if (firstFeature) { jsOut.append("$(document).ready(function() {").append("var ") - .append(JS_FORMATTER_VAR).append(" = new CucumberHTML.DOMFormatter($('.cucumber-report'));"); + .append(JS_FORMATTER_VAR).append(" = new CucumberHTML.DOMFormatter($('.cucumber-report'));"); firstFeature = false; } handleStartOfFeature(event.testCase); @@ -187,7 +186,7 @@ private void handleTestStepFinished(TestStepFinished event) { private void handleEmbed(EmbedEvent event) { String mimeType = event.mimeType; if(mimeType.startsWith("text/")) { - // just pass straight to the formatter to output in the html + // just pass straight to the plugin to output in the html jsFunctionCall("embedding", mimeType, new String(event.data)); } else { // Creating a file instead of using data urls to not clutter the js file @@ -479,7 +478,7 @@ private URL toUrl(String fileName) { try { return new URL(htmlReportDir, fileName); } catch (IOException e) { - throw new CucumberException(e); + throw new CucumberException(e); } } diff --git a/core/src/main/java/cucumber/runtime/formatter/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java similarity index 93% rename from core/src/main/java/cucumber/runtime/formatter/JSONFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 5bd8e9d5f3..6fe0d0b4e6 100644 --- a/core/src/main/java/cucumber/runtime/formatter/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -1,22 +1,21 @@ -package cucumber.runtime.formatter; - -import cucumber.api.HookTestStep; -import cucumber.api.HookType; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.NiceAppendable; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.HookTestStep; +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.api.event.WriteEvent; import gherkin.ast.Background; import gherkin.ast.DocString; import gherkin.ast.Feature; @@ -37,7 +36,7 @@ import java.util.List; import java.util.Map; -final class JSONFormatter implements EventListener { +public final class JSONFormatter implements EventListener { private String currentFeatureFile; private List> featureMaps = new ArrayList>(); private List> currentElementsList; @@ -316,8 +315,8 @@ private void addHookStepToTestCaseMap(Map currentStepOrHookMap, case AfterStep: mapToAddTo = currentStepsList.get(currentStepsList.size() - 1); break; - default: - mapToAddTo = currentTestCaseMap; + default: + mapToAddTo = currentTestCaseMap; } if (!mapToAddTo.containsKey(hookName)) { @@ -354,7 +353,7 @@ private Map createMatchMap(TestStep step, Result result) { PickleStepTestStep testStep = (PickleStepTestStep) step; if (!testStep.getDefinitionArgument().isEmpty()) { List> argumentList = new ArrayList>(); - for (cucumber.api.Argument argument : testStep.getDefinitionArgument()) { + for (io.cucumber.core.api.event.Argument argument : testStep.getDefinitionArgument()) { Map argumentMap = new HashMap(); if (argument.getValue() != null) { argumentMap.put("val", argument.getValue()); diff --git a/core/src/main/java/cucumber/runtime/formatter/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java similarity index 89% rename from core/src/main/java/cucumber/runtime/formatter/JUnitFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index f38f23aaee..fb42c815fc 100644 --- a/core/src/main/java/cucumber/runtime/formatter/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -1,20 +1,17 @@ -package cucumber.runtime.formatter; - -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.StrictAware; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Utils; -import cucumber.runtime.io.URLOutputStream; -import cucumber.runtime.io.UTF8OutputStreamWriter; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.exception.CucumberException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -39,7 +36,7 @@ import java.util.List; import java.util.Locale; -final class JUnitFormatter implements EventListener, StrictAware { +public final class JUnitFormatter implements EventListener, StrictAware { private final Writer out; private final Document doc; private final Element rootElement; @@ -78,6 +75,7 @@ public void receive(TestRunFinished event) { } }; + @SuppressWarnings("WeakerAccess") // Used by PluginFactory public JUnitFormatter(URL out) throws IOException { this.out = new UTF8OutputStreamWriter(new URLOutputStream(out)); TestCase.treatConditionallySkippedAsFailure = false; @@ -93,6 +91,10 @@ public JUnitFormatter(URL out) throws IOException { } } + private static String getUniqueTestNameForScenarioExample(String testCaseName, int exampleNumber) { + return testCaseName + (testCaseName.contains(" ") ? " " : "_") + exampleNumber; + } + @Override public void setEventPublisher(EventPublisher publisher) { publisher.registerHandlerFor(TestSourceRead.class, sourceReadHandler); @@ -193,7 +195,7 @@ private static class TestCase { NUMBER_FORMAT.applyPattern("0.######"); } - private TestCase(cucumber.api.TestCase testCase) { + private TestCase(io.cucumber.core.api.event.TestCase testCase) { this.testCase = testCase; } @@ -203,7 +205,7 @@ private TestCase(cucumber.api.TestCase testCase) { static boolean treatConditionallySkippedAsFailure = false; final List steps = new ArrayList(); final List results = new ArrayList(); - private final cucumber.api.TestCase testCase; + private final io.cucumber.core.api.event.TestCase testCase; private Element createElement(Document doc) { return doc.createElement("testcase"); @@ -214,10 +216,10 @@ private void writeElement(Document doc, Element tc) { tc.setAttribute("name", calculateElementName(testCase)); } - private String calculateElementName(cucumber.api.TestCase testCase) { + private String calculateElementName(io.cucumber.core.api.event.TestCase testCase) { String testCaseName = testCase.getName(); if (testCaseName.equals(previousTestCaseName)) { - return Utils.getUniqueTestNameForScenarioExample(testCaseName, ++exampleNumber); + return getUniqueTestNameForScenarioExample(testCaseName, ++exampleNumber); } else { previousTestCaseName = testCase.getName(); exampleNumber = 1; @@ -305,9 +307,8 @@ private Element createElement(Document doc, StringBuilder sb, String elementType // the createCDATASection method seems to convert "\n" to "\r\n" on Windows, in case // data originally contains "\r\n" line separators the result becomes "\r\r\n", which // are displayed as double line breaks. - // TODO Java 7 PR #1147: Inlined System.lineSeparator() - String systemLineSeperator = System.getProperty("line.separator"); - child.appendChild(doc.createCDATASection(sb.toString().replace(systemLineSeperator, "\n"))); + String normalizedLineEndings = sb.toString().replace(System.lineSeparator(), "\n"); + child.appendChild(doc.createCDATASection(normalizedLineEndings)); return child; } diff --git a/core/src/main/java/cucumber/runtime/formatter/MonochromeFormats.java b/core/src/main/java/io/cucumber/core/plugin/MonochromeFormats.java similarity index 89% rename from core/src/main/java/cucumber/runtime/formatter/MonochromeFormats.java rename to core/src/main/java/io/cucumber/core/plugin/MonochromeFormats.java index 716f5133ec..2598d540be 100644 --- a/core/src/main/java/cucumber/runtime/formatter/MonochromeFormats.java +++ b/core/src/main/java/io/cucumber/core/plugin/MonochromeFormats.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; final class MonochromeFormats implements Formats { private static final Format FORMAT = new Format() { diff --git a/core/src/main/java/cucumber/api/formatter/NiceAppendable.java b/core/src/main/java/io/cucumber/core/plugin/NiceAppendable.java similarity index 96% rename from core/src/main/java/cucumber/api/formatter/NiceAppendable.java rename to core/src/main/java/io/cucumber/core/plugin/NiceAppendable.java index cf31ea5e13..0ce67ba67a 100644 --- a/core/src/main/java/cucumber/api/formatter/NiceAppendable.java +++ b/core/src/main/java/io/cucumber/core/plugin/NiceAppendable.java @@ -1,4 +1,4 @@ -package cucumber.api.formatter; +package io.cucumber.core.plugin; import java.io.Closeable; import java.io.Flushable; @@ -7,7 +7,7 @@ /** * A nice appendable that doesn't throw checked exceptions */ -public class NiceAppendable { +final class NiceAppendable { private static final CharSequence NL = "\n"; private final Appendable out; diff --git a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java new file mode 100644 index 0000000000..467de751c1 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java @@ -0,0 +1,12 @@ +package io.cucumber.core.plugin; + +import io.cucumber.core.api.plugin.SummaryPrinter; + +public final class NullSummaryPrinter implements SummaryPrinter { + + @SuppressWarnings("WeakerAccess") // Used by PluginFactory + public NullSummaryPrinter(){ + + } + +} diff --git a/core/src/main/java/io/cucumber/core/plugin/Options.java b/core/src/main/java/io/cucumber/core/plugin/Options.java new file mode 100644 index 0000000000..1f709cbc0e --- /dev/null +++ b/core/src/main/java/io/cucumber/core/plugin/Options.java @@ -0,0 +1,18 @@ +package io.cucumber.core.plugin; + +public interface Options { + Iterable plugins(); + + boolean isMonochrome(); + + boolean isStrict(); + + interface Plugin { + + Class pluginClass(); + + String argument(); + + String pluginString(); + } +} diff --git a/core/src/main/java/cucumber/runtime/formatter/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java similarity index 52% rename from core/src/main/java/cucumber/runtime/formatter/PluginFactory.java rename to core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index ff329fd4e2..92c256bf25 100644 --- a/core/src/main/java/cucumber/runtime/formatter/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -1,27 +1,18 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.Plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.SummaryPrinter; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventListener; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; -import cucumber.runtime.io.UTF8OutputStreamWriter; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.exception.CucumberException; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.util.HashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import static cucumber.runtime.Utils.toURL; import static java.util.Arrays.asList; /** @@ -36,20 +27,6 @@ public final class PluginFactory { private final Class[] CTOR_PARAMETERS = new Class[]{String.class, Appendable.class, URI.class, URL.class, File.class}; - private static final HashMap> PLUGIN_CLASSES = new HashMap>() {{ - put("junit", JUnitFormatter.class); - put("testng", TestNGFormatter.class); - put("html", HTMLFormatter.class); - put("pretty", PrettyFormatter.class); - put("progress", ProgressFormatter.class); - put("json", JSONFormatter.class); - put("usage", UsageFormatter.class); - put("rerun", RerunFormatter.class); - put("default_summary", DefaultSummaryPrinter.class); - put("null_summary", NullSummaryPrinter.class); - put("timeline", TimelineFormatter.class); - }}; - private static final Pattern PLUGIN_WITH_ARGUMENT_PATTERN = Pattern.compile("([^:]+):(.*)"); private String defaultOutFormatter = null; private Appendable defaultOut = new PrintStream(System.out) { @@ -59,23 +36,25 @@ public void close() { } }; - public Plugin create(String pluginString) { - Matcher pluginWithArgument = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(pluginString); - String pluginName; - String argument; - if (pluginWithArgument.matches()) { - pluginName = pluginWithArgument.group(1); - argument = pluginWithArgument.group(2); - } else { - pluginName = pluginString; - argument = null; + static URL toURL(String pathOrUrl) { + try { + if (!pathOrUrl.endsWith("/")) { + pathOrUrl = pathOrUrl + "/"; + } + if (pathOrUrl.matches("^(file|http|https):.*")) { + return new URL(pathOrUrl); + } else { + return new URL("file:" + pathOrUrl); + } + } catch (MalformedURLException e) { + throw new CucumberException("Bad URL:" + pathOrUrl, e); } - Class pluginClass = pluginClass(pluginName); + } + + public Plugin create(Options.Plugin plugin) { try { - return instantiate(pluginString, pluginClass, argument); - } catch (IOException e) { - throw new CucumberException(e); - } catch (URISyntaxException e) { + return instantiate(plugin.pluginString(), plugin.pluginClass(), plugin.argument()); + } catch (IOException | URISyntaxException e) { throw new CucumberException(e); } } @@ -101,9 +80,7 @@ private T instantiate(String pluginString, Class pluginCla private T newInstance(Constructor constructor, Object... ctorArgs) { try { return constructor.newInstance(ctorArgs); - } catch (InstantiationException e) { - throw new CucumberException(e); - } catch (IllegalAccessException e) { + } catch (InstantiationException | IllegalAccessException e) { throw new CucumberException(e); } catch (InvocationTargetException e) { throw new CucumberException(e.getTargetException()); @@ -159,66 +136,19 @@ private Constructor findEmptyConstructor(Class pluginClass) { } } - private static Class pluginClass(String pluginName) { - Class pluginClass = PLUGIN_CLASSES.get(pluginName); - if (pluginClass == null) { - pluginClass = loadClass(pluginName); - } - return pluginClass; - } - - @SuppressWarnings("unchecked") - private static Class loadClass(String className) { - try { - Class aClass = Thread.currentThread().getContextClassLoader().loadClass(className); - - if (Plugin.class.isAssignableFrom(aClass)) { - return (Class) aClass; - } - throw new CucumberException("Couldn't load plugin class: " + className + ". It does not implement " + Plugin.class.getName()); - } catch (ClassNotFoundException e) { - throw new CucumberException("Couldn't load plugin class: " + className, e); - } - } - private Appendable defaultOutOrFailIfAlreadyUsed(String formatterString) { try { if (defaultOut != null) { defaultOutFormatter = formatterString; return defaultOut; } else { - throw new CucumberException("Only one formatter can use STDOUT, now both " + + throw new CucumberException("Only one plugin can use STDOUT, now both " + defaultOutFormatter + " and " + formatterString + " use it. " + - "If you use more than one formatter you must specify output path with PLUGIN:PATH_OR_URL"); + "If you use more than one plugin you must specify output path with PLUGIN:PATH_OR_URL"); } } finally { defaultOut = null; } } - public static boolean isFormatterName(String name) { - Class pluginClass = getPluginClass(name); - return EventListener.class.isAssignableFrom(pluginClass) || ConcurrentEventListener.class.isAssignableFrom(pluginClass); - } - - public static boolean isStepDefinitionReporterName(String name) { - Class pluginClass = getPluginClass(name); - return StepDefinitionReporter.class.isAssignableFrom(pluginClass); - } - - public static boolean isSummaryPrinterName(String name) { - Class pluginClass = getPluginClass(name); - return SummaryPrinter.class.isAssignableFrom(pluginClass); - } - - private static Class getPluginClass(String name) { - Matcher pluginWithFile = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(name); - String pluginName; - if (pluginWithFile.matches()) { - pluginName = pluginWithFile.group(1); - } else { - pluginName = name; - } - return pluginClass(pluginName); - } } diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java new file mode 100644 index 0000000000..87a40fdc46 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -0,0 +1,111 @@ +package io.cucumber.core.plugin; + +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.backend.StepDefinition; + +import java.util.ArrayList; +import java.util.List; + +public final class Plugins { + private final List plugins; + private boolean pluginNamesInstantiated; + + private final PluginFactory pluginFactory; + private final EventPublisher eventPublisher; + private final EventPublisher orderedEventPublisher; + private final Options options; + + public Plugins(PluginFactory pluginFactory, EventPublisher eventPublisher, Options options) { + this.pluginFactory = pluginFactory; + this.eventPublisher = eventPublisher; + this.orderedEventPublisher = createCanonicalOrderEventPublisher(); + this.options = options; + this.plugins = createPlugins(); + } + + private EventPublisher createCanonicalOrderEventPublisher() { + final CanonicalOrderEventPublisher canonicalOrderEventPublisher = new CanonicalOrderEventPublisher(); + this.eventPublisher.registerHandlerFor(Event.class, new EventHandler() { + @Override + public void receive(Event event) { + canonicalOrderEventPublisher.handle(event); + } + }); + return canonicalOrderEventPublisher; + } + + private List createPlugins() { + List plugins = new ArrayList(); + if (!pluginNamesInstantiated) { + for (Options.Plugin pluginOption : options.plugins()) { + Plugin plugin = pluginFactory.create(pluginOption); + addPlugin(plugins, plugin); + } + pluginNamesInstantiated = true; + } + return plugins; + } + + public List getPlugins() { + return plugins; + } + + public StepDefinitionReporter stepDefinitionReporter() { + return new StepDefinitionReporter() { + @Override + public void stepDefinition(StepDefinition stepDefinition) { + for (Plugin plugin : getPlugins()) { + if (plugin instanceof StepDefinitionReporter) { + StepDefinitionReporter stepDefinitionReporter = (StepDefinitionReporter) plugin; + stepDefinitionReporter.stepDefinition(stepDefinition); + } + } + } + }; + } + + public void addPlugin(Plugin plugin) { + addPlugin(plugins, plugin); + } + + private void addPlugin(List plugins, Plugin plugin) { + plugins.add(plugin); + setMonochromeOnColorAwarePlugins(plugin); + setStrictOnStrictAwarePlugins(plugin); + setEventBusOnEventListenerPlugins(plugin); + } + + private void setMonochromeOnColorAwarePlugins(Plugin plugin) { + if (plugin instanceof ColorAware) { + ColorAware colorAware = (ColorAware) plugin; + colorAware.setMonochrome(options.isMonochrome()); + } + } + + private void setStrictOnStrictAwarePlugins(Plugin plugin) { + if (plugin instanceof StrictAware) { + StrictAware strictAware = (StrictAware) plugin; + strictAware.setStrict(options.isStrict()); + } + } + + private void setEventBusOnEventListenerPlugins(Plugin plugin) { + if (plugin instanceof ConcurrentEventListener) { + ConcurrentEventListener formatter = (ConcurrentEventListener) plugin; + formatter.setEventPublisher(eventPublisher); + } else if (plugin instanceof EventListener) { + EventListener formatter = (EventListener) plugin; + formatter.setEventPublisher(orderedEventPublisher); + } + } + + +} diff --git a/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java similarity index 93% rename from core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 331dbad374..a998c341b3 100644 --- a/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -1,23 +1,22 @@ -package cucumber.runtime.formatter; - -import cucumber.api.Argument; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.NiceAppendable; -import cucumber.util.FixJava; -import cucumber.util.Mapper; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.Argument; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.util.FixJava; +import io.cucumber.core.util.Mapper; import gherkin.ast.Background; import gherkin.ast.Examples; import gherkin.ast.Feature; @@ -29,7 +28,7 @@ import java.util.List; -final class PrettyFormatter implements ConcurrentEventListener, ColorAware { +public final class PrettyFormatter implements ConcurrentEventListener, ColorAware { private static final String SCENARIO_INDENT = " "; private static final String STEP_INDENT = " "; private static final String EXAMPLES_INDENT = " "; diff --git a/core/src/main/java/cucumber/runtime/formatter/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java similarity index 83% rename from core/src/main/java/cucumber/runtime/formatter/ProgressFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 99953501bb..569025123d 100644 --- a/core/src/main/java/cucumber/runtime/formatter/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -1,21 +1,19 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.AnsiEscapes; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.NiceAppendable; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.api.plugin.ColorAware; import java.util.HashMap; import java.util.Map; -final class ProgressFormatter implements ConcurrentEventListener, ColorAware { +public final class ProgressFormatter implements ConcurrentEventListener, ColorAware { private static final Map CHARS = new HashMap() {{ put(Result.Type.PASSED, '.'); put(Result.Type.UNDEFINED, 'U'); diff --git a/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java similarity index 85% rename from core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 415dfe9eee..3fca8a60d8 100644 --- a/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -1,13 +1,12 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.TestCase; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestRunFinished; -import cucumber.api.formatter.NiceAppendable; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.plugin.StrictAware; import java.util.ArrayList; import java.util.HashMap; @@ -19,7 +18,7 @@ * Formatter for reporting all failed test cases and print their locations * Failed means: results that make the exit code non-zero. */ -final class RerunFormatter implements EventListener, StrictAware { +public final class RerunFormatter implements EventListener, StrictAware { private final NiceAppendable out; private Map> featureAndFailedLinesMapping = new HashMap>(); private boolean isStrict = false; diff --git a/core/src/main/java/cucumber/runtime/formatter/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java similarity index 91% rename from core/src/main/java/cucumber/runtime/formatter/Stats.java rename to core/src/main/java/io/cucumber/core/plugin/Stats.java index eb5d83fb7e..df2bd03c0e 100755 --- a/core/src/main/java/cucumber/runtime/formatter/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -1,20 +1,16 @@ -package cucumber.runtime.formatter; - -import cucumber.api.Result; -import cucumber.api.PickleStepTestStep; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; -import cucumber.runtime.formatter.AnsiFormats; -import cucumber.runtime.formatter.Format; -import cucumber.runtime.formatter.Formats; -import cucumber.runtime.formatter.MonochromeFormats; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; import java.io.PrintStream; import java.text.DecimalFormat; @@ -23,7 +19,7 @@ import java.util.List; import java.util.Locale; -public class Stats implements EventListener, ColorAware, StrictAware { +final class Stats implements EventListener, ColorAware, StrictAware { static final long ONE_SECOND = 1000000000; static final long ONE_MINUTE = 60 * ONE_SECOND; private SubCounts scenarioSubCounts = new SubCounts(); @@ -69,7 +65,7 @@ public void receive(TestRunFinished event) { }; private boolean strict; - public Stats() { + Stats() { this(Locale.getDefault()); } diff --git a/core/src/main/java/cucumber/runtime/formatter/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java similarity index 94% rename from core/src/main/java/cucumber/runtime/formatter/TestNGFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index dacb5f0b57..5a66bcdd46 100644 --- a/core/src/main/java/cucumber/runtime/formatter/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -1,20 +1,18 @@ -package cucumber.runtime.formatter; - -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.StrictAware; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; -import cucumber.runtime.io.UTF8OutputStreamWriter; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.exception.CucumberException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; @@ -40,7 +38,7 @@ import java.util.Date; import java.util.List; -class TestNGFormatter implements EventListener, StrictAware { +public final class TestNGFormatter implements EventListener, StrictAware { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); private final Writer writer; diff --git a/core/src/main/java/cucumber/runtime/formatter/TestSourcesModel.java b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/TestSourcesModel.java rename to core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java index e4598e54ef..a077da1241 100644 --- a/core/src/main/java/cucumber/runtime/formatter/TestSourcesModel.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java @@ -1,6 +1,6 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestSourceRead; import gherkin.AstBuilder; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; diff --git a/core/src/main/java/cucumber/runtime/formatter/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java similarity index 86% rename from core/src/main/java/cucumber/runtime/formatter/TimelineFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index bf738ad51f..e2b04938f8 100644 --- a/core/src/main/java/cucumber/runtime/formatter/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -1,17 +1,15 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.TestCase; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseEvent; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.formatter.NiceAppendable; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseEvent; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.exception.CucumberException; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import gherkin.deps.com.google.gson.annotations.SerializedName; @@ -32,21 +30,21 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; -public class TimelineFormatter implements ConcurrentEventListener { +public final class TimelineFormatter implements ConcurrentEventListener { //TODO: if accepted then should move resources out into own project as per HTML report private static final String[] TEXT_ASSETS = new String[]{ - "/io/cucumber/formatter/timeline/index.html", - "/io/cucumber/formatter/timeline/formatter.js", - "/io/cucumber/formatter/timeline/report.css", - "/io/cucumber/formatter/timeline/jquery-3.3.1.min.js", - "/io/cucumber/formatter/timeline/vis.min.css", - "/io/cucumber/formatter/timeline/vis.min.js", - "/io/cucumber/formatter/timeline/vis.override.css", - "/io/cucumber/formatter/timeline/chosen.jquery.min.js", - "/io/cucumber/formatter/timeline/chosen.min.css", - "/io/cucumber/formatter/timeline/chosen.override.css", - "/io/cucumber/formatter/timeline/chosen-sprite.png" + "/io/cucumber/core/plugin/timeline/index.html", + "/io/cucumber/core/plugin/timeline/formatter.js", + "/io/cucumber/core/plugin/timeline/report.css", + "/io/cucumber/core/plugin/timeline/jquery-3.3.1.min.js", + "/io/cucumber/core/plugin/timeline/vis.min.css", + "/io/cucumber/core/plugin/timeline/vis.min.js", + "/io/cucumber/core/plugin/timeline/vis.override.css", + "/io/cucumber/core/plugin/timeline/chosen.jquery.min.js", + "/io/cucumber/core/plugin/timeline/chosen.min.css", + "/io/cucumber/core/plugin/timeline/chosen.override.css", + "/io/cucumber/core/plugin/timeline/chosen-sprite.png" }; private final EventHandler testSourceReadHandler = new EventHandler() { diff --git a/core/src/main/java/cucumber/runtime/io/URLOutputStream.java b/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java similarity index 94% rename from core/src/main/java/cucumber/runtime/io/URLOutputStream.java rename to core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java index 777c87cca9..100c914634 100644 --- a/core/src/main/java/cucumber/runtime/io/URLOutputStream.java +++ b/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java @@ -1,7 +1,7 @@ -package cucumber.runtime.io; +package io.cucumber.core.plugin; import gherkin.deps.com.google.gson.Gson; -import cucumber.util.FixJava; +import io.cucumber.core.util.FixJava; import java.io.*; import java.net.HttpURLConnection; @@ -9,22 +9,23 @@ import java.util.Collections; import java.util.Map; + /** * A stream that can write to both file and http URLs. If it's a file URL, writes with a {@link java.io.FileOutputStream}, * if it's a http or https URL, writes with a HTTP PUT (by default) or with the specified method. */ -public class URLOutputStream extends OutputStream { +class URLOutputStream extends OutputStream { private final URL url; private final String method; private final int expectedResponseCode; private final OutputStream out; private final HttpURLConnection urlConnection; - public URLOutputStream(URL url) throws IOException { + URLOutputStream(URL url) throws IOException { this(url, "PUT", Collections.emptyMap(), 200); } - public URLOutputStream(URL url, String method, Map headers, int expectedResponseCode) throws IOException { + private URLOutputStream(URL url, String method, Map headers, int expectedResponseCode) throws IOException { this.url = url; this.method = method; this.expectedResponseCode = expectedResponseCode; diff --git a/core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java b/core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java new file mode 100644 index 0000000000..06d552f332 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java @@ -0,0 +1,11 @@ +package io.cucumber.core.plugin; + +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; + +final class UTF8OutputStreamWriter extends OutputStreamWriter { + UTF8OutputStreamWriter(OutputStream out) { + super(out, Charset.forName("UTF-8")); + } +} diff --git a/core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java similarity index 94% rename from core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java rename to core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index 807fa5280a..7ef3b633bb 100644 --- a/core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -1,10 +1,10 @@ -package cucumber.runtime; +package io.cucumber.core.plugin; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.SnippetsSuggestedEvent; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.TestSourceRead; import gherkin.AstBuilder; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; @@ -23,7 +23,7 @@ import java.util.List; import java.util.Map; -public class UndefinedStepsTracker implements EventListener { +final class UndefinedStepsTracker implements EventListener { private final List snippets = new ArrayList(); private final IGherkinDialectProvider dialectProvider = new GherkinDialectProvider(); private final Map pathToSourceMap = new HashMap(); @@ -49,11 +49,11 @@ public void setEventPublisher(EventPublisher publisher) { publisher.registerHandlerFor(SnippetsSuggestedEvent.class, snippetsSuggestedHandler); } - public boolean hasUndefinedSteps() { + boolean hasUndefinedSteps() { return hasUndefinedSteps; } - public List getSnippets() { + List getSnippets() { return snippets; } diff --git a/core/src/main/java/cucumber/runtime/formatter/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java similarity index 94% rename from core/src/main/java/cucumber/runtime/formatter/UsageFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index 324dca0597..02cd0eae75 100644 --- a/core/src/main/java/cucumber/runtime/formatter/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -1,14 +1,13 @@ -package cucumber.runtime.formatter; - -import cucumber.api.PickleStepTestStep; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.NiceAppendable; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestStepFinished; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; @@ -23,7 +22,7 @@ * Formatter to measure performance of steps. Aggregated results for all steps can be computed * by adding {@link UsageStatisticStrategy} to the usageFormatter */ -final class UsageFormatter implements Plugin, EventListener { +public final class UsageFormatter implements Plugin, EventListener { private static final BigDecimal NANOS_PER_SECOND = BigDecimal.valueOf(1000000000); final Map> usageMap = new HashMap>(); private final Map statisticStrategies = new HashMap(); @@ -164,7 +163,7 @@ private StepContainer findOrCreateStepContainer(String stepNameWithArgs, List clazz) { + boolean isNonStaticInnerClass = !Modifier.isStatic(clazz.getModifiers()) && clazz.getEnclosingClass() != null; + return Modifier.isPublic(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()) && !isNonStaticInnerClass; + } + public T instantiateExactlyOneSubclass(Class parentType, List packageNames, Class[] constructorParams, Object[] constructorArgs, T fallback) { Collection instances = instantiateSubclasses(parentType, packageNames, constructorParams, constructorArgs); if (instances.size() == 1) { @@ -31,7 +40,7 @@ public Collection instantiateSubclasses(Class parentType, Li Collection result = new HashSet(); for (String packageName : packageNames) { for (Class clazz : classFinder.getDescendants(parentType, packageName)) { - if (Utils.isInstantiable(clazz)) { + if (isInstantiable(clazz)) { result.add(newInstance(constructorParams, constructorArgs, clazz)); } } @@ -40,7 +49,7 @@ public Collection instantiateSubclasses(Class parentType, Li } public T newInstance(Class[] constructorParams, Object[] constructorArgs, Class clazz) { - Constructor constructor = null; + Constructor constructor; try { constructor = clazz.getConstructor(constructorParams); try { @@ -54,14 +63,5 @@ public T newInstance(Class[] constructorParams, Object[] constructorArgs, Cl } } - private boolean hasConstructor(Class clazz, Class[] paramTypes) { - try { - clazz.getConstructor(paramTypes); - return true; - } catch (NoSuchMethodException e) { - return false; - } - } - } diff --git a/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java b/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java new file mode 100644 index 0000000000..dd5896a290 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java @@ -0,0 +1,16 @@ +package io.cucumber.core.reflection; + +import io.cucumber.core.exception.CucumberException; + +import java.util.Collection; + +public final class TooManyInstancesException extends CucumberException { + + TooManyInstancesException(Collection instances) { + super(createMessage(instances)); + } + + private static String createMessage(Collection instances) { + return "Expected only one instance, but found too many: " + instances; + } +} diff --git a/core/src/main/java/cucumber/runner/AmbiguousPickleStepDefinitionsMatch.java b/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java similarity index 85% rename from core/src/main/java/cucumber/runner/AmbiguousPickleStepDefinitionsMatch.java rename to core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java index 4593e937e2..6ee81e9143 100644 --- a/core/src/main/java/cucumber/runner/AmbiguousPickleStepDefinitionsMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.Collections; diff --git a/core/src/main/java/cucumber/runner/AmbiguousStepDefinitionsException.java b/core/src/main/java/io/cucumber/core/runner/AmbiguousStepDefinitionsException.java similarity index 92% rename from core/src/main/java/cucumber/runner/AmbiguousStepDefinitionsException.java rename to core/src/main/java/io/cucumber/core/runner/AmbiguousStepDefinitionsException.java index ad15ac486e..e136e787fd 100644 --- a/core/src/main/java/cucumber/runner/AmbiguousStepDefinitionsException.java +++ b/core/src/main/java/io/cucumber/core/runner/AmbiguousStepDefinitionsException.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/cucumber/runner/Glue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java similarity index 92% rename from core/src/main/java/cucumber/runner/Glue.java rename to core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 55e374b5de..7d110ae590 100644 --- a/core/src/main/java/cucumber/runner/Glue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,10 +1,11 @@ -package cucumber.runner; - -import cucumber.runtime.DuplicateStepDefinitionException; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.Argument; -import cucumber.api.StepDefinitionReporter; +package io.cucumber.core.runner; + +import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.api.plugin.StepDefinitionReporter; import gherkin.pickles.PickleStep; import java.util.ArrayList; @@ -15,7 +16,7 @@ import java.util.Map; import java.util.TreeMap; -final class Glue implements cucumber.runtime.Glue { +final class CachingGlue implements Glue { final Map stepDefinitionsByPattern = new TreeMap<>(); final List beforeHooks = new ArrayList<>(); final List beforeStepHooks = new ArrayList<>(); @@ -115,8 +116,7 @@ void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { } } - @Override - public void removeScenarioScopedGlue() { + void removeScenarioScopedGlue() { removeScenarioScopedHooks(beforeHooks); removeScenarioScopedHooks(beforeStepHooks); removeScenarioScopedHooks(afterHooks); diff --git a/core/src/main/java/cucumber/runtime/DefinitionArgument.java b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java similarity index 69% rename from core/src/main/java/cucumber/runtime/DefinitionArgument.java rename to core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java index b263a0f4a5..ddbaeb7aff 100644 --- a/core/src/main/java/cucumber/runtime/DefinitionArgument.java +++ b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java @@ -1,12 +1,12 @@ -package cucumber.runtime; +package io.cucumber.core.runner; -import cucumber.api.Argument; -import io.cucumber.stepexpression.ExpressionArgument; +import io.cucumber.core.api.event.Argument; +import io.cucumber.core.stepexpression.ExpressionArgument; import java.util.ArrayList; import java.util.List; -public final class DefinitionArgument implements Argument { +final class DefinitionArgument implements Argument { private final io.cucumber.cucumberexpressions.Group group; @@ -14,9 +14,9 @@ private DefinitionArgument(ExpressionArgument expressionArgument) { group = expressionArgument.getGroup(); } - public static List createArguments(List match) { + static List createArguments(List match) { List args = new ArrayList(); - for (io.cucumber.stepexpression.Argument argument : match) { + for (io.cucumber.core.stepexpression.Argument argument : match) { if (argument instanceof ExpressionArgument) { args.add(new DefinitionArgument((ExpressionArgument) argument)); } diff --git a/core/src/main/java/cucumber/runner/FailedPickleStepInstantiationMatch.java b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java similarity index 85% rename from core/src/main/java/cucumber/runner/FailedPickleStepInstantiationMatch.java rename to core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java index 209f2db3f2..4b0263367b 100644 --- a/core/src/main/java/cucumber/runner/FailedPickleStepInstantiationMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.Collections; diff --git a/core/src/main/java/cucumber/runner/HookComparator.java b/core/src/main/java/io/cucumber/core/runner/HookComparator.java similarity index 72% rename from core/src/main/java/cucumber/runner/HookComparator.java rename to core/src/main/java/io/cucumber/core/runner/HookComparator.java index 29e8227fc5..735b716918 100644 --- a/core/src/main/java/cucumber/runner/HookComparator.java +++ b/core/src/main/java/io/cucumber/core/runner/HookComparator.java @@ -1,10 +1,10 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.backend.HookDefinition; import java.util.Comparator; -class HookComparator implements Comparator { +final class HookComparator implements Comparator { private final boolean ascending; HookComparator(boolean ascending) { diff --git a/core/src/main/java/cucumber/runner/HookDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java similarity index 76% rename from core/src/main/java/cucumber/runner/HookDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java index 8d88f4c2da..6fb30f9b6a 100644 --- a/core/src/main/java/cucumber/runner/HookDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinitionMatch; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinitionMatch; final class HookDefinitionMatch implements StepDefinitionMatch { private final HookDefinition hookDefinition; diff --git a/core/src/main/java/cucumber/runner/HookTestStep.java b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java similarity index 61% rename from core/src/main/java/cucumber/runner/HookTestStep.java rename to core/src/main/java/io/cucumber/core/runner/HookTestStep.java index b00fe3d9a2..3244f23bf2 100644 --- a/core/src/main/java/cucumber/runner/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.HookType; +import io.cucumber.core.api.event.HookType; -final class HookTestStep extends TestStep implements cucumber.api.HookTestStep { +final class HookTestStep extends TestStep implements io.cucumber.core.api.event.HookTestStep { private final HookType hookType; HookTestStep(HookType hookType, HookDefinitionMatch definitionMatch) { diff --git a/core/src/main/java/cucumber/runner/Match.java b/core/src/main/java/io/cucumber/core/runner/Match.java similarity index 61% rename from core/src/main/java/cucumber/runner/Match.java rename to core/src/main/java/io/cucumber/core/runner/Match.java index e21daba2bd..c4e2e8e07b 100644 --- a/core/src/main/java/cucumber/runner/Match.java +++ b/core/src/main/java/io/cucumber/core/runner/Match.java @@ -1,17 +1,17 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.Collections; import java.util.List; import static java.util.Objects.requireNonNull; -class Match { +abstract class Match { private final List arguments; private final String location; - public static final Match UNDEFINED = new Match(Collections.emptyList(), null); + public static final Match UNDEFINED = new UndefinedMatch(); Match(List arguments, String location) { requireNonNull(arguments, "argument may not be null"); @@ -27,4 +27,9 @@ public String getLocation() { return location; } + private static final class UndefinedMatch extends Match { + UndefinedMatch() { + super(Collections.emptyList(), null); + } + } } diff --git a/core/src/main/java/cucumber/runner/NoStepDefinition.java b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java similarity index 84% rename from core/src/main/java/cucumber/runner/NoStepDefinition.java rename to core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java index fb9611a579..aaa149812d 100644 --- a/core/src/main/java/cucumber/runner/NoStepDefinition.java +++ b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java @@ -1,7 +1,7 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runner/Options.java b/core/src/main/java/io/cucumber/core/runner/Options.java new file mode 100644 index 0000000000..68213f519e --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/Options.java @@ -0,0 +1,13 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.api.options.SnippetType; + +import java.util.List; + +public interface Options { + List getGlue(); + + boolean isDryRun(); + + SnippetType getSnippetType(); +} diff --git a/core/src/main/java/cucumber/runner/PickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java similarity index 93% rename from core/src/main/java/cucumber/runner/PickleStepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java index 876d2445d1..a2bc994c68 100644 --- a/core/src/main/java/cucumber/runner/PickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java @@ -1,14 +1,14 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; -import cucumber.runtime.CucumberException; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.StepDefinitionMatch; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.StepDefinitionMatch; +import io.cucumber.core.exception.CucumberException; import gherkin.pickles.PickleStep; import io.cucumber.cucumberexpressions.CucumberExpressionException; import io.cucumber.datatable.CucumberDataTableException; import io.cucumber.datatable.UndefinedDataTableTypeException; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.ArrayList; import java.util.List; @@ -20,7 +20,7 @@ class PickleStepDefinitionMatch extends Match implements StepDefinitionMatch { // to prevent it from ending up in the JSON. private final transient PickleStep step; - public PickleStepDefinitionMatch(List arguments, StepDefinition stepDefinition, String featurePath, PickleStep step) { + PickleStepDefinitionMatch(List arguments, StepDefinition stepDefinition, String featurePath, PickleStep step) { super(arguments, stepDefinition.getLocation(false)); this.stepDefinition = stepDefinition; this.featurePath = featurePath; diff --git a/core/src/main/java/cucumber/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java similarity index 88% rename from core/src/main/java/cucumber/runner/PickleStepTestStep.java rename to core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 9781c43aa1..84505680ca 100644 --- a/core/src/main/java/cucumber/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -1,13 +1,14 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.TestCase; -import cucumber.runtime.DefinitionArgument; +import io.cucumber.core.api.event.Argument; +import io.cucumber.core.api.event.TestCase; import gherkin.pickles.PickleStep; +import io.cucumber.core.event.EventBus; import java.util.Collections; import java.util.List; -class PickleStepTestStep extends TestStep implements cucumber.api.PickleStepTestStep { +final class PickleStepTestStep extends TestStep implements io.cucumber.core.api.event.PickleStepTestStep { private final String uri; private final PickleStep step; private final List afterStepHookSteps; @@ -78,7 +79,7 @@ public String getStepText() { } @Override - public List getDefinitionArgument() { + public List getDefinitionArgument() { return DefinitionArgument.createArguments(definitionMatch.getArguments()); } diff --git a/core/src/main/java/cucumber/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java similarity index 87% rename from core/src/main/java/cucumber/runner/Runner.java rename to core/src/main/java/io/cucumber/core/runner/Runner.java index 02f9df87e4..5faa8bb34f 100644 --- a/core/src/main/java/cucumber/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -1,31 +1,31 @@ -package cucumber.runner; - -import cucumber.api.HookType; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.SnippetsSuggestedEvent; -import cucumber.runtime.Backend; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; +package io.cucumber.core.runner; + +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.event.EventBus; import java.util.ArrayList; import java.util.Collection; import java.util.List; public final class Runner { - private final Glue glue = new Glue(); + private final CachingGlue glue = new CachingGlue(); private final EventBus bus; private final Collection backends; - private final RuntimeOptions runtimeOptions; + private final Options options; - public Runner(EventBus bus, Collection backends, RuntimeOptions runtimeOptions) { + public Runner(EventBus bus, Collection backends, Options options) { this.bus = bus; - this.runtimeOptions = runtimeOptions; + this.options = options; this.backends = backends; for (Backend backend : backends) { - backend.loadGlue(glue, runtimeOptions.getGlue()); + backend.loadGlue(glue, options.getGlue()); } } @@ -39,6 +39,7 @@ public void runPickle(PickleEvent pickle) { TestCase testCase = createTestCaseForPickle(pickle); testCase.run(bus); disposeBackendWorlds(); + glue.removeScenarioScopedGlue(); } public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { @@ -54,7 +55,7 @@ private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { addTestStepsForPickleSteps(testSteps, pickleEvent); addTestStepsForAfterHooks(afterHooks, pickleEvent.pickle.getTags()); } - return new TestCase(testSteps, beforeHooks, afterHooks, pickleEvent, runtimeOptions.isDryRun()); + return new TestCase(testSteps, beforeHooks, afterHooks, pickleEvent, options.isDryRun()); } private void addTestStepsForPickleSteps(List testSteps, PickleEvent pickleEvent) { @@ -65,7 +66,7 @@ private void addTestStepsForPickleSteps(List testSteps, Pick if (match == null) { List snippets = new ArrayList<>(); for (Backend backend : backends) { - List snippet = backend.getSnippet(step, "**KEYWORD**", runtimeOptions.getSnippetType().getFunctionNameGenerator()); + List snippet = backend.getSnippet(step, "**KEYWORD**", options.getSnippetType().getFunctionNameGenerator()); snippets.addAll(snippet); } if (!snippets.isEmpty()) { diff --git a/core/src/main/java/cucumber/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java similarity index 88% rename from core/src/main/java/cucumber/runner/Scenario.java rename to core/src/main/java/io/cucumber/core/runner/Scenario.java index 206120c8f8..1bb856b2b0 100644 --- a/core/src/main/java/cucumber/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -1,9 +1,10 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Result; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.WriteEvent; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.WriteEvent; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EventBus; import java.util.ArrayList; import java.util.Collection; @@ -13,7 +14,7 @@ import static java.util.Collections.max; -class Scenario implements cucumber.api.Scenario { +class Scenario implements io.cucumber.core.api.Scenario { private final List stepResults = new ArrayList(); private final EventBus bus; diff --git a/core/src/main/java/cucumber/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java similarity index 89% rename from core/src/main/java/cucumber/runner/TestCase.java rename to core/src/main/java/io/cucumber/core/runner/TestCase.java index 124146edc9..fd1a763e21 100644 --- a/core/src/main/java/cucumber/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -1,17 +1,18 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Result; -import cucumber.api.TestStep; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EventBus; import java.util.ArrayList; import java.util.List; -final class TestCase implements cucumber.api.TestCase { +final class TestCase implements io.cucumber.core.api.event.TestCase { private final PickleEvent pickleEvent; private final List testSteps; private final boolean dryRun; diff --git a/core/src/main/java/cucumber/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java similarity index 86% rename from core/src/main/java/cucumber/runner/TestStep.java rename to core/src/main/java/io/cucumber/core/runner/TestStep.java index 20c3aa9b5f..86e28b2b03 100644 --- a/core/src/main/java/cucumber/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -1,15 +1,16 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Pending; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.runtime.StepDefinitionMatch; +import io.cucumber.core.backend.Pending; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.backend.StepDefinitionMatch; +import io.cucumber.core.event.EventBus; import java.util.Arrays; -abstract class TestStep implements cucumber.api.TestStep { +abstract class TestStep implements io.cucumber.core.api.event.TestStep { private static final String[] ASSUMPTION_VIOLATED_EXCEPTIONS = { "org.junit.AssumptionViolatedException", "org.junit.internal.AssumptionViolatedException", diff --git a/core/src/main/java/cucumber/runner/TimeService.java b/core/src/main/java/io/cucumber/core/runner/TimeService.java similarity index 85% rename from core/src/main/java/cucumber/runner/TimeService.java rename to core/src/main/java/io/cucumber/core/runner/TimeService.java index 8cc31ebbdd..bc81e8ef12 100644 --- a/core/src/main/java/cucumber/runner/TimeService.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeService.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; public interface TimeService { long time(); diff --git a/core/src/main/java/cucumber/runner/TimeServiceEventBus.java b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java similarity index 78% rename from core/src/main/java/cucumber/runner/TimeServiceEventBus.java rename to core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java index 676c56e0a7..2ee9cc95c2 100644 --- a/core/src/main/java/cucumber/runner/TimeServiceEventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java @@ -1,4 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; + +import io.cucumber.core.event.AbstractEventBus; public final class TimeServiceEventBus extends AbstractEventBus { private final TimeService stopWatch; diff --git a/core/src/main/java/cucumber/runner/UndefinedPickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java similarity index 69% rename from core/src/main/java/cucumber/runner/UndefinedPickleStepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java index 90f25406aa..bd52292f34 100644 --- a/core/src/main/java/cucumber/runner/UndefinedPickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java @@ -1,12 +1,12 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import io.cucumber.stepexpression.Argument; -import cucumber.api.Scenario; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; import java.util.Collections; -class UndefinedPickleStepDefinitionMatch extends PickleStepDefinitionMatch { +final class UndefinedPickleStepDefinitionMatch extends PickleStepDefinitionMatch { UndefinedPickleStepDefinitionMatch(PickleStep step) { super(Collections.emptyList(), new NoStepDefinition(), null, step); diff --git a/core/src/main/java/cucumber/runner/UndefinedStepDefinitionException.java b/core/src/main/java/io/cucumber/core/runner/UndefinedStepDefinitionException.java similarity index 66% rename from core/src/main/java/cucumber/runner/UndefinedStepDefinitionException.java rename to core/src/main/java/io/cucumber/core/runner/UndefinedStepDefinitionException.java index 944e325fa5..832ea10dbe 100644 --- a/core/src/main/java/cucumber/runner/UndefinedStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedStepDefinitionException.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; final class UndefinedStepDefinitionException extends CucumberException { diff --git a/core/src/main/java/cucumber/runtime/BackendModuleBackendSupplier.java b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java similarity index 69% rename from core/src/main/java/cucumber/runtime/BackendModuleBackendSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java index ecda5dafb8..ac7968e940 100644 --- a/core/src/main/java/cucumber/runtime/BackendModuleBackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java @@ -1,12 +1,19 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.Reflections; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; import java.util.Collection; import java.util.List; +import java.util.Locale; import static java.util.Collections.singletonList; @@ -22,7 +29,7 @@ public final class BackendModuleBackendSupplier implements BackendSupplier { private final List packages; public BackendModuleBackendSupplier(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions) { - this(resourceLoader, classFinder, runtimeOptions, singletonList("cucumber.runtime")); + this(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber")); } BackendModuleBackendSupplier(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, List packages) { @@ -50,4 +57,17 @@ private Collection loadBackends() { return reflections.instantiateSubclasses(Backend.class, packages, new Class[]{ResourceLoader.class, TypeRegistry.class}, new Object[]{resourceLoader, typeRegistry}); } + private static final class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { + + @Override + public Locale locale() { + return Locale.ENGLISH; + } + + @Override + public void configureTypeRegistry(io.cucumber.core.api.TypeRegistry typeRegistry) { + //noop + } + + } } diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java new file mode 100644 index 0000000000..fc8ea6c9d0 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -0,0 +1,33 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.event.EventBus; + +import java.util.List; + +/** + * Supplies a list of features found on the the feature path provided to RuntimeOptions. + */ +public final class FeaturePathFeatureSupplier implements FeatureSupplier { + private final FeatureLoader featureLoader; + private final RuntimeOptions runtimeOptions; + private final EventBus bus; + + public FeaturePathFeatureSupplier(FeatureLoader featureLoader, RuntimeOptions runtimeOptions, EventBus bus) { + this.featureLoader = featureLoader; + this.runtimeOptions = runtimeOptions; + this.bus = bus; + } + + @Override + public List get() { + List features = featureLoader.load(runtimeOptions.getFeaturePaths(), System.out); + for (CucumberFeature feature : features) { + bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); + } + return features; + } +} diff --git a/core/src/main/java/cucumber/runtime/FeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java similarity index 54% rename from core/src/main/java/cucumber/runtime/FeatureSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java index e758495854..8d4ec971d4 100644 --- a/core/src/main/java/cucumber/runtime/FeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.CucumberFeature; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runtime/Invoker.java b/core/src/main/java/io/cucumber/core/runtime/Invoker.java new file mode 100644 index 0000000000..8fb4c5500f --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/Invoker.java @@ -0,0 +1,123 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; + +public final class Invoker { + + private Invoker() { + + } + + public static T timeout(Callback callback, long timeoutMillis) throws Throwable { + if (timeoutMillis == 0) { + return callback.call(); + } + + /* We need to ensure a happens before relation exists between these events; + * a. the timer setting the interrupt flag on the execution thread. + * b. terminating and cleaning up the timer + * To do this we synchronize on monitor. The atomic boolean is merely a convenient container. + */ + final Thread executionThread = Thread.currentThread(); + final Object monitor = new Object(); + final AtomicBoolean done = new AtomicBoolean(); + + ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + ScheduledFuture timer = executorService.schedule(new Runnable() { + @Override + public void run() { + synchronized (monitor) { + if (!done.get()) { + executionThread.interrupt(); + } + } + } + }, timeoutMillis, TimeUnit.MILLISECONDS); + + try { + T result = callback.call(); + // The callback may have been busy waiting. + if (Thread.interrupted()) { + throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); + } + return result; + } catch (InterruptedException timeout) { + throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); + } finally { + synchronized (monitor) { + done.set(true); + timer.cancel(true); + executorService.shutdownNow(); + // Clear the interrupted flag. It may have been set by the timer just before we returned the result. + Thread.interrupted(); + } + } + } + + public static Object invoke(final Object target, final Method method, long timeoutMillis, final Object... args) throws Throwable { + final Method targetMethod = targetMethod(target, method); + return timeout(new Callback() { + @Override + public Object call() throws Throwable { + boolean accessible = targetMethod.isAccessible(); + try { + targetMethod.setAccessible(true); + return targetMethod.invoke(target, args); + } catch (IllegalArgumentException e) { + throw new CucumberException("Failed to invoke " + MethodFormat.FULL.format(targetMethod) + + ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); + } catch (InvocationTargetException e) { + throw e.getTargetException(); + } catch (IllegalAccessException e) { + throw new CucumberException("Failed to invoke " + MethodFormat.FULL.format(targetMethod) + + ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); + } finally { + targetMethod.setAccessible(accessible); + } + } + }, timeoutMillis); + } + + private static Method targetMethod(final Object target, final Method method) throws NoSuchMethodException { + final Class targetClass = target.getClass(); + final Class declaringClass = method.getDeclaringClass(); + + // Immediately return the provided method if the class loaders are the same. + if (targetClass.getClassLoader().equals(declaringClass.getClassLoader())) { + return method; + } else { + // Check if the method is publicly accessible. Note that methods from interfaces are always public. + if (Modifier.isPublic(method.getModifiers())) { + return targetClass.getMethod(method.getName(), method.getParameterTypes()); + } + + // Loop through all the super classes until the declared method is found. + Class currentClass = targetClass; + while (currentClass != Object.class) { + try { + return currentClass.getDeclaredMethod(method.getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + currentClass = currentClass.getSuperclass(); + } + } + + // The method does not exist in the class hierarchy. + throw new NoSuchMethodException(String.valueOf(method)); + } + } + + public interface Callback { + T call() throws Throwable; + } +} diff --git a/core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java new file mode 100644 index 0000000000..df4dbb69e3 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java @@ -0,0 +1,7 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.runner.Runner; + +public interface RunnerSupplier { + Runner get(); +} diff --git a/core/src/main/java/cucumber/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java similarity index 60% rename from core/src/main/java/cucumber/runtime/Runtime.java rename to core/src/main/java/io/cucumber/core/runtime/Runtime.java index 83271c756e..0bc6cf1113 100644 --- a/core/src/main/java/cucumber/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,26 +1,33 @@ -package cucumber.runtime; - -import cucumber.api.Plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.RunnerSupplier; -import cucumber.runner.SingletonRunnerSupplier; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.formatter.Plugins; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureLoader; +package io.cucumber.core.runtime; + +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -29,15 +36,18 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import static io.cucumber.core.api.event.Result.SEVERITY; +import static java.util.Collections.emptyList; +import static java.util.Collections.max; +import static java.util.Collections.min; + /** * This is the main entry point for running Cucumber features from the CLI. */ -public class Runtime { +public final class Runtime { private final ExitStatus exitStatus; - private final RuntimeOptions runtimeOptions; - private final RunnerSupplier runnerSupplier; private final Filters filters; private final EventBus bus; @@ -45,31 +55,26 @@ public class Runtime { private final Plugins plugins; private final ExecutorService executor; - public Runtime(final Plugins plugins, - final RuntimeOptions runtimeOptions, - final EventBus bus, - final Filters filters, - final RunnerSupplier runnerSupplier, - final FeatureSupplier featureSupplier, - final ExecutorService executor) { + private Runtime(final Plugins plugins, + final ExitStatus exitStatus, + final EventBus bus, + final Filters filters, + final RunnerSupplier runnerSupplier, + final FeatureSupplier featureSupplier, + final ExecutorService executor) { this.plugins = plugins; - this.runtimeOptions = runtimeOptions; this.filters = filters; this.bus = bus; this.runnerSupplier = runnerSupplier; this.featureSupplier = featureSupplier; this.executor = executor; - this.exitStatus = new ExitStatus(runtimeOptions); - exitStatus.setEventPublisher(bus); + this.exitStatus = exitStatus; } public void run() { - final List features = featureSupplier.get(); bus.send(new TestRunStarted(bus.getTime())); - for (CucumberFeature feature : features) { - feature.sendTestSourceRead(bus); - } + final List features = featureSupplier.get(); final StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); @@ -110,27 +115,23 @@ public static class Builder { private EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - private RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private RuntimeOptions runtimeOptions; private BackendSupplier backendSupplier; private ResourceLoader resourceLoader; private ClassFinder classFinder; private FeatureSupplier featureSupplier; - private List additionalPlugins = Collections.emptyList(); + private List additionalPlugins = emptyList(); + private List runtimeOptionsArgs = emptyList(); private Builder() { } - public Builder withArg(final String arg) { - this.runtimeOptions = new RuntimeOptions(arg); - return this; - } - public Builder withArgs(final String... args) { return withArgs(Arrays.asList(args)); } public Builder withArgs(final List args) { - this.runtimeOptions = new RuntimeOptions(args); + this.runtimeOptionsArgs = args; return this; } @@ -179,22 +180,28 @@ public Runtime build() { ? this.resourceLoader : new MultiLoader(this.classLoader); + final RuntimeOptions runtimeOptions = this.runtimeOptions != null + ? this.runtimeOptions + : new RuntimeOptions(resourceLoader, runtimeOptionsArgs); + final ClassFinder classFinder = this.classFinder != null ? this.classFinder : new ResourceLoaderClassFinder(resourceLoader, this.classLoader); final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier - : new BackendModuleBackendSupplier(resourceLoader, classFinder, this.runtimeOptions); + : new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); - final Plugins plugins = new Plugins(this.classLoader, new PluginFactory(), this.eventBus, this.runtimeOptions); + final Plugins plugins = new Plugins(new PluginFactory(), this.eventBus, runtimeOptions); for (final Plugin plugin : additionalPlugins) { plugins.addPlugin(plugin); } + final ExitStatus exitStatus = new ExitStatus(runtimeOptions); + plugins.addPlugin(exitStatus); final RunnerSupplier runnerSupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalRunnerSupplier(this.runtimeOptions, eventBus, backendSupplier) - : new SingletonRunnerSupplier(this.runtimeOptions, eventBus, backendSupplier); + ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier) + : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier); final ExecutorService executor = runtimeOptions.isMultiThreaded() ? Executors.newFixedThreadPool(runtimeOptions.getThreads()) @@ -205,11 +212,11 @@ public Runtime build() { final FeatureSupplier featureSupplier = this.featureSupplier != null ? this.featureSupplier - : new FeaturePathFeatureSupplier(featureLoader, this.runtimeOptions); + : new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, this.eventBus); + + final Filters filters = new Filters(runtimeOptions); - final RerunFilters rerunFilters = new RerunFilters(this.runtimeOptions, featureLoader); - final Filters filters = new Filters(this.runtimeOptions, rerunFilters); - return new Runtime(plugins, this.runtimeOptions, eventBus, filters, runnerSupplier, featureSupplier, executor); + return new Runtime(plugins, exitStatus, eventBus, filters, runnerSupplier, featureSupplier, executor); } } @@ -245,4 +252,40 @@ public boolean awaitTermination(long timeout, TimeUnit unit) { return true; } } + + static final class ExitStatus implements ConcurrentEventListener { + private static final byte DEFAULT = 0x0; + private static final byte ERRORS = 0x1; + + private final List results = new ArrayList<>(); + private final RuntimeOptions runtimeOptions; + + private final EventHandler testCaseFinishedHandler = new EventHandler() { + @Override + public void receive(TestCaseFinished event) { + results.add(event.result); + } + }; + + ExitStatus(RuntimeOptions runtimeOptions) { + this.runtimeOptions = runtimeOptions; + } + + @Override + public void setEventPublisher(EventPublisher publisher) { + publisher.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); + } + + byte exitStatus() { + if (results.isEmpty()) { + return DEFAULT; + } + + if (runtimeOptions.isWip()) { + return min(results, SEVERITY).is(Result.Type.PASSED) ? ERRORS : DEFAULT; + } + + return max(results, SEVERITY).isOk(runtimeOptions.isStrict()) ? DEFAULT : ERRORS; + } + } } diff --git a/core/src/main/java/cucumber/runner/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java similarity index 70% rename from core/src/main/java/cucumber/runner/SingletonRunnerSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index 9e7c72c523..06702545d3 100644 --- a/core/src/main/java/cucumber/runner/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -1,14 +1,17 @@ -package cucumber.runner; +package io.cucumber.core.runtime; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runtime.RunnerSupplier; /** * Returns a single unique runner. - * + *

    * Not thread safe. */ -public class SingletonRunnerSupplier implements RunnerSupplier { +public final class SingletonRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final RuntimeOptions runtimeOptions; diff --git a/core/src/main/java/cucumber/runner/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java similarity index 87% rename from core/src/main/java/cucumber/runner/ThreadLocalRunnerSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index 4caa8eb33d..746d1525fc 100644 --- a/core/src/main/java/cucumber/runner/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -1,18 +1,19 @@ -package cucumber.runner; +package io.cucumber.core.runtime; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; -import cucumber.runner.AbstractEventBus; -import cucumber.runner.EventBus; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.event.AbstractEventBus; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.Runner; /** * Creates a distinct runner for each calling thread. Each runner has its own bus, backend- and glue-suppliers. *

    * Each runners bus passes all events to the event bus of this supplier. */ -public class ThreadLocalRunnerSupplier implements RunnerSupplier { +public final class ThreadLocalRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final RuntimeOptions runtimeOptions; diff --git a/core/src/main/java/cucumber/runtime/snippets/ArgumentPattern.java b/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java similarity index 92% rename from core/src/main/java/cucumber/runtime/snippets/ArgumentPattern.java rename to core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java index 83b378b5cf..c1e27ba7d9 100644 --- a/core/src/main/java/cucumber/runtime/snippets/ArgumentPattern.java +++ b/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java @@ -1,9 +1,9 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import java.util.regex.Matcher; import java.util.regex.Pattern; -class ArgumentPattern { +final class ArgumentPattern { private final Pattern pattern; private final String replacement; diff --git a/core/src/main/java/cucumber/runtime/snippets/Snippet.java b/core/src/main/java/io/cucumber/core/snippets/Snippet.java similarity index 97% rename from core/src/main/java/cucumber/runtime/snippets/Snippet.java rename to core/src/main/java/io/cucumber/core/snippets/Snippet.java index 91805708d5..be8be60daf 100644 --- a/core/src/main/java/cucumber/runtime/snippets/Snippet.java +++ b/core/src/main/java/io/cucumber/core/snippets/Snippet.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import java.lang.reflect.Type; import java.util.Map; diff --git a/core/src/main/java/cucumber/runtime/snippets/SnippetGenerator.java b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java similarity index 92% rename from core/src/main/java/cucumber/runtime/snippets/SnippetGenerator.java rename to core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index ecf285da0b..5c96dd048d 100644 --- a/core/src/main/java/cucumber/runtime/snippets/SnippetGenerator.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -1,5 +1,6 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.cucumberexpressions.GeneratedExpression; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTable; @@ -19,7 +20,7 @@ import static java.text.MessageFormat.format; -public class SnippetGenerator { +public final class SnippetGenerator { @SuppressWarnings("RegExpRedundantEscape") // Android can't parse unescaped braces. private static final ArgumentPattern[] DEFAULT_ARGUMENT_PATTERNS = new ArgumentPattern[]{ new ArgumentPattern(Pattern.compile("\\{.*?\\}")) @@ -35,7 +36,7 @@ public SnippetGenerator(Snippet snippet, ParameterTypeRegistry parameterTypeRegi this.generator = new CucumberExpressionGenerator(parameterTypeRegistry); } - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { List generatedExpressions = generator.generateExpressions(step.getText()); List snippets = new ArrayList<>(generatedExpressions.size()); @@ -54,7 +55,7 @@ public List getSnippet(PickleStep step, String keyword, FunctionNameGene return snippets; } - private String functionName(String sentence, FunctionNameGenerator functionNameGenerator) { + private String functionName(String sentence, SnippetType.FunctionNameGenerator functionNameGenerator) { if (functionNameGenerator == null) { return null; } diff --git a/core/src/main/java/io/cucumber/stepexpression/Argument.java b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java similarity index 57% rename from core/src/main/java/io/cucumber/stepexpression/Argument.java rename to core/src/main/java/io/cucumber/core/stepexpression/Argument.java index 963c2b3498..745df56f01 100644 --- a/core/src/main/java/io/cucumber/stepexpression/Argument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; public interface Argument { diff --git a/core/src/main/java/io/cucumber/stepexpression/ArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java similarity index 78% rename from core/src/main/java/io/cucumber/stepexpression/ArgumentMatcher.java rename to core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java index a56d846f29..b72e40afe2 100644 --- a/core/src/main/java/io/cucumber/stepexpression/ArgumentMatcher.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import gherkin.pickles.PickleStep; diff --git a/core/src/main/java/io/cucumber/stepexpression/DataTableArgument.java b/core/src/main/java/io/cucumber/core/stepexpression/DataTableArgument.java similarity index 94% rename from core/src/main/java/io/cucumber/stepexpression/DataTableArgument.java rename to core/src/main/java/io/cucumber/core/stepexpression/DataTableArgument.java index 94304643ad..f4a56a6fd8 100644 --- a/core/src/main/java/io/cucumber/stepexpression/DataTableArgument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/DataTableArgument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.datatable.DataTable; diff --git a/core/src/main/java/io/cucumber/stepexpression/DocStringArgument.java b/core/src/main/java/io/cucumber/core/stepexpression/DocStringArgument.java similarity index 92% rename from core/src/main/java/io/cucumber/stepexpression/DocStringArgument.java rename to core/src/main/java/io/cucumber/core/stepexpression/DocStringArgument.java index c803dd09fa..12c55d29d1 100644 --- a/core/src/main/java/io/cucumber/stepexpression/DocStringArgument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/DocStringArgument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; public final class DocStringArgument implements Argument { diff --git a/core/src/main/java/io/cucumber/stepexpression/DocStringTransformer.java b/core/src/main/java/io/cucumber/core/stepexpression/DocStringTransformer.java similarity index 64% rename from core/src/main/java/io/cucumber/stepexpression/DocStringTransformer.java rename to core/src/main/java/io/cucumber/core/stepexpression/DocStringTransformer.java index 75488a1c46..08f74d0821 100644 --- a/core/src/main/java/io/cucumber/stepexpression/DocStringTransformer.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/DocStringTransformer.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; interface DocStringTransformer { diff --git a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgument.java b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgument.java similarity index 93% rename from core/src/main/java/io/cucumber/stepexpression/ExpressionArgument.java rename to core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgument.java index c3d6eadd6c..5ec5e8c355 100644 --- a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.Group; diff --git a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java similarity index 96% rename from core/src/main/java/io/cucumber/stepexpression/ExpressionArgumentMatcher.java rename to core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java index d3525ce969..b68f060d7d 100644 --- a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgumentMatcher.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleString; diff --git a/core/src/main/java/io/cucumber/stepexpression/PickleTableConverter.java b/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java similarity index 83% rename from core/src/main/java/io/cucumber/stepexpression/PickleTableConverter.java rename to core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java index 62ea55956b..24354ee247 100644 --- a/core/src/main/java/io/cucumber/stepexpression/PickleTableConverter.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleRow; @@ -7,7 +7,12 @@ import java.util.ArrayList; import java.util.List; -class PickleTableConverter { +final class PickleTableConverter { + + private PickleTableConverter() { + + } + static List> toTable(PickleTable pickleTable) { List> table = new ArrayList>(); for (PickleRow pickleRow : pickleTable.getRows()) { diff --git a/core/src/main/java/io/cucumber/stepexpression/RawTableTransformer.java b/core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java similarity index 71% rename from core/src/main/java/io/cucumber/stepexpression/RawTableTransformer.java rename to core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java index 9071ad0938..594e9c3896 100644 --- a/core/src/main/java/io/cucumber/stepexpression/RawTableTransformer.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import java.util.List; diff --git a/core/src/main/java/io/cucumber/stepexpression/StepExpression.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java similarity index 97% rename from core/src/main/java/io/cucumber/stepexpression/StepExpression.java rename to core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java index 0733aa130b..99f7aced66 100644 --- a/core/src/main/java/io/cucumber/stepexpression/StepExpression.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.Expression; diff --git a/core/src/main/java/io/cucumber/stepexpression/StepExpressionFactory.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java similarity index 97% rename from core/src/main/java/io/cucumber/stepexpression/StepExpressionFactory.java rename to core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java index cd20a3d120..b90121a450 100644 --- a/core/src/main/java/io/cucumber/stepexpression/StepExpressionFactory.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java @@ -1,6 +1,6 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import io.cucumber.cucumberexpressions.UndefinedParameterTypeException; import io.cucumber.datatable.DataTableTypeRegistryTableConverter; import io.cucumber.datatable.DataTable; diff --git a/core/src/main/java/io/cucumber/stepexpression/TypeRegistry.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java similarity index 93% rename from core/src/main/java/io/cucumber/stepexpression/TypeRegistry.java rename to core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java index 387a14e3d1..0414224917 100644 --- a/core/src/main/java/io/cucumber/stepexpression/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.cucumberexpressions.ParameterTypeRegistry; @@ -9,7 +9,7 @@ import java.util.Locale; -public final class TypeRegistry implements cucumber.api.TypeRegistry { +public final class TypeRegistry implements io.cucumber.core.api.TypeRegistry { private final ParameterTypeRegistry parameterTypeRegistry; diff --git a/core/src/main/java/io/cucumber/stepexpression/TypeResolver.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java similarity index 87% rename from core/src/main/java/io/cucumber/stepexpression/TypeResolver.java rename to core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java index 088c70ee0d..8f83d5be57 100644 --- a/core/src/main/java/io/cucumber/stepexpression/TypeResolver.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import java.lang.reflect.Type; diff --git a/core/src/main/java/cucumber/util/FixJava.java b/core/src/main/java/io/cucumber/core/util/FixJava.java similarity index 52% rename from core/src/main/java/cucumber/util/FixJava.java rename to core/src/main/java/io/cucumber/core/util/FixJava.java index 6d6c831449..377353809e 100644 --- a/core/src/main/java/cucumber/util/FixJava.java +++ b/core/src/main/java/io/cucumber/core/util/FixJava.java @@ -1,17 +1,14 @@ -package cucumber.util; +package io.cucumber.core.util; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.io.Reader; -import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; public class FixJava { public static String join(List strings, String separator) { + //TODO: Java8 replace with StringJoiner. StringBuilder sb = new StringBuilder(); int i = 0; for (String s : strings) { @@ -23,6 +20,7 @@ public static String join(List strings, String separator) { } public static List map(List objects, Mapper mapper) { + //TODO: Java8 replace with lambda List result = new ArrayList(objects.size()); for (T o : objects) { result.add(mapper.map(o)); @@ -30,15 +28,6 @@ public static List map(List objects, Mapper mapper) { return result; } - public static String readResource(String resourcePath) throws RuntimeException { - try { - Reader reader = new InputStreamReader(FixJava.class.getResourceAsStream(resourcePath), "UTF-8"); - return readReader(reader); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - public static String readReader(Reader in) throws RuntimeException { try { StringBuilder buffer = new StringBuilder(); @@ -54,19 +43,4 @@ public static String readReader(Reader in) throws RuntimeException { } } - public static byte[] readStream(InputStream in) throws RuntimeException { - try { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - final byte[] data = new byte[0x10000]; - int read; - - while ((read = in.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, read); - } - buffer.flush(); - return buffer.toByteArray(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } } diff --git a/core/src/main/java/cucumber/util/Mapper.java b/core/src/main/java/io/cucumber/core/util/Mapper.java similarity index 62% rename from core/src/main/java/cucumber/util/Mapper.java rename to core/src/main/java/io/cucumber/core/util/Mapper.java index 3e648e3994..06b321ffb7 100644 --- a/core/src/main/java/cucumber/util/Mapper.java +++ b/core/src/main/java/io/cucumber/core/util/Mapper.java @@ -1,4 +1,4 @@ -package cucumber.util; +package io.cucumber.core.util; public interface Mapper { R map(T o); diff --git a/core/src/main/resources/cucumber/api/cli/USAGE.txt b/core/src/main/resources/io/cucumber/core/api/cli/USAGE.txt similarity index 100% rename from core/src/main/resources/cucumber/api/cli/USAGE.txt rename to core/src/main/resources/io/cucumber/core/api/cli/USAGE.txt diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen-sprite.png b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen-sprite.png similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen-sprite.png rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen-sprite.png diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen.jquery.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.jquery.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen.jquery.min.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.jquery.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen.min.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.min.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen.min.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.min.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen.override.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.override.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen.override.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.override.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/formatter.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/formatter.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/formatter.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/formatter.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/index.html b/core/src/main/resources/io/cucumber/core/plugin/timeline/index.html similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/index.html rename to core/src/main/resources/io/cucumber/core/plugin/timeline/index.html diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/jquery-3.3.1.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/jquery-3.3.1.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/jquery-3.3.1.min.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/jquery-3.3.1.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/report.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/report.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/report.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/report.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/vis.min.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/vis.min.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/vis.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/vis.min.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/vis.override.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.override.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/vis.override.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/vis.override.css diff --git a/core/src/main/resources/cucumber/version.properties b/core/src/main/resources/io/cucumber/core/version.properties similarity index 100% rename from core/src/main/resources/cucumber/version.properties rename to core/src/main/resources/io/cucumber/core/version.properties diff --git a/core/src/test/java/cucumber/runtime/UtilsTest.java b/core/src/test/java/cucumber/runtime/UtilsTest.java deleted file mode 100644 index 2e298f5d11..0000000000 --- a/core/src/test/java/cucumber/runtime/UtilsTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package cucumber.runtime; - -import org.junit.Test; - -import java.net.MalformedURLException; -import java.net.URL; - -import static cucumber.runtime.Utils.isInstantiable; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class UtilsTest { - @Test - public void public_non_static_inner_classes_are_not_instantiable() { - assertFalse(isInstantiable(NonStaticInnerClass.class)); - } - - @Test - public void public_static_inner_classes_are_instantiable() { - assertTrue(isInstantiable(StaticInnerClass.class)); - } - - public class NonStaticInnerClass { - } - - public static class StaticInnerClass { - } - - @Test - public void test_url() throws MalformedURLException { - URL dotCucumber = Utils.toURL("foo/bar/.cucumber"); - URL url = new URL(dotCucumber, "stepdefs.json"); - assertEquals(new URL("file:foo/bar/.cucumber/stepdefs.json"), url); - } -} diff --git a/core/src/test/java/cucumber/api/event/CanonicalEventOrderTest.java b/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java similarity index 93% rename from core/src/test/java/cucumber/api/event/CanonicalEventOrderTest.java rename to core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java index e05d71f754..3efe00fce2 100644 --- a/core/src/test/java/cucumber/api/event/CanonicalEventOrderTest.java +++ b/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java @@ -1,7 +1,14 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; -import cucumber.api.TestCase; +import io.cucumber.core.api.event.TestCase; import gherkin.pickles.PickleLocation; +import io.cucumber.core.api.event.CanonicalEventOrder; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.api.event.TestSourceRead; import org.junit.Test; import java.util.Arrays; diff --git a/core/src/test/java/cucumber/api/ResultTest.java b/core/src/test/java/io/cucumber/core/api/event/ResultTest.java similarity index 86% rename from core/src/test/java/cucumber/api/ResultTest.java rename to core/src/test/java/io/cucumber/core/api/event/ResultTest.java index 05e521e1ef..2b9f5fc4e7 100644 --- a/core/src/test/java/cucumber/api/ResultTest.java +++ b/core/src/test/java/io/cucumber/core/api/event/ResultTest.java @@ -1,16 +1,17 @@ -package cucumber.api; +package io.cucumber.core.api.event; +import io.cucumber.core.api.event.Result; import org.junit.Test; import java.util.List; -import static cucumber.api.Result.SEVERITY; -import static cucumber.api.Result.Type.AMBIGUOUS; -import static cucumber.api.Result.Type.FAILED; -import static cucumber.api.Result.Type.PASSED; -import static cucumber.api.Result.Type.PENDING; -import static cucumber.api.Result.Type.SKIPPED; -import static cucumber.api.Result.Type.UNDEFINED; +import static io.cucumber.core.api.event.Result.SEVERITY; +import static io.cucumber.core.api.event.Result.Type.AMBIGUOUS; +import static io.cucumber.core.api.event.Result.Type.FAILED; +import static io.cucumber.core.api.event.Result.Type.PASSED; +import static io.cucumber.core.api.event.Result.Type.PENDING; +import static io.cucumber.core.api.event.Result.Type.SKIPPED; +import static io.cucumber.core.api.event.Result.Type.UNDEFINED; import static java.util.Arrays.asList; import static java.util.Collections.sort; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/core/src/test/java/cucumber/runtime/StubBackend.java b/core/src/test/java/io/cucumber/core/backend/StubBackend.java similarity index 70% rename from core/src/test/java/cucumber/runtime/StubBackend.java rename to core/src/test/java/io/cucumber/core/backend/StubBackend.java index fbc9c07790..e9f4fa88ab 100644 --- a/core/src/test/java/cucumber/runtime/StubBackend.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackend.java @@ -1,11 +1,10 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.io.ResourceLoader; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; -import java.util.Collections; import java.util.List; import static java.util.Collections.emptyList; @@ -33,7 +32,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return emptyList(); } } diff --git a/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java b/core/src/test/java/io/cucumber/core/filter/LinePredicateTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java rename to core/src/test/java/io/cucumber/core/filter/LinePredicateTest.java index b989b2e73e..46ae146be6 100644 --- a/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/LinePredicateTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/cucumber/runtime/filter/NamePredicateTest.java b/core/src/test/java/io/cucumber/core/filter/NamePredicateTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/filter/NamePredicateTest.java rename to core/src/test/java/io/cucumber/core/filter/NamePredicateTest.java index c04cda7a6f..365fc206ea 100644 --- a/core/src/test/java/cucumber/runtime/filter/NamePredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/NamePredicateTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/cucumber/runtime/filter/TagPredicateTest.java b/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java similarity index 99% rename from core/src/test/java/cucumber/runtime/filter/TagPredicateTest.java rename to core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java index ea7b0ccaec..e083270aa4 100644 --- a/core/src/test/java/cucumber/runtime/filter/TagPredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java b/core/src/test/java/io/cucumber/core/io/DelegatingResourceIteratorFactoryTest.java similarity index 96% rename from core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java rename to core/src/test/java/io/cucumber/core/io/DelegatingResourceIteratorFactoryTest.java index 72eb9e47c4..f8d1ab49d8 100644 --- a/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/io/DelegatingResourceIteratorFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/io/FileResourceTest.java b/core/src/test/java/io/cucumber/core/io/FileResourceTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/io/FileResourceTest.java rename to core/src/test/java/io/cucumber/core/io/FileResourceTest.java index b5d1e8cf35..ecdb5baefb 100644 --- a/core/src/test/java/cucumber/runtime/io/FileResourceTest.java +++ b/core/src/test/java/io/cucumber/core/io/FileResourceTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/io/FlatteningIteratorTest.java b/core/src/test/java/io/cucumber/core/io/FlatteningIteratorTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/io/FlatteningIteratorTest.java rename to core/src/test/java/io/cucumber/core/io/FlatteningIteratorTest.java index 3abf56c8bb..e5e7b2e6a3 100644 --- a/core/src/test/java/cucumber/runtime/io/FlatteningIteratorTest.java +++ b/core/src/test/java/io/cucumber/core/io/FlatteningIteratorTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/io/HelpersTest.java b/core/src/test/java/io/cucumber/core/io/HelpersTest.java similarity index 93% rename from core/src/test/java/cucumber/runtime/io/HelpersTest.java rename to core/src/test/java/io/cucumber/core/io/HelpersTest.java index ab482d2356..9826890324 100644 --- a/core/src/test/java/cucumber/runtime/io/HelpersTest.java +++ b/core/src/test/java/io/cucumber/core/io/HelpersTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; @@ -10,8 +10,8 @@ import java.net.URLConnection; import java.net.URLStreamHandler; -import static cucumber.runtime.io.Helpers.filePath; -import static cucumber.runtime.io.Helpers.jarFilePath; +import static io.cucumber.core.io.Helpers.filePath; +import static io.cucumber.core.io.Helpers.jarFilePath; import static org.junit.Assert.assertEquals; public class HelpersTest { diff --git a/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java similarity index 88% rename from core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java rename to core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java index 79dcf26509..77b4987af4 100644 --- a/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; @@ -26,14 +26,14 @@ public void loads_resources_from_filesystem_dir() { @Test public void loads_resource_from_filesystem_file() { - File file = new File(dir, "cucumber/runtime/bar.properties"); + File file = new File(dir, "io/cucumber/core/bar.properties"); Iterable files = new FileResourceLoader().resources(file.getPath(), ".doesntmatter"); assertEquals(1, toList(files).size()); } @Test public void loads_resources_from_jar_on_classpath() throws IOException { - Iterable files = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader()).resources("cucumber", ".properties"); + Iterable files = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader()).resources("io/cucumber", ".properties"); assertEquals(4, toList(files).size()); } diff --git a/core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java b/core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java new file mode 100644 index 0000000000..9bf3e79379 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java @@ -0,0 +1,10 @@ +package io.cucumber.core.io; + + +public class TestClasspathResourceLoader { + + public static ResourceLoader create(ClassLoader classLoader) { + return new ClasspathResourceLoader(classLoader); + } + +} \ No newline at end of file diff --git a/core/src/test/java/cucumber/runtime/io/TestResourceIterator.java b/core/src/test/java/io/cucumber/core/io/TestResourceIterator.java similarity index 93% rename from core/src/test/java/cucumber/runtime/io/TestResourceIterator.java rename to core/src/test/java/io/cucumber/core/io/TestResourceIterator.java index 38e2bc5eb5..78f294120e 100644 --- a/core/src/test/java/cucumber/runtime/io/TestResourceIterator.java +++ b/core/src/test/java/io/cucumber/core/io/TestResourceIterator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.util.Iterator; import java.util.NoSuchElementException; diff --git a/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java b/core/src/test/java/io/cucumber/core/io/TestResourceIteratorFactory.java similarity index 94% rename from core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java rename to core/src/test/java/io/cucumber/core/io/TestResourceIteratorFactory.java index 327005e683..3d5331db4a 100644 --- a/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java +++ b/core/src/test/java/io/cucumber/core/io/TestResourceIteratorFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.net.URL; import java.util.Iterator; diff --git a/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java b/core/src/test/java/io/cucumber/core/io/ZipResourceIteratorFactoryTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java rename to core/src/test/java/io/cucumber/core/io/ZipResourceIteratorFactoryTest.java index 34649647d8..d0bf288e3b 100644 --- a/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/io/ZipResourceIteratorFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java b/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java new file mode 100644 index 0000000000..bd5cf76471 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java @@ -0,0 +1,115 @@ +package io.cucumber.core.model; + +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class CucumberFeatureTest { + + private final PrintStream printStream = new PrintStream(new ByteArrayOutputStream()); + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void succeeds_if_no_features_are_found() { + ResourceLoader resourceLoader = mock(ResourceLoader.class); + when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); + + new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), printStream); + } + + @Test + public void logs_message_if_no_features_are_found() { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ResourceLoader resourceLoader = mock(ResourceLoader.class); + when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); + + new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), new PrintStream(baos)); + + assertEquals(String.format("No features found at [does/not/exist]%n"), baos.toString()); + } + + @Test + public void logs_message_if_no_feature_paths_are_given() { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ResourceLoader resourceLoader = mock(ResourceLoader.class); + + new FeatureLoader(resourceLoader).load(Collections.emptyList(), new PrintStream(baos)); + + assertEquals(String.format("Got no path to feature directory or feature file%n"), baos.toString()); + } + + @Test + public void loads_features_specified_in_rerun_file_from_classpath_when_not_in_file_system() throws Exception { + String featurePath = "path/bar.feature"; + String feature = "" + + "Feature: bar\n" + + " Scenario: scenario bar\n" + + " * step\n"; + ResourceLoader resourceLoader = mockFeatureFileResource("classpath:" + featurePath, feature); + mockFeaturePathToNotExist(resourceLoader, featurePath); + + List features = new FeatureLoader(resourceLoader).load(singletonList(featurePath), printStream); + + assertEquals(1, features.size()); + assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); + assertEquals("scenario bar", features.get(0).getGherkinFeature().getFeature().getChildren().get(0).getName()); + } + + @Test + public void gives_error_message_if_path_from_rerun_file_does_not_exist() { + String featurePath = "path/bar.feature"; + ResourceLoader resourceLoader = mock(ResourceLoader.class); + mockFeaturePathToNotExist(resourceLoader, featurePath); + mockFeaturePathToNotExist(resourceLoader, "classpath:" + featurePath); + + expectedException.expectMessage( + "Neither found on file system or on classpath: " + + "Not a file or directory: path/bar.feature, No resource found for: classpath:path/bar.feature"); + new FeatureLoader(resourceLoader).load(singletonList(featurePath), printStream); + } + + + private ResourceLoader mockFeatureFileResource(String featurePath, String feature) throws IOException { + ResourceLoader resourceLoader = mock(ResourceLoader.class); + mockFeatureFileResource(resourceLoader, featurePath, feature); + return resourceLoader; + } + + private void mockFeatureFileResource(ResourceLoader resourceLoader, String featurePath, String feature) + throws IOException { + mockFileResource(resourceLoader, featurePath, feature); + } + + private void mockFileResource(ResourceLoader resourceLoader, String path, String contents) throws IOException { + Resource resource = mock(Resource.class); + when(resource.getPath()).thenReturn(path); + when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(contents.getBytes(UTF_8))); + when(resourceLoader.resources(path, ".feature")).thenReturn(singletonList(resource)); + } + + private void mockFeaturePathToNotExist(ResourceLoader resourceLoader, String featurePath) { + if (featurePath.startsWith("classpath")) { + when(resourceLoader.resources(featurePath, ".feature")).thenReturn(new ArrayList<>()); + } else { + when(resourceLoader.resources(featurePath, ".feature")).thenThrow(new IllegalArgumentException("Not a file or directory: " + featurePath)); + } + } + +} diff --git a/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java b/core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java rename to core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java index 354fc14bdc..fb84548afe 100644 --- a/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java +++ b/core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.io.Resource; +import io.cucumber.core.io.Resource; import org.junit.Test; import java.io.ByteArrayInputStream; diff --git a/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java b/core/src/test/java/io/cucumber/core/model/PathWithLinesTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java rename to core/src/test/java/io/cucumber/core/model/PathWithLinesTest.java index 5b1a24ab60..75c60c1a74 100644 --- a/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java +++ b/core/src/test/java/io/cucumber/core/model/PathWithLinesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/EnvTest.java b/core/src/test/java/io/cucumber/core/options/EnvTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/EnvTest.java rename to core/src/test/java/io/cucumber/core/options/EnvTest.java index a2a14a8c1a..0831bde6e2 100644 --- a/core/src/test/java/cucumber/runtime/EnvTest.java +++ b/core/src/test/java/io/cucumber/core/options/EnvTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java new file mode 100644 index 0000000000..3bc318f0f1 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java @@ -0,0 +1,200 @@ +package io.cucumber.core.options; + +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Properties; + +import static io.cucumber.core.options.Env.INSTANCE; +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Arrays.asList; +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class RerunFileTest { + + @Test + public void loads_features_specified_in_rerun_file() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "path/bar.feature:2\n" + + "path/foo.feature:4\n"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains( + "path/bar.feature", + "path/foo.feature" + )); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("path/bar.feature", singletonList(2L)); + put("path/foo.feature", singletonList(4L)); + } + })); + } + + @Test + public void loads_no_features_when_rerun_file_is_empty() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "" + ); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void loads_no_features_when_rerun_file_contains_new_line() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "\n" + ); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void loads_no_features_when_rerun_file_contains_carriage_return() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "\r"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void loads_no_features_when_rerun_file_contains_new_line_and_carriage_return() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "\r\n"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void last_new_line_is_optinal() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "path/bar.feature:2\npath/foo.feature:4" + ); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains("path/bar.feature", "path/foo.feature")); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("path/bar.feature", singletonList(2L)); + put("path/foo.feature", singletonList(4L)); + } + })); + } + + + @Test + public void understands_whitespace_in_rerun_filepath() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "rerun.txt", + "/home/users/mp/My Documents/tests/bar.feature:2\n"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains("/home/users/mp/My Documents/tests/bar.feature")); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("/home/users/mp/My Documents/tests/bar.feature", singletonList(2L)); + } + })); + } + + + @Test + public void understands_rerun_files_separated_by_with_whitespace() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "/home/users/mp/My Documents/tests/bar.feature:2 /home/users/mp/My Documents/tests/foo.feature:4"); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + assertThat(runtimeOptions.getFeaturePaths(), contains( + "/home/users/mp/My Documents/tests/bar.feature", + "/home/users/mp/My Documents/tests/foo.feature" + )); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("/home/users/mp/My Documents/tests/bar.feature", singletonList(2L)); + put("/home/users/mp/My Documents/tests/foo.feature", singletonList(4L)); + } + })); + } + + @Test + public void understands_rerun_files_without_separation_in_rerun_filepath() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "/home/users/mp/My Documents/tests/bar.feature:2/home/users/mp/My Documents/tests/foo.feature:4" + ); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains( + "/home/users/mp/My Documents/tests/bar.feature", + "/home/users/mp/My Documents/tests/foo.feature" + )); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("/home/users/mp/My Documents/tests/bar.feature", singletonList(2L)); + put("/home/users/mp/My Documents/tests/foo.feature", singletonList(4L)); + } + })); + } + + @Test + public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() throws IOException { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "foo.feature:4" + ); + + Properties properties = new Properties(); + properties.setProperty("cucumber.options", "@path/rerun.txt"); + Env env = new Env(properties); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, env, + asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); + + assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + } + + private ResourceLoader mockFileResource(String path, String contents) throws IOException { + ResourceLoader resourceLoader = mock(ResourceLoader.class); + Resource resource = mock(Resource.class); + when(resource.getPath()).thenReturn(path); + when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(contents.getBytes(UTF_8))); + when(resourceLoader.resources(path, null)).thenReturn(singletonList(resource)); + return resourceLoader; + } + +} diff --git a/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java similarity index 78% rename from core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java rename to core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index b198485398..639c4558f4 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -1,20 +1,21 @@ -package cucumber.runtime; - -import cucumber.api.CucumberOptions; -import cucumber.api.Plugin; -import cucumber.api.SnippetType; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.formatter.Plugins; +package io.cucumber.core.options; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; import org.junit.Test; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; -import static cucumber.runtime.RuntimeOptionsFactory.packageName; -import static cucumber.runtime.RuntimeOptionsFactory.packagePath; +import static io.cucumber.core.options.RuntimeOptionsFactory.packageName; +import static io.cucumber.core.options.RuntimeOptionsFactory.packagePath; import static java.util.Arrays.asList; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.Assert.assertEquals; @@ -42,26 +43,26 @@ public void create_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); assertFalse(runtimeOptions.isStrict()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getFeaturePaths()); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); assertThat(plugins.getPlugins(), hasSize(2)); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void create_without_options_with_base_class_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptionsWithBaseClassWithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getFeaturePaths()); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); assertThat(plugins.getPlugins(), hasSize(2)); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test @@ -111,17 +112,17 @@ public void finds_path_for_class_in_toplevel_package() { public void create_default_summary_printer_when_no_summary_printer_plugin_is_defined() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithNoSummaryPrinterPlugin.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void inherit_plugin_from_baseclass() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithFormatter.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - List plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions).getPlugins(); - assertPluginExists(plugins, "cucumber.runtime.formatter.JSONFormatter"); - assertPluginExists(plugins, "cucumber.runtime.formatter.PrettyFormatter"); + List plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions).getPlugins(); + assertPluginExists(plugins, "io.cucumber.core.plugin.JSONFormatter"); + assertPluginExists(plugins, "io.cucumber.core.plugin.PrettyFormatter"); } @Test @@ -163,7 +164,7 @@ public void create_with_extra_glue() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithExtraGlue.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - assertEquals(asList("app.features.hooks", "classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(asList("app.features.hooks", "classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); } @Test @@ -171,7 +172,7 @@ public void create_with_extra_glue_in_subclass_of_extra_glue() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithExtraGlueOfExtraGlue.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - assertEquals(asList("app.features.user.hooks", "app.features.hooks", "classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(asList("app.features.user.hooks", "app.features.hooks", "classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); } @Test @@ -241,7 +242,7 @@ private static class BaseClassWithMonoChromeFalse { // empty } - @CucumberOptions(plugin = "cucumber.runtime.formatter.AnyStepDefinitionReporter") + @CucumberOptions(plugin = "io.cucumber.core.plugin.AnyStepDefinitionReporter") private static class ClassWithNoFormatterPlugin { // empty } diff --git a/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java similarity index 54% rename from core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java rename to core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 4324db7433..043c0251ee 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -1,27 +1,30 @@ -package cucumber.runtime; - -import cucumber.api.Plugin; -import cucumber.api.SnippetType; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.formatter.Plugins; +package io.cucumber.core.options; + +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Properties; import java.util.regex.Pattern; import static java.util.Arrays.asList; +import static java.util.Collections.singletonMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -29,6 +32,10 @@ public class RuntimeOptionsTest { + public final Env env = new Env(); + public final EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); + public final ResourceLoader resourceLoader = new MultiLoader(RuntimeOptionsTest.class.getClassLoader()); + @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -45,119 +52,118 @@ public void has_usage() { @Test public void assigns_feature_paths() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else"); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); } @Test public void strips_line_filters_from_feature_paths_and_put_them_among_line_filters() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else:3"); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere", "somewhere_else:3"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); - Map> expectedLineFilters = new HashMap>(Collections.singletonMap("somewhere_else", asList(3L))); - assertEquals(expectedLineFilters, options.getLineFilters()); + assertEquals(singletonMap("somewhere_else", asList(3L)), options.getLineFilters()); } @Test public void assigns_filters_from_tags() { - RuntimeOptions options = new RuntimeOptions("--tags @keep_this somewhere_else"); + RuntimeOptions options = createRuntimeOptions("--tags", "@keep_this", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); assertEquals(asList("@keep_this"), options.getTagFilters()); } @Test public void strips_options() { - RuntimeOptions options = new RuntimeOptions(" --glue somewhere somewhere_else"); + RuntimeOptions options = createRuntimeOptions(" --glue", "somewhere", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); } @Test public void assigns_glue() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere"); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); assertEquals(asList("somewhere"), options.getGlue()); } @Test public void creates_html_formatter() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertEquals("cucumber.runtime.formatter.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); + RuntimeOptions options = createRuntimeOptions("--plugin", "html:target/cucumber-reports", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertEquals("io.cucumber.core.plugin.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_as_default() { - RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertEquals("cucumber.runtime.formatter.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertEquals("io.cucumber.core.plugin.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "cucumber.runtime.formatter.AnyStepDefinitionReporter", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); + RuntimeOptions options = createRuntimeOptions("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); } @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + RuntimeOptions options = createRuntimeOptions("--plugin", "pretty", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void creates_null_summary_printer() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + RuntimeOptions options = createRuntimeOptions("--plugin", "null_summary", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); + assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void assigns_strict() { - RuntimeOptions options = new RuntimeOptions(asList("--strict", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--strict", "--glue", "somewhere"); assertTrue(options.isStrict()); } @Test public void assigns_strict_short() { - RuntimeOptions options = new RuntimeOptions(asList("-s", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("-s", "--glue", "somewhere"); assertTrue(options.isStrict()); } @Test public void default_strict() { - RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); assertFalse(options.isStrict()); } @Test public void assigns_wip() { - RuntimeOptions options = new RuntimeOptions(asList("--wip", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--wip", "--glue", "somewhere"); assertTrue(options.isWip()); } @Test public void assigns_wip_short() { - RuntimeOptions options = new RuntimeOptions(asList("-w", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("-w", "--glue", "somewhere"); assertTrue(options.isWip()); } @Test public void default_wip() { - RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); assertFalse(options.isWip()); } @Test public void name_without_spaces_is_preserved() { - RuntimeOptions options = new RuntimeOptions(asList("--name", "someName")); + RuntimeOptions options = createRuntimeOptions("--name", "someName"); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("someName", actualPattern.pattern()); } @Test public void name_with_spaces_is_preserved() { - RuntimeOptions options = new RuntimeOptions(asList("--name", "some Name")); + RuntimeOptions options = createRuntimeOptions("--name", "some Name"); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("some Name", actualPattern.pattern()); } @@ -166,27 +172,27 @@ public void name_with_spaces_is_preserved() { public void ensure_name_with_spaces_works_with_cucumber_options() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--name 'some Name'"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), Collections.emptyList()); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), Collections.emptyList()); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("some Name", actualPattern.pattern()); } @Test public void ensure_name_with_spaces_works_with_args() { - RuntimeOptions options = new RuntimeOptions("--name 'some Name'"); + RuntimeOptions options = createRuntimeOptions("--name", "some Name"); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("some Name", actualPattern.pattern()); } @Test public void assigns_single_junit_option() { - RuntimeOptions options = new RuntimeOptions(asList("--junit,option")); + RuntimeOptions options = createRuntimeOptions("--junit,option"); assertEquals(asList("option"), options.getJunitOptions()); } @Test public void assigns_multiple_junit_options() { - RuntimeOptions options = new RuntimeOptions(asList("--junit,option1,option2=value")); + RuntimeOptions options = createRuntimeOptions("--junit,option1,option2=value"); assertEquals(asList("option1", "option2=value"), options.getJunitOptions()); } @@ -194,7 +200,7 @@ public void assigns_multiple_junit_options() { public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--junit,option_from_property"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--junit,option_to_be_clobbered")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--junit,option_to_be_clobbered"); assertEquals(asList("option_from_property"), runtimeOptions.getJunitOptions()); } @@ -202,7 +208,7 @@ public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumb public void overrides_options_with_system_properties_without_clobbering_non_overridden_ones() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--strict", "--glue", "somewhere", "somewhere_else")); + RuntimeOptions options = createRuntimeOptions(properties, "--strict", "--glue", "somewhere", "somewhere_else"); assertEquals(asList("this_clobbers_feature_paths"), options.getFeaturePaths()); assertEquals(asList("lookatme"), options.getGlue()); assertTrue(options.isStrict()); @@ -212,7 +218,7 @@ public void overrides_options_with_system_properties_without_clobbering_non_over public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @foo"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--glue", "somewhere")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--glue", "somewhere"); assertEquals(asList("somewhere"), runtimeOptions.getGlue()); } @@ -220,7 +226,7 @@ public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined( public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @clobber_with_this"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@should_be_clobbered"); assertEquals(asList("@clobber_with_this"), runtimeOptions.getTagFilters()); } @@ -228,23 +234,16 @@ public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_p public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "path/file.feature:3"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@should_be_clobbered", "--name", "should_be_clobbered"); + assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); } - @Test - public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() { - Properties properties = new Properties(); - properties.setProperty("cucumber.options", "@rerun.txt"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); - } @Test public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--strict"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@keep_this"); assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); } @@ -252,7 +251,7 @@ public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_opti public void clobbers_features_from_cli_if_features_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "new newer"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("old", "older")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "old", "older"); assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); } @@ -260,7 +259,7 @@ public void clobbers_features_from_cli_if_features_specified_in_cucumber_options public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @Tag"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("path/file.feature:3")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "path/file.feature:3"); assertEquals(asList("path/file.feature"), runtimeOptions.getFeaturePaths()); } @@ -268,7 +267,7 @@ public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucu public void preserves_features_from_cli_if_features_not_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin pretty"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("old", "older")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "old", "older"); assertEquals(asList("old", "older"), runtimeOptions.getFeaturePaths()); } @@ -276,7 +275,7 @@ public void preserves_features_from_cli_if_features_not_specified_in_cucumber_op public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "new newer"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this", "path/file1.feature:1")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@keep_this", "path/file1.feature:1"); assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); } @@ -285,64 +284,64 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin pretty"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.PrettyFormatter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.HTMLFormatter"); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "html:target/cucumber-reports", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); + assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); } @Test public void adds_to_formatter_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin pretty"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.HTMLFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.PrettyFormatter"); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "html:target/cucumber-reports", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); } @Test public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin default_summary"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "null_summary", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); + assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); } @Test public void adds_to_summary_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin default_summary"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "null_summary", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin default_summary"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); -// assertPluginExists(options.getPlugins(), "cucumber.runtime.formatter.CucumberPrettyFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "pretty", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); +// assertPluginExists(options.getPlugins(), "io.cucumber.core.plugin.CucumberPrettyFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void allows_removal_of_strict_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--no-strict"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--strict")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--strict"); assertFalse(runtimeOptions.isStrict()); } @Test public void fail_on_unsupported_options() { try { - new RuntimeOptions(asList("-concreteUnsupportedOption", "somewhere", "somewhere_else")); + createRuntimeOptions("-concreteUnsupportedOption", "somewhere", "somewhere_else"); fail(); } catch (CucumberException e) { assertEquals("Unknown option: -concreteUnsupportedOption", e.getMessage()); @@ -351,13 +350,13 @@ public void fail_on_unsupported_options() { @Test public void threads_default_1() { - RuntimeOptions options = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions options = createRuntimeOptions(); assertEquals(1, options.getThreads()); } @Test public void ensure_threads_param_is_used() { - RuntimeOptions options = new RuntimeOptions(asList("--threads", "10")); + RuntimeOptions options = createRuntimeOptions("--threads", "10"); assertEquals(10, options.getThreads()); } @@ -365,7 +364,7 @@ public void ensure_threads_param_is_used() { public void ensure_less_than_1_thread_is_not_allowed() { expectedException.expect(CucumberException.class); expectedException.expectMessage("--threads must be > 0"); - new RuntimeOptions(asList("--threads", "0")); + createRuntimeOptions("--threads", "0"); } public static final class AwareFormatter implements StrictAware, ColorAware, EventListener { @@ -398,18 +397,17 @@ public void setEventPublisher(EventPublisher publisher) { } @Test - public void set_monochrome_on_color_aware_formatters() throws Exception { - RuntimeOptions options = new RuntimeOptions(new Env(), asList("--monochrome", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - plugins.getPlugins(); + public void set_monochrome_on_color_aware_formatters() { + RuntimeOptions options = createRuntimeOptions("--monochrome", "--plugin", AwareFormatter.class.getName()); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertTrue(formatter.isMonochrome()); } @Test - public void set_strict_on_strict_aware_formatters() throws Exception { - RuntimeOptions options = new RuntimeOptions(new Env(), asList("--strict", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + public void set_strict_on_strict_aware_formatters() { + RuntimeOptions options = createRuntimeOptions("--strict", "--plugin", AwareFormatter.class.getName()); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertTrue(formatter.isStrict()); } @@ -417,7 +415,7 @@ public void set_strict_on_strict_aware_formatters() throws Exception { @Test public void ensure_default_snippet_type_is_underscore() { Properties properties = new Properties(); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), Collections.emptyList()); + RuntimeOptions runtimeOptions = createRuntimeOptions(); assertEquals(SnippetType.UNDERSCORE, runtimeOptions.getSnippetType()); } @@ -425,10 +423,18 @@ public void ensure_default_snippet_type_is_underscore() { public void set_snippet_type() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--snippets camelcase"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), Collections.emptyList()); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties); assertEquals(SnippetType.CAMELCASE, runtimeOptions.getSnippetType()); } + private RuntimeOptions createRuntimeOptions(Properties properties, String... argv) { + return new RuntimeOptions(resourceLoader, new Env(properties), asList(argv)); + } + + private RuntimeOptions createRuntimeOptions(String... argv) { + return new RuntimeOptions(resourceLoader, new Env(), asList(argv)); + } + private void assertPluginExists(List plugins, String pluginName) { assertTrue(pluginName + " not found among the plugins", pluginExists(plugins, pluginName)); } diff --git a/core/src/test/java/cucumber/runtime/ShellwordsTest.java b/core/src/test/java/io/cucumber/core/options/ShellWordsTest.java similarity index 61% rename from core/src/test/java/cucumber/runtime/ShellwordsTest.java rename to core/src/test/java/io/cucumber/core/options/ShellWordsTest.java index 8640cd3d40..901842e19c 100644 --- a/core/src/test/java/cucumber/runtime/ShellwordsTest.java +++ b/core/src/test/java/io/cucumber/core/options/ShellWordsTest.java @@ -1,30 +1,28 @@ -package cucumber.runtime; +package io.cucumber.core.options; -import org.junit.Ignore; import org.junit.Test; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; -public class ShellwordsTest { - +public class ShellWordsTest { @Test public void parses_single_quoted_strings() { - assertEquals(asList("--name", "The Fox"), Shellwords.parse("--name 'The Fox'")); + assertEquals(asList("--name", "The Fox"), ShellWords.parse("--name 'The Fox'")); } @Test public void parses_double_quoted_strings() { - assertEquals(asList("--name", "The Fox"), Shellwords.parse("--name \"The Fox\"")); + assertEquals(asList("--name", "The Fox"), ShellWords.parse("--name \"The Fox\"")); } @Test public void parses_both_single_and_double_quoted_strings() { - assertEquals(asList("--name", "The Fox", "--fur", "Brown White"), Shellwords.parse("--name \"The Fox\" --fur 'Brown White'")); + assertEquals(asList("--name", "The Fox", "--fur", "Brown White"), ShellWords.parse("--name \"The Fox\" --fur 'Brown White'")); } @Test public void can_quote_both_single_and_double_quotes() { - assertEquals(asList("'", "\""), Shellwords.parse("\"'\" '\"'")); + assertEquals(asList("'", "\""), ShellWords.parse("\"'\" '\"'")); } } diff --git a/core/src/test/java/io/cucumber/core/options/TestPluginOption.java b/core/src/test/java/io/cucumber/core/options/TestPluginOption.java new file mode 100644 index 0000000000..357fc77cbb --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/TestPluginOption.java @@ -0,0 +1,10 @@ +package io.cucumber.core.options; + + +public class TestPluginOption { + + public static PluginOption parse(String pluginArgumentPattern){ + return PluginOption.parse(pluginArgumentPattern); + } + +} \ No newline at end of file diff --git a/core/src/test/java/cucumber/runtime/formatter/AnyStepDefinitionReporter.java b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java similarity index 68% rename from core/src/test/java/cucumber/runtime/formatter/AnyStepDefinitionReporter.java rename to core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java index eb07fa6478..b7a04b0d2f 100644 --- a/core/src/test/java/cucumber/runtime/formatter/AnyStepDefinitionReporter.java +++ b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java @@ -1,7 +1,7 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.backend.StepDefinition; public class AnyStepDefinitionReporter implements StepDefinitionReporter { diff --git a/core/src/test/java/cucumber/runtime/formatter/AverageUsageStatisticStrategyTest.java b/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/formatter/AverageUsageStatisticStrategyTest.java rename to core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java index 64d5744ee1..8429912bd5 100644 --- a/core/src/test/java/cucumber/runtime/formatter/AverageUsageStatisticStrategyTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/formatter/FormatterBuilder.java b/core/src/test/java/io/cucumber/core/plugin/FormatterBuilder.java similarity index 80% rename from core/src/test/java/cucumber/runtime/formatter/FormatterBuilder.java rename to core/src/test/java/io/cucumber/core/plugin/FormatterBuilder.java index 0b2d3880fd..e3db441bd1 100644 --- a/core/src/test/java/cucumber/runtime/formatter/FormatterBuilder.java +++ b/core/src/test/java/io/cucumber/core/plugin/FormatterBuilder.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; public class FormatterBuilder { diff --git a/core/src/test/java/cucumber/runtime/formatter/FormatterSpy.java b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java similarity index 81% rename from core/src/test/java/cucumber/runtime/formatter/FormatterSpy.java rename to core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java index 06612a5598..3abe54c488 100644 --- a/core/src/test/java/cucumber/runtime/formatter/FormatterSpy.java +++ b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java @@ -1,13 +1,13 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; public class FormatterSpy implements EventListener { StringBuilder calls = new StringBuilder(); diff --git a/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java similarity index 90% rename from core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index 175f211edf..0fd3ccab16 100644 --- a/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -1,11 +1,9 @@ -package cucumber.runtime.formatter; - -import cucumber.api.Result; -import cucumber.api.formatter.NiceAppendable; -import cucumber.runner.TestHelper; -import cucumber.runtime.Utils; -import cucumber.runtime.model.CucumberFeature; -import cucumber.util.FixJava; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.util.FixJava; import gherkin.deps.com.google.gson.JsonParser; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -25,15 +23,16 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static cucumber.runner.TestHelper.createEmbedHookAction; -import static cucumber.runner.TestHelper.createWriteHookAction; -import static cucumber.runner.TestHelper.feature; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; +import static io.cucumber.core.runner.TestHelper.createWriteHookAction; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; + public class HTMLFormatterTest { private final static String jsFunctionCallRegexString = "formatter.(\\w*)\\(([^)]*)\\);"; private final static Pattern jsFunctionCallRegex = Pattern.compile(jsFunctionCallRegexString); @@ -49,7 +48,7 @@ public class HTMLFormatterTest { private URL outputDir; public void writeReport() throws Throwable { - outputDir = Utils.toURL(TempDir.createTempDirectory().getAbsolutePath()); + outputDir = TempDir.createTempDirectory().toURI().toURL(); runFeaturesWithFormatter(outputDir); } @@ -68,35 +67,35 @@ public void writes_valid_report_js() throws Throwable { String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); assertJsFunctionCallSequence(asList("" + "formatter.uri(\"some\\\\windows\\\\path\\\\some.feature\");\n", - "formatter.feature({\n" + + "formatter.feature({\n" + " \"name\": \"\",\n" + " \"description\": \"\",\n" + " \"keyword\": \"Feature\"\n" + "});\n", - "formatter.scenario({\n" + + "formatter.scenario({\n" + " \"name\": \"some cukes\",\n" + " \"description\": \"\",\n" + " \"keyword\": \"Scenario\"\n" + "});\n", - "formatter.step({\n" + + "formatter.step({\n" + " \"name\": \"first step\",\n" + " \"keyword\": \"Given \"\n" + "});\n", - "formatter.match({\n" + + "formatter.match({\n" + " \"location\": \"path/step_definitions.java:3\"\n" + "});\n", - "formatter.result({\n" + + "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n", - "formatter.embedding(\"image/png\", \"embedded0.png\");\n", - "formatter.after({\n" + + "formatter.embedding(\"image/png\", \"embedded0.png\");\n", + "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n", - "formatter.embedding(\"text/plain\", \"dodgy stack trace here\");\n", - "formatter.after({\n" + + "formatter.embedding(\"text/plain\", \"dodgy stack trace here\");\n", + "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - reportJs); + reportJs); } @Test @@ -117,10 +116,10 @@ public void included_embedding() throws Throwable { @Test public void should_handle_a_single_scenario() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n" + - " Then second step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n" + + " Then second step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); @@ -162,19 +161,19 @@ public void should_handle_a_single_scenario() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});"), - formatterOutput); + formatterOutput); } @Test public void should_handle_backgound() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Background: background name\n" + - " Given first step\n" + - " Scenario: scenario 1\n" + - " Then second step\n" + - " Scenario: scenario 2\n" + - " Then third step\n"); + "Feature: feature name\n" + + " Background: background name\n" + + " Given first step\n" + + " Scenario: scenario 1\n" + + " Then second step\n" + + " Scenario: scenario 2\n" + + " Then third step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); @@ -247,20 +246,20 @@ public void should_handle_backgound() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test public void should_handle_scenario_outline() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario Outline: outline name\n" + - " Given first step\n" + - " Then step\n" + - " Examples: examples name\n" + - " | arg |\n" + - " | second |\n" + - " | third |\n"); + "Feature: feature name\n" + + " Scenario Outline: outline name\n" + + " Given first step\n" + + " Then step\n" + + " Examples: examples name\n" + + " | arg |\n" + + " | second |\n" + + " | third |\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); @@ -364,15 +363,15 @@ public void should_handle_scenario_outline() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});"), - formatterOutput); + formatterOutput); } @Test public void should_handle_before_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -400,15 +399,15 @@ public void should_handle_before_hooks() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test public void should_handle_after_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -436,7 +435,7 @@ public void should_handle_after_hooks() throws Throwable { "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test @@ -501,9 +500,9 @@ public void should_handle_after_step_hooks() throws Throwable { @Test public void should_handle_output_from_before_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -533,15 +532,15 @@ public void should_handle_output_from_before_hooks() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test public void should_handle_output_from_after_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -571,7 +570,7 @@ public void should_handle_output_from_after_hooks() throws Throwable { "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test @@ -632,9 +631,9 @@ public void should_handle_output_from_after_step_hooks() throws Throwable { @Test public void should_handle_text_embeddings_from_before_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -664,7 +663,7 @@ public void should_handle_text_embeddings_from_before_hooks() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } private void assertJsFunctionCallSequence(List expectedList, String actual) { @@ -729,9 +728,9 @@ private void assertContains(String substring, String string) { private void runFeaturesWithFormatter(URL outputDir) throws Throwable { final HTMLFormatter f = new HTMLFormatter(outputDir); CucumberFeature feature = feature("some\\windows\\path\\some.feature", "" + - "Feature:\n" + - " Scenario: some cukes\n" + - " Given first step\n"); + "Feature:\n" + + " Scenario: some cukes\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); diff --git a/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index c02962f4e6..7d89796185 100755 --- a/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -1,16 +1,18 @@ -package cucumber.runtime.formatter; - -import cucumber.api.Result; -import cucumber.runner.EventBus; -import cucumber.runner.TestBackendSupplier; -import cucumber.runner.TestHelper; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.TimeServiceStub; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.Runtime; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.snippets.FunctionNameGenerator; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.TestClasspathResourceLoader; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.runner.TestBackendSupplier; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.runtime.Runtime; +import io.cucumber.core.model.CucumberFeature; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import org.junit.Test; @@ -21,15 +23,14 @@ import java.io.IOException; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; -import static cucumber.runner.TestHelper.createEmbedHookAction; -import static cucumber.runner.TestHelper.createWriteHookAction; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; +import static io.cucumber.core.runner.TestHelper.createWriteHookAction; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.junit.Assert.assertThat; @@ -49,7 +50,7 @@ public class JSONFormatterTest { @Test public void featureWithOutlineTest() { - String actual = runFeaturesWithFormatter(asList("cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); + String actual = runFeaturesWithFormatter(asList("io/cucumber/core/plugin/JSONPrettyFormatterTest.feature")); String expected = new Scanner(getClass().getResourceAsStream("JSONPrettyFormatterTest.json"), "UTF-8").useDelimiter("\\A").next(); assertThat(actual, sameJSONAs(expected)); @@ -58,7 +59,7 @@ public void featureWithOutlineTest() { @Test public void featureWithOutlineTestParallel() throws Exception { - String actual = runFeaturesWithFormatterInParallel(asList("cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); + String actual = runFeaturesWithFormatterInParallel(asList("io/cucumber/core/plugin/JSONPrettyFormatterTest.feature")); String expected = new Scanner(getClass().getResourceAsStream("JSONPrettyFormatterTest.json"), "UTF-8").useDelimiter("\\A").next(); assertThat(actual, sameJSONAs(expected)); @@ -1132,7 +1133,7 @@ private String runFeaturesWithFormatterInParallel(final List featurePath File report = File.createTempFile("cucumber-jvm-junit", ".json"); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); List args = new ArrayList(); args.add("--threads"); @@ -1143,13 +1144,13 @@ private String runFeaturesWithFormatterInParallel(final List featurePath final TestBackendSupplier backendSupplier = new TestBackendSupplier() { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(hook); } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("TEST SNIPPET"); } }; @@ -1175,17 +1176,17 @@ private String runFeaturesWithFormatter(final List featurePaths) { when(hook.matches(ArgumentMatchers.anyList())).thenReturn(true); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); final TestBackendSupplier backendSupplier = new TestBackendSupplier() { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(hook); } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("TEST SNIPPET"); } }; diff --git a/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java similarity index 89% rename from core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index 7892e5c0ce..9b0bd91f18 100644 --- a/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -1,12 +1,8 @@ -package cucumber.runtime.formatter; - -import cucumber.api.Result; -import cucumber.runtime.Backend; -import cucumber.runner.TestHelper; -import cucumber.runtime.Utils; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.snippets.FunctionNameGenerator; -import gherkin.pickles.PickleStep; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.model.CucumberFeature; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; import org.junit.AssumptionViolatedException; @@ -28,13 +24,11 @@ import java.util.Map; import java.util.Scanner; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Arrays.asList; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class JUnitFormatterTest { @@ -48,27 +42,27 @@ public class JUnitFormatterTest { @Test public void featureSimpleTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_1.feature")); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_1.feature")); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml", report); } @Test public void featureWithBackgroundTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_2.feature")); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_2.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_2.feature")); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_2.report.xml", report); } @Test public void featureWithOutlineTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_3.feature")); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_3.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_3.feature")); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_3.report.xml", report); } @Test public void featureSimpleStrictTest() throws Exception { boolean strict = true; - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_1.feature"), strict); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_1_strict.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_1.feature"), strict); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_1_strict.report.xml", report); } @Test @@ -88,7 +82,7 @@ public void should_format_passed_scenario() throws Throwable { String formatterOutput = runFeaturesWithFormatter(); String expected = "\n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " " + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -73,8 +72,8 @@ public void testScenarioWithUndefinedStepsStrict() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -105,8 +104,8 @@ public final void testScenarioWithPendingSteps() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -130,11 +129,11 @@ public void testScenarioWithFailedSteps() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + - " " + + " " + " " + @@ -161,8 +160,8 @@ public final void testScenarioWithPassedSteps() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -189,8 +188,8 @@ public void testScenarioWithBackground() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -217,8 +216,8 @@ public void testScenarioOutlineWithExamples() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -253,8 +252,8 @@ public void testDurationCalculationOfStepsAndHooks() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -282,11 +281,11 @@ public void testScenarioWithFailedBeforeHook() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + - " " + + " " + " " + @@ -314,11 +313,11 @@ public void testScenarioWithFailedAfterHook() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + - " " + + " " + " " + @@ -347,7 +346,7 @@ public int differenceFound(Difference difference) { private String runFeaturesWithFormatter(boolean strict) throws IOException { final File tempFile = File.createTempFile("cucumber-jvm-testng", ".xml"); - final TestNGFormatter formatter = new TestNGFormatter(toURL(tempFile.getAbsolutePath())); + final TestNGFormatter formatter = new TestNGFormatter(tempFile.toURI().toURL()); formatter.setStrict(strict); TestHelper.builder() diff --git a/core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java b/core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java new file mode 100644 index 0000000000..53c6c46c38 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java @@ -0,0 +1,12 @@ +package io.cucumber.core.plugin; + + +import java.io.OutputStream; + +public class TestUTF8OutputStreamWriter { + + public static UTF8OutputStreamWriter create(OutputStream outputStream){ + return new UTF8OutputStreamWriter(outputStream); + } + +} \ No newline at end of file diff --git a/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java index 2d2bc836b1..9b89f6da08 100644 --- a/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java @@ -1,8 +1,8 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.Result; -import cucumber.runner.TestHelper; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.model.CucumberFeature; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import org.junit.Before; @@ -20,8 +20,8 @@ import java.util.Scanner; import java.util.concurrent.TimeUnit; -import static cucumber.runner.TestHelper.feature; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -36,7 +36,7 @@ public int compare(TimelineFormatter.TestData o1, TimelineFormatter.TestData o2) } }; - private static final String REPORT_TEMPLATE_RESOURCE_DIR = "src/main/resources/io/cucumber/formatter/timeline"; + private static final String REPORT_TEMPLATE_RESOURCE_DIR = "src/main/resources/io/cucumber/core/plugin/timeline"; private static final String REPORT_JS = "report.js"; private static final long STEP_DURATION_MS = 1000; diff --git a/core/src/test/java/cucumber/runtime/io/URLOutputStreamTest.java b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java similarity index 82% rename from core/src/test/java/cucumber/runtime/io/URLOutputStreamTest.java rename to core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java index 3c6ea23409..a86ca0264c 100644 --- a/core/src/test/java/cucumber/runtime/io/URLOutputStreamTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java @@ -1,7 +1,8 @@ -package cucumber.runtime.io; +package io.cucumber.core.plugin; -import cucumber.runtime.Utils; -import cucumber.util.FixJava; +import io.cucumber.core.plugin.TestUTF8OutputStreamWriter; +import io.cucumber.core.plugin.URLOutputStream; +import io.cucumber.core.util.FixJava; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -23,6 +24,7 @@ import java.io.Reader; import java.io.Writer; import java.net.InetSocketAddress; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -43,6 +45,16 @@ import static org.junit.Assert.fail; public class URLOutputStreamTest { + private static final URL CUCUMBER_STEPDEFS = createUrl("http://localhost:9873/.cucumber/stepdefs.json"); + + private static URL createUrl(String s) { + try { + return new URL(s); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + private WebServer webbit; private final int threadsCount = 100; private final long waitTimeoutMillis = 30000L; @@ -66,9 +78,10 @@ public void stopWebbit() throws ExecutionException, InterruptedException { public void write_to_file_without_existing_parent_directory() throws IOException, URISyntaxException { Path filesWithoutParent = Files.createTempDirectory("filesWithoutParent"); String baseURL = filesWithoutParent.toUri().toURL().toString(); - URL urlWithoutParentDirectory = new URL(baseURL + "/non/existing/directory"); + URL urlWithoutParentDirectory = createUrl(baseURL + "/non/existing/directory"); + - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(urlWithoutParentDirectory)); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(urlWithoutParentDirectory)); w.write("Hellesøy"); w.close(); @@ -79,25 +92,25 @@ public void write_to_file_without_existing_parent_directory() throws IOException @Test public void can_write_to_file() throws IOException { File tmp = File.createTempFile("cucumber-jvm", "tmp"); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(tmp.toURI().toURL())); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(tmp.toURI().toURL())); w.write("Hellesøy"); w.close(); assertEquals("Hellesøy", FixJava.readReader(openUTF8FileReader(tmp))); } @Test - public void can_http_put() throws IOException, ExecutionException, InterruptedException { + public void can_http_put() throws IOException, InterruptedException { final BlockingQueue data = new LinkedBlockingDeque(); Rest r = new Rest(webbit); r.PUT("/.cucumber/stepdefs.json", new HttpHandler() { @Override - public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) throws Exception { + public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) { data.offer(req.body()); res.end(); } }); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(new URL(Utils.toURL("http://localhost:9873/.cucumber"), "stepdefs.json"))); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); w.close(); @@ -105,8 +118,8 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl } @Test - public void throws_fnfe_if_http_response_is_404() throws IOException, ExecutionException, InterruptedException { - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(new URL(Utils.toURL("http://localhost:9873/.cucumber"), "stepdefs.json"))); + public void throws_fnfe_if_http_response_is_404() throws IOException { + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); try { @@ -117,18 +130,18 @@ public void throws_fnfe_if_http_response_is_404() throws IOException, ExecutionE } @Test - public void throws_ioe_if_http_response_is_500() throws IOException, ExecutionException, InterruptedException { + public void throws_ioe_if_http_response_is_500() throws IOException { Rest r = new Rest(webbit); r.PUT("/.cucumber/stepdefs.json", new HttpHandler() { @Override - public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) throws Exception { + public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) { res.status(500); res.content("something went wrong"); res.end(); } }); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(new URL(Utils.toURL("http://localhost:9873/.cucumber"), "stepdefs.json"))); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); try { @@ -136,7 +149,7 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl fail(); } catch (IOException expected) { assertEquals("PUT http://localhost:9873/.cucumber/stepdefs.json\n" + - "HTTP 500\nsomething went wrong", expected.getMessage()); + "HTTP 500\nsomething went wrong", expected.getMessage()); } } @@ -162,8 +175,8 @@ private List getThreadsWithLatchForFile(final CountDownLatch countDownLa final int curThreadNo = i; // It useful when 2-3 threads (not more) tries to create the same directory for the report final File tmp = (i % 3 == 0 || i % 3 == 2) ? - new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + i + "/tmpFile.tmp") : - new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + (i - 1) + "/tmpFile.tmp"); + new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + i + "/tmpFile.tmp") : + new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + (i - 1) + "/tmpFile.tmp"); tmpFiles.add(tmp); result.add(new Thread() { @Override diff --git a/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java similarity index 88% rename from core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java rename to core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index 67b72b4e6b..c6f9c34880 100644 --- a/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -1,10 +1,11 @@ -package cucumber.runtime; - -import cucumber.runner.TestHelper; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.TimeServiceStub; -import cucumber.runtime.model.CucumberFeature; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.model.CucumberFeature; import gherkin.pickles.PickleLocation; import org.junit.Test; @@ -50,7 +51,7 @@ public void uses_given_when_then_keywords() throws IOException { " Scenario: scenario name\n" + " Given A\n" + " Then B\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(4)), asList("**KEYWORD** ^B$")); assertEquals("[Then ^B$]", tracker.getSnippets().toString()); } @@ -66,7 +67,7 @@ public void converts_and_to_previous_step_keyword() throws IOException { " When A\n" + " And B\n" + " But C\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -83,11 +84,15 @@ public void backtrack_into_background_to_find_step_keyword() throws IOException " Scenario: scenario name\n" + " And B\n" + " But C\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } + private void sendTestSourceRead(EventBus bus, CucumberFeature feature) { + bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); + } + @Test public void doesnt_try_to_use_star_keyword() throws IOException { EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); @@ -99,7 +104,7 @@ public void doesnt_try_to_use_star_keyword() throws IOException { " When A\n" + " And B\n" + " * C\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -113,7 +118,7 @@ public void star_keyword_becomes_given_when_no_previous_step() throws IOExceptio "Feature: feature name\n" + " Scenario: scenario name\n" + " * A\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(3)), asList("**KEYWORD** ^A$")); assertEquals("[Given ^A$]", tracker.getSnippets().toString()); } @@ -128,7 +133,7 @@ public void snippets_are_generated_for_correct_locale() throws Exception { "Функция:\n" + " Сценарий: \n" + " * Б\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(4)), asList("**KEYWORD** ^Б$")); assertEquals("[Допустим ^Б$]", tracker.getSnippets().toString()); } @@ -138,7 +143,7 @@ private List locations(int line) { } private List locations() { - return Collections.emptyList(); + return Collections.emptyList(); } private String uri() { diff --git a/core/src/test/java/cucumber/runtime/formatter/UsageFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java similarity index 95% rename from core/src/test/java/cucumber/runtime/formatter/UsageFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java index 8e23c1f875..0c5ac99bbe 100644 --- a/core/src/test/java/cucumber/runtime/formatter/UsageFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; -import cucumber.api.event.TestStepFinished; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.TestStepFinished; import org.junit.Test; import org.mockito.Mockito; diff --git a/core/src/test/java/cucumber/runtime/MethodFormatTest.java b/core/src/test/java/io/cucumber/core/reflection/MethodFormatTest.java similarity index 89% rename from core/src/test/java/cucumber/runtime/MethodFormatTest.java rename to core/src/test/java/io/cucumber/core/reflection/MethodFormatTest.java index c491117e64..7efccef4dc 100644 --- a/core/src/test/java/cucumber/runtime/MethodFormatTest.java +++ b/core/src/test/java/io/cucumber/core/reflection/MethodFormatTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.reflection; import org.junit.Before; import org.junit.Test; @@ -41,6 +41,6 @@ public void shouldUseSimpleFormatWhenMethodHasNoException() { @Test public void prints_code_source() { String format = MethodFormat.FULL.format(methodWithoutArgs); - assertTrue(format.startsWith("cucumber.runtime.MethodFormatTest.methodWithoutArgs() in file:")); + assertTrue(format.startsWith("io.cucumber.core.reflection.MethodFormatTest.methodWithoutArgs() in file:")); } } diff --git a/core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java b/core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java new file mode 100644 index 0000000000..be7f9b74f8 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java @@ -0,0 +1,25 @@ +package io.cucumber.core.reflection; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ReflectionsTest { + @Test + public void public_non_static_inner_classes_are_not_instantiable() { + assertFalse(Reflections.isInstantiable(NonStaticInnerClass.class)); + } + + @Test + public void public_static_inner_classes_are_instantiable() { + assertTrue(Reflections.isInstantiable(StaticInnerClass.class)); + } + + public class NonStaticInnerClass { + } + + public static class StaticInnerClass { + } + +} diff --git a/core/src/test/java/cucumber/runner/AmbiguousStepDefinitionMatchsTest.java b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java similarity index 95% rename from core/src/test/java/cucumber/runner/AmbiguousStepDefinitionMatchsTest.java rename to core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java index 20c9190596..68c9c3c564 100644 --- a/core/src/test/java/cucumber/runner/AmbiguousStepDefinitionMatchsTest.java +++ b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; diff --git a/core/src/test/java/cucumber/runner/GlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java similarity index 90% rename from core/src/test/java/cucumber/runner/GlueTest.java rename to core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 115bfdeaf3..78ddcc792c 100644 --- a/core/src/test/java/cucumber/runner/GlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -1,16 +1,16 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.DuplicateStepDefinitionException; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.ArgumentMatcher; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -28,18 +28,18 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class GlueTest { +public class CachingGlueTest { - private Glue glue; + private CachingGlue glue; @Before public void setUp() { - glue = new Glue(); + glue = new CachingGlue(); } @Test public void throws_duplicate_error_on_dupe_stepdefs() { - Glue glue = new Glue(); + CachingGlue glue = new CachingGlue(); StepDefinition a = mock(StepDefinition.class); when(a.getPattern()).thenReturn("hello"); @@ -132,7 +132,7 @@ public void returns_match_from_cache_if_single_found() { verify(stepDefinition2).matchedArguments(pickleStep1); //check cache - Glue.CacheEntry entry = glue.matchedStepDefinitionsCache.get(stepText); + CachingGlue.CacheEntry entry = glue.matchedStepDefinitionsCache.get(stepText); assertEquals(stepDefinition1,entry.stepDefinition); PickleStep pickleStep2 = getPickleStep(stepText); diff --git a/core/src/test/java/cucumber/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java similarity index 79% rename from core/src/test/java/cucumber/runner/EventBusTest.java rename to core/src/test/java/io/cucumber/core/runner/EventBusTest.java index c320753ebb..b739930385 100644 --- a/core/src/test/java/cucumber/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -1,11 +1,12 @@ -package cucumber.runner; - -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +package io.cucumber.core.runner; + +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.event.EventBus; import org.junit.Test; import static org.mockito.Mockito.mock; diff --git a/core/src/test/java/cucumber/runner/FailedStepInstantiationMatchTest.java b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java similarity index 94% rename from core/src/test/java/cucumber/runner/FailedStepInstantiationMatchTest.java rename to core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java index 5926ae2641..a01e418202 100644 --- a/core/src/test/java/cucumber/runner/FailedStepInstantiationMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import org.junit.Before; diff --git a/core/src/test/java/cucumber/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java similarity index 90% rename from core/src/test/java/cucumber/runner/HookOrderTest.java rename to core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 47ea997b8f..e052a95f74 100644 --- a/core/src/test/java/cucumber/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -1,20 +1,20 @@ -package cucumber.runner; - -import cucumber.api.Scenario; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.StubStepDefinition; +package io.cucumber.core.runner; + +import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.StubStepDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -24,6 +24,7 @@ import java.util.List; import java.util.Locale; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -33,7 +34,7 @@ public class HookOrderTest { private final static String ENGLISH = "en"; - private final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH)); @@ -47,7 +48,7 @@ public void before_hooks_execute_in_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH))); for (HookDefinition hook : hooks) { glue.addBeforeHook(hook); @@ -74,7 +75,7 @@ public void before_step_hooks_execute_in_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addBeforeStepHook(hook); @@ -101,7 +102,7 @@ public void after_hooks_execute_in_reverse_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterHook(hook); @@ -128,7 +129,7 @@ public void after_step_hooks_execute_in_reverse_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterStepHook(hook); diff --git a/core/src/test/java/cucumber/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java similarity index 78% rename from core/src/test/java/cucumber/runner/HookTest.java rename to core/src/test/java/io/cucumber/core/runner/HookTest.java index 823d8687a8..e99d60b679 100644 --- a/core/src/test/java/cucumber/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -1,10 +1,13 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; @@ -19,6 +22,7 @@ import java.util.Collections; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; @@ -28,8 +32,9 @@ public class HookTest { private final static String ENGLISH = "en"; + private final MultiLoader resoureceLoader = new MultiLoader(RuntimeOptions.class.getClassLoader()); private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); - private final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private final RuntimeOptions runtimeOptions = new RuntimeOptions(resoureceLoader, Env.INSTANCE, emptyList()); private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2, 2))); private final PickleEvent pickleEvent = new PickleEvent("uri", new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1, 1)))); @@ -47,7 +52,7 @@ public void after_hooks_execute_before_objects_are_disposed() throws Throwable { doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { - cucumber.runtime.Glue glue = invocation.getArgument(0); + Glue glue = invocation.getArgument(0); glue.addBeforeHook(hook); return null; } diff --git a/core/src/test/java/cucumber/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java similarity index 88% rename from core/src/test/java/cucumber/runner/HookTestStepTest.java rename to core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index e04615fb2d..3268495e13 100644 --- a/core/src/test/java/cucumber/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -1,12 +1,12 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.HookType; -import cucumber.api.Result; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.runner.EventBus; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; +import io.cucumber.core.event.EventBus; import org.junit.Test; import org.mockito.InOrder; diff --git a/core/src/test/java/cucumber/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java similarity index 89% rename from core/src/test/java/cucumber/runner/PickleStepTestStepTest.java rename to core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index 805fffe07c..d40a4ad323 100644 --- a/core/src/test/java/cucumber/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -1,13 +1,14 @@ -package cucumber.runner; - -import cucumber.api.PendingException; -import cucumber.api.Result; -import cucumber.api.event.TestCaseEvent; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.runtime.HookDefinition; +package io.cucumber.core.runner; + +import io.cucumber.core.runner.TestPendingException; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCaseEvent; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; +import io.cucumber.core.event.EventBus; import org.junit.AssumptionViolatedException; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -17,11 +18,11 @@ import java.util.Collections; import java.util.List; -import static cucumber.api.HookType.AfterStep; -import static cucumber.api.HookType.BeforeStep; -import static cucumber.api.Result.Type.FAILED; -import static cucumber.api.Result.Type.PASSED; -import static cucumber.api.Result.Type.SKIPPED; +import static io.cucumber.core.api.event.HookType.AfterStep; +import static io.cucumber.core.api.event.HookType.BeforeStep; +import static io.cucumber.core.api.event.Result.Type.FAILED; +import static io.cucumber.core.api.event.Result.Type.PASSED; +import static io.cucumber.core.api.event.Result.Type.SKIPPED; import static java.util.Collections.singletonList; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; @@ -95,7 +96,7 @@ public void result_is_skipped_when_skip_step_is_not_run_all() { @Test public void result_is_skipped_when_before_step_hook_does_not_pass() throws Throwable { - doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); assertEquals(SKIPPED, scenario.getStatus()); @@ -103,7 +104,7 @@ public void result_is_skipped_when_before_step_hook_does_not_pass() throws Throw @Test public void step_execution_is_dry_run_when_before_step_hook_does_not_pass() throws Throwable { - doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); step.run(testCase, bus, scenario, false); verify(definitionMatch).dryRunStep(any(Scenario.class)); } @@ -111,7 +112,7 @@ public void step_execution_is_dry_run_when_before_step_hook_does_not_pass() thro @Test public void result_is_result_from_hook_when_before_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); - doThrow(exception).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(exception).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); Result failure = new Result(Result.Type.FAILED, 0L, exception); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); @@ -141,7 +142,7 @@ public void result_is_result_from_step_when_step_hook_does_not_pass() throws Thr public void result_is_result_from_hook_when_after_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); Result failure = new Result(Result.Type.FAILED, 0L, exception); - doThrow(exception).when(afterHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(exception).when(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); assertEquals(FAILED, scenario.getStatus()); @@ -153,16 +154,16 @@ public void result_is_result_from_hook_when_after_step_hook_does_not_pass() thro } @Test public void after_step_hook_is_run_when_before_step_hook_does_not_pass() throws Throwable { - doThrow(RuntimeException.class).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(RuntimeException.class).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); step.run(testCase, bus, scenario, false); - verify(afterHookDefinition).execute(any(cucumber.api.Scenario.class)); + verify(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); } @Test public void after_step_hook_is_run_when_step_does_not_pass() throws Throwable { doThrow(Exception.class).when(definitionMatch).runStep(any(Scenario.class)); step.run(testCase, bus, scenario, false); - verify(afterHookDefinition).execute(any(cucumber.api.Scenario.class)); + verify(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); } @Test @@ -214,7 +215,7 @@ public void result_is_failed_when_step_definition_throws_exception() throws Thro @Test public void result_is_pending_when_step_definition_throws_pending_exception() throws Throwable { - doThrow(PendingException.class).when(definitionMatch).runStep(any(Scenario.class)); + doThrow(TestPendingException.class).when(definitionMatch).runStep(any(Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); diff --git a/core/src/test/java/cucumber/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java similarity index 92% rename from core/src/test/java/cucumber/runner/RunnerTest.java rename to core/src/test/java/io/cucumber/core/runner/RunnerTest.java index b201c6e5d8..3f5e9b753f 100644 --- a/core/src/test/java/cucumber/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -1,18 +1,21 @@ -package cucumber.runner; - -import cucumber.api.Scenario; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.snippets.FunctionNameGenerator; +package io.cucumber.core.runner; + +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -24,9 +27,9 @@ import java.util.List; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyListOf; import static org.mockito.Mockito.doAnswer; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; @@ -44,7 +47,7 @@ public class RunnerTest { private static final List MOCK_LOCATIONS = asList(mock(PickleLocation.class)); - private final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); @@ -189,7 +192,7 @@ public void loadGlue(Glue glue, List gluePaths) { public void steps_are_not_executed_on_dry_run() throws Throwable { final StepDefinition stepDefinition = mock(StepDefinition.class); final PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); - RuntimeOptions runtimeOptions = new RuntimeOptions("--dry-run"); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, singletonList("--dry-run")); TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions){ @Override public void loadGlue(Glue glue, List gluePaths) { @@ -203,7 +206,7 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void hooks_not_executed_in_dry_run_mode() throws Throwable { - RuntimeOptions runtimeOptions = new RuntimeOptions("--dry-run"); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, singletonList("--dry-run")); final HookDefinition beforeHook = addBeforeHook(); final HookDefinition afterHook = addAfterHook(); @@ -256,7 +259,7 @@ public void backends_are_asked_for_snippets_for_undefined_steps() { Backend backend = mock(Backend.class); Runner runner = new Runner(bus, singletonList(backend), runtimeOptions); runner.runPickle(createPickleEventWithSteps(asList(step))); - verify(backend).getSnippet(ArgumentMatchers.eq(step), anyString(), any(FunctionNameGenerator.class)); + verify(backend).getSnippet(ArgumentMatchers.eq(step), anyString(), any(SnippetType.FunctionNameGenerator.class)); } private HookDefinition addBeforeHook() { diff --git a/core/src/test/java/cucumber/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java similarity index 95% rename from core/src/test/java/cucumber/runner/ScenarioResultTest.java rename to core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 63a9b7670f..2f1ec7fdfd 100644 --- a/core/src/test/java/cucumber/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -1,9 +1,10 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Result; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.WriteEvent; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.WriteEvent; import gherkin.events.PickleEvent; +import io.cucumber.core.event.EventBus; import org.junit.Test; import org.mockito.ArgumentMatcher; diff --git a/core/src/test/java/cucumber/runner/ScenarioTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/ScenarioTest.java rename to core/src/test/java/io/cucumber/core/runner/ScenarioTest.java index 5eefe99e8d..3a6f738500 100644 --- a/core/src/test/java/cucumber/runner/ScenarioTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java @@ -1,10 +1,11 @@ -package cucumber.runner; +package io.cucumber.core.runner; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EventBus; import org.junit.Test; import java.util.Collections; @@ -13,7 +14,6 @@ import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class ScenarioTest { diff --git a/core/src/test/java/cucumber/runner/StepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/StepDefinitionMatchTest.java rename to core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java index c93c9c7383..09ab99aee7 100644 --- a/core/src/test/java/cucumber/runner/StepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java @@ -1,9 +1,9 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.StepDefinitionMatch; -import cucumber.runtime.StubStepDefinition; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.StepDefinitionMatch; +import io.cucumber.core.runtime.StubStepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleRow; @@ -13,7 +13,7 @@ import io.cucumber.cucumberexpressions.Transformer; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableCellTransformer; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; diff --git a/core/src/test/java/cucumber/runner/StepDurationTimeService.java b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java similarity index 80% rename from core/src/test/java/cucumber/runner/StepDurationTimeService.java rename to core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java index 1847f017df..73a34fb0e2 100644 --- a/core/src/test/java/cucumber/runner/StepDurationTimeService.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java @@ -1,10 +1,9 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestStepStarted; -import cucumber.runner.TimeService; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestStepStarted; public class StepDurationTimeService implements TimeService, EventListener { private long stepDuration; diff --git a/core/src/test/java/cucumber/runner/TestBackendSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java similarity index 71% rename from core/src/test/java/cucumber/runner/TestBackendSupplier.java rename to core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java index b91001a264..422dd8e1cc 100644 --- a/core/src/test/java/cucumber/runner/TestBackendSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.Backend; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; import gherkin.pickles.PickleStep; import java.util.Collection; @@ -24,7 +24,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return emptyList(); } diff --git a/core/src/test/java/cucumber/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java similarity index 92% rename from core/src/test/java/cucumber/runner/TestCaseTest.java rename to core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index 76efeb2b33..39ff26a96f 100644 --- a/core/src/test/java/cucumber/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -1,21 +1,21 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; +import io.cucumber.core.event.EventBus; import org.junit.Test; import org.mockito.InOrder; -import java.util.Arrays; import java.util.Collections; -import static cucumber.api.HookType.AfterStep; -import static cucumber.api.HookType.BeforeStep; +import static io.cucumber.core.api.event.HookType.AfterStep; +import static io.cucumber.core.api.event.HookType.BeforeStep; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.isA; diff --git a/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java b/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java new file mode 100644 index 0000000000..c114f1ab93 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java @@ -0,0 +1,12 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.api.event.Argument; + +import java.util.List; + +public class TestDefinitionArgument { + + public static List createArguments(List match) { + return DefinitionArgument.createArguments(match); + } +} \ No newline at end of file diff --git a/core/src/test/java/cucumber/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java similarity index 78% rename from core/src/test/java/cucumber/runner/TestHelper.java rename to core/src/test/java/io/cucumber/core/runner/TestHelper.java index 80d9937917..081761bd72 100644 --- a/core/src/test/java/cucumber/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -1,23 +1,22 @@ -package cucumber.runner; - -import cucumber.api.PendingException; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.Scenario; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventListener; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.FeatureSupplier; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.Runtime; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.StubStepDefinition; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.model.CucumberFeature; +package io.cucumber.core.runner; + +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.TestClasspathResourceLoader; +import io.cucumber.core.runtime.FeatureSupplier; +import io.cucumber.core.runtime.Runtime; +import io.cucumber.core.runtime.StubStepDefinition; +import io.cucumber.core.model.CucumberFeature; import gherkin.AstBuilder; import gherkin.Parser; import gherkin.TokenMatcher; @@ -28,8 +27,9 @@ import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; +import io.cucumber.core.runtime.TestFeatureSupplier; import io.cucumber.datatable.DataTable; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import junit.framework.AssertionFailedError; import org.mockito.ArgumentMatchers; import org.mockito.invocation.InvocationOnMock; @@ -44,11 +44,11 @@ import java.util.List; import java.util.Map; -import static cucumber.api.Result.Type.FAILED; -import static cucumber.api.Result.Type.PASSED; -import static cucumber.api.Result.Type.PENDING; -import static cucumber.api.Result.Type.SKIPPED; -import static cucumber.api.Result.Type.UNDEFINED; +import static io.cucumber.core.api.event.Result.Type.FAILED; +import static io.cucumber.core.api.event.Result.Type.PASSED; +import static io.cucumber.core.api.event.Result.Type.PENDING; +import static io.cucumber.core.api.event.Result.Type.SKIPPED; +import static io.cucumber.core.api.event.Result.Type.UNDEFINED; import static java.util.Locale.ENGLISH; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -73,12 +73,12 @@ public enum TimeServiceType { private TimeServiceType timeServiceType = TimeServiceType.FIXED_INCREMENT_ON_STEP_START; private long timeServiceIncrement = 0L; private Object formatterUnderTest = null; - private Iterable runtimeArgs = Collections.emptyList(); + private List runtimeArgs = Collections.emptyList(); private TestHelper() { } - private static final class TestHelperBackendSupplier extends TestBackendSupplier { + public static final class TestHelperBackendSupplier extends TestBackendSupplier { private final List features; private final Map stepsToResult; @@ -87,7 +87,18 @@ private static final class TestHelperBackendSupplier extends TestBackendSupplier private final List hookLocations; private final List> hookActions; - private TestHelperBackendSupplier(List features, Map stepsToResult, Map stepsToLocation, List> hooks, List hookLocations, List> hookActions) { + public TestHelperBackendSupplier(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this( + Collections.emptyList(), + Collections.emptyMap(), + Collections.emptyMap(), + Collections.>emptyList(), + Collections.emptyList(), + Collections.>emptyList() + ); + } + + public TestHelperBackendSupplier(List features, Map stepsToResult, Map stepsToLocation, List> hooks, List hookLocations, List> hookActions) { this.features = features; this.stepsToResult = stepsToResult; this.stepsToLocation = stepsToLocation; @@ -96,6 +107,17 @@ private TestHelperBackendSupplier(List features, Map features) { + this( + features, + Collections.emptyMap(), + Collections.emptyMap(), + Collections.>emptyList(), + Collections.emptyList(), + Collections.>emptyList() + ); + } + @Override public void loadGlue(Glue glue, List gluePaths) { @@ -137,7 +159,7 @@ private static void mockSteps(Glue glue, List features, public void execute(Object[] args) throws Throwable { super.execute(args); if (stepResult.is(PENDING)) { - throw new PendingException(); + throw new TestPendingException(); } else if (stepResult.is(FAILED)) { throw stepResult.getError(); } else if (stepResult.is(SKIPPED) && (stepResult.getError() != null)) { @@ -187,7 +209,7 @@ private static Type[] mapArgumentToTypes(PickleStep step) { return types; } - private static void mockHooks(cucumber.runtime.Glue glue, final List> hooks, + private static void mockHooks(Glue glue, final List> hooks, final List hookLocations, final List> hookActions) throws Throwable { List beforeHooks = new ArrayList<>(); @@ -229,9 +251,9 @@ private static void mockHook(final SimpleEntry hookEntry, doAnswer(action).when(hook).execute((Scenario) any()); } if (hookEntry.getValue().is(FAILED)) { - doThrow(hookEntry.getValue().getError()).when(hook).execute((cucumber.api.Scenario) any()); + doThrow(hookEntry.getValue().getError()).when(hook).execute((Scenario) any()); } else if (hookEntry.getValue().is(PENDING)) { - doThrow(new PendingException()).when(hook).execute((cucumber.api.Scenario) any()); + doThrow(new TestPendingException()).when(hook).execute((io.cucumber.core.api.Scenario) any()); } if ("before".equals(hookEntry.getKey())) { beforeHooks.add(hook); @@ -250,13 +272,8 @@ private static void mockHook(final SimpleEntry hookEntry, public void run() { - final StringBuilder args = new StringBuilder(); - for (final String arg : runtimeArgs) { - args.append(" ").append(arg); - } - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); final BackendSupplier backendSupplier = new TestHelperBackendSupplier( @@ -268,47 +285,46 @@ public void run() { hookActions ); + final EventBus bus = createEventBus(); + final FeatureSupplier featureSupplier = features.isEmpty() ? null // assume feature paths passed in as args instead - : new FeatureSupplier() { - @Override - public List get() { - return features; - } - }; + : new TestFeatureSupplier(bus, features); Runtime.Builder runtimeBuilder = Runtime.builder() - .withArg(args.toString()) + .withArgs(runtimeArgs) .withClassLoader(classLoader) .withResourceLoader(resourceLoader) .withBackendSupplier(backendSupplier) - .withFeatureSupplier(featureSupplier); - - if (TimeServiceType.REAL_TIME.equals(this.timeServiceType)) { - if (formatterUnderTest instanceof Plugin) { - runtimeBuilder.withAdditionalPlugins((Plugin) formatterUnderTest); - } - } else { - EventBus bus = null; - if (TimeServiceType.FIXED_INCREMENT_ON_STEP_START.equals(this.timeServiceType)) { - final StepDurationTimeService timeService = new StepDurationTimeService(this.timeServiceIncrement); - bus = new TimeServiceEventBus(timeService); - timeService.setEventPublisher(bus); - } else if (TimeServiceType.FIXED_INCREMENT.equals(this.timeServiceType)) { - bus = new TimeServiceEventBus(new TimeServiceStub(this.timeServiceIncrement)); - } - - runtimeBuilder.withEventBus(bus); - if (formatterUnderTest instanceof ConcurrentEventListener) { - ((ConcurrentEventListener) formatterUnderTest).setEventPublisher(bus); - } else if (formatterUnderTest instanceof EventListener) { - ((EventListener) formatterUnderTest).setEventPublisher(bus); - } + .withFeatureSupplier(featureSupplier) + .withEventBus(bus); + + if (formatterUnderTest instanceof ConcurrentEventListener) { + ((ConcurrentEventListener) formatterUnderTest).setEventPublisher(bus); + } else if (formatterUnderTest instanceof EventListener) { + ((EventListener) formatterUnderTest).setEventPublisher(bus); + } else if (formatterUnderTest instanceof Plugin) { + runtimeBuilder.withAdditionalPlugins((Plugin) formatterUnderTest); } runtimeBuilder.build().run(); } + private EventBus createEventBus() { + EventBus bus = null; + + if (TimeServiceType.REAL_TIME.equals(this.timeServiceType)) { + bus = new TimeServiceEventBus(TimeService.SYSTEM); + } else if (TimeServiceType.FIXED_INCREMENT_ON_STEP_START.equals(this.timeServiceType)) { + final StepDurationTimeService timeService = new StepDurationTimeService(this.timeServiceIncrement); + bus = new TimeServiceEventBus(timeService); + timeService.setEventPublisher(bus); + } else if (TimeServiceType.FIXED_INCREMENT.equals(this.timeServiceType)) { + bus = new TimeServiceEventBus(new TimeServiceStub(this.timeServiceIncrement)); + } + return bus; + } + public static Builder builder() { return new Builder(); } @@ -374,8 +390,8 @@ public Builder withTimeServiceIncrement(long timeServiceIncrement) { * Defaults to {@link TimeServiceType#FIXED_INCREMENT_ON_STEP_START} *

    * Note: when running tests with multiple threads & not using {@link TimeServiceType#REAL_TIME} - * it can inadvertently affect the order of {@link cucumber.api.event.Event}s - * published to any {@link cucumber.api.event.ConcurrentEventListener}s used during the test run + * it can inadvertently affect the order of {@link Event}s + * published to any {@link ConcurrentEventListener}s used during the test run * * @return this instance */ @@ -385,9 +401,9 @@ public Builder withTimeServiceType(TimeServiceType timeServiceType) { } /** - * Specify a formatter under test, Formatter or ConcurrentFormatter + * Specify a plugin under test, Formatter or ConcurrentFormatter * - * @param formatter the formatter under test + * @param formatter the plugin under test * @return this instance */ public Builder withFormatterUnderTest(Object formatter) { @@ -432,7 +448,7 @@ public static Result result(Result.Type status) { case AMBIGUOUS: return result(status, mockAmbiguousStepDefinitionException()); case PENDING: - return result(status, new PendingException()); + return result(status, new TestPendingException()); default: return result(status, null); } diff --git a/core/src/test/java/io/cucumber/core/runner/TestPendingException.java b/core/src/test/java/io/cucumber/core/runner/TestPendingException.java new file mode 100644 index 0000000000..ed61b383e6 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/TestPendingException.java @@ -0,0 +1,14 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.backend.Pending; + +@Pending +public final class TestPendingException extends RuntimeException { + public TestPendingException() { + this("TODO: implement me"); + } + + public TestPendingException(String message) { + super(message); + } +} diff --git a/core/src/test/java/cucumber/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java similarity index 57% rename from core/src/test/java/cucumber/runner/TestRunnerSupplier.java rename to core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index 0d2c9d4fda..c9da887014 100644 --- a/core/src/test/java/cucumber/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -1,10 +1,14 @@ -package cucumber.runner; - -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.snippets.FunctionNameGenerator; +package io.cucumber.core.runner; + +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.RuntimeOptions; import gherkin.pickles.PickleStep; +import io.cucumber.core.runtime.RunnerSupplier; +import io.cucumber.core.stepexpression.TypeRegistry; import java.util.Collections; import java.util.List; @@ -21,6 +25,12 @@ protected TestRunnerSupplier(EventBus bus, RuntimeOptions runtimeOptions) { this.runtimeOptions = runtimeOptions; } + + @SuppressWarnings("unused") // Used by reflection + public TestRunnerSupplier(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this((EventBus) null, null); + } + @Override public void loadGlue(Glue glue, List gluePaths) { @@ -37,7 +47,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return emptyList(); } diff --git a/core/src/test/java/cucumber/runner/TimeServiceStub.java b/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java similarity index 87% rename from core/src/test/java/cucumber/runner/TimeServiceStub.java rename to core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java index 647bc4f922..a70dc5b80d 100644 --- a/core/src/test/java/cucumber/runner/TimeServiceStub.java +++ b/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java @@ -1,6 +1,4 @@ -package cucumber.runner; - -import cucumber.runner.TimeService; +package io.cucumber.core.runner; public class TimeServiceStub implements TimeService { private final long duration; diff --git a/core/src/test/java/cucumber/runner/TimeServiceTest.java b/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java similarity index 95% rename from core/src/test/java/cucumber/runner/TimeServiceTest.java rename to core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java index 0cf2f95fc6..cebf275b6e 100644 --- a/core/src/test/java/cucumber/runner/TimeServiceTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java @@ -1,8 +1,7 @@ -package cucumber.runner; +package io.cucumber.core.runner; import static org.junit.Assert.assertNull; -import cucumber.runner.TimeService; import org.junit.Test; public class TimeServiceTest { diff --git a/core/src/test/java/cucumber/runner/UndefinedStepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java similarity index 92% rename from core/src/test/java/cucumber/runner/UndefinedStepDefinitionMatchTest.java rename to core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java index 3481aaf72e..9c5c48f76d 100644 --- a/core/src/test/java/cucumber/runner/UndefinedStepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/BackendModuleBackendSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java similarity index 58% rename from core/src/test/java/cucumber/runtime/BackendModuleBackendSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java index 920eab3312..f5778015d3 100644 --- a/core/src/test/java/cucumber/runtime/BackendModuleBackendSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java @@ -1,14 +1,20 @@ -package cucumber.runtime; - -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +package io.cucumber.core.runtime; + +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.Env; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.Collections; +import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; @@ -22,20 +28,20 @@ public class BackendModuleBackendSupplierTest { @Test public void should_create_a_backend() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber.core.backend")); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @Test public void should_throw_an_exception_when_no_backend_could_be_found() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, Collections.singletonList("no.backend.here")); + BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("no.backend.here")); expectedException.expect(CucumberException.class); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); diff --git a/core/src/test/java/cucumber/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java similarity index 92% rename from core/src/test/java/cucumber/runtime/ExitStatusTest.java rename to core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index 356417e40a..92cf73b9b1 100644 --- a/core/src/test/java/cucumber/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -1,12 +1,15 @@ -package cucumber.runtime; - - -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.TestCaseFinished; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; +package io.cucumber.core.runtime; + + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Test; import static java.util.Arrays.asList; @@ -17,7 +20,7 @@ public class ExitStatusTest { private final static long ANY_TIMESTAMP = 1234567890; private EventBus bus; - private ExitStatus exitStatus; + private Runtime.ExitStatus exitStatus; @Test public void non_strict_wip_with_ambiguous_scenarios() { @@ -36,9 +39,9 @@ private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { } private void createExitStatus(String... runtimeArgs) { - RuntimeOptions runtimeOptions = new RuntimeOptions(asList(runtimeArgs)); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, asList(runtimeArgs)); this.bus = new TimeServiceEventBus(TimeService.SYSTEM); - exitStatus = new ExitStatus(runtimeOptions); + exitStatus = new Runtime.ExitStatus(runtimeOptions); exitStatus.setEventPublisher(bus); } diff --git a/core/src/test/java/cucumber/runtime/TimeoutTest.java b/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java similarity index 89% rename from core/src/test/java/cucumber/runtime/TimeoutTest.java rename to core/src/test/java/io/cucumber/core/runtime/InvokerTest.java index edc127a567..0a64c020c4 100644 --- a/core/src/test/java/cucumber/runtime/TimeoutTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import org.junit.Test; @@ -11,11 +11,11 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -public class TimeoutTest { +public class InvokerTest { @Test public void doesnt_time_out_if_it_doesnt_take_too_long() throws Throwable { final Slow slow = new Slow(); - String what = Timeout.timeout(new Timeout.Callback() { + String what = Invoker.timeout(new Invoker.Callback() { @Override public String call() throws Throwable { return slow.slow(10); @@ -27,7 +27,7 @@ public String call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public String call() throws Throwable { return slow.slow(100); @@ -39,7 +39,7 @@ public String call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_infinite_loop_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public Void call() throws Throwable { slow.infinite(); @@ -52,7 +52,7 @@ public Void call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_infinite_latch_wait_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public Void call() throws Throwable { slow.infiniteLatchWait(); @@ -66,7 +66,7 @@ public Void call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_busy_wait_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public Void call() throws Throwable { slow.busyWait(); @@ -83,7 +83,7 @@ public void doesnt_leak_threads() throws Throwable { boolean cleanedUp = false; for (int i = 0; i < 1000; i++) { - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public String call() throws Throwable { return null; diff --git a/core/src/test/java/cucumber/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java similarity index 87% rename from core/src/test/java/cucumber/runtime/RuntimeTest.java rename to core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 0083c7ad67..17a8827faa 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -1,27 +1,32 @@ -package cucumber.runtime; - -import cucumber.api.HookType; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.Scenario; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.TestCase; -import cucumber.api.event.TestCaseFinished; -import cucumber.runner.EventBus; -import cucumber.runner.TestBackendSupplier; -import cucumber.runner.TestHelper; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.formatter.FormatterBuilder; -import cucumber.runtime.formatter.FormatterSpy; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.io.Resource; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.model.CucumberFeature; +package io.cucumber.core.runtime; + +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.io.TestClasspathResourceLoader; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.runner.TestBackendSupplier; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.plugin.FormatterBuilder; +import io.cucumber.core.plugin.FormatterSpy; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.model.CucumberFeature; import gherkin.ast.ScenarioDefinition; import gherkin.ast.Step; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -36,8 +41,8 @@ import java.util.Locale; import java.util.Map; -import static cucumber.runner.TestHelper.feature; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; @@ -74,17 +79,13 @@ public Collection get() { return singletonList(mock(Backend.class)); } }; - FeatureSupplier featureSupplier = new FeatureSupplier() { - @Override - public List get() { - return singletonList(feature); - } - }; + FeatureSupplier featureSupplier = new TestFeatureSupplier(bus, feature); Runtime.builder() .withBackendSupplier(backendSupplier) .withAdditionalPlugins(jsonFormatter) - .withResourceLoader(new ClasspathResourceLoader(classLoader)) + .withResourceLoader(TestClasspathResourceLoader.create(classLoader)) .withFeatureSupplier(featureSupplier) + .withEventBus(bus) .build() .run(); @@ -258,7 +259,7 @@ public void loadGlue(Glue glue, List gluePaths) { Runtime.builder() .withResourceLoader(resourceLoader) - .withArgs("--plugin", "cucumber.runtime.RuntimeTest$StepdefsPrinter") + .withArgs("--plugin", "io.cucumber.core.runtime.RuntimeTest$StepdefsPrinter") .withBackendSupplier(testBackendSupplier) .build() .run(); @@ -282,16 +283,25 @@ public void stepDefinition(StepDefinition stepDefinition) { @Test public void should_make_scenario_name_available_to_hooks() throws Throwable { - CucumberFeature feature = TestHelper.feature("path/test.feature", + final CucumberFeature feature = TestHelper.feature("path/test.feature", "Feature: feature name\n" + " Scenario: scenario name\n" + " Given first step\n" + " When second step\n" + " Then third step\n"); - HookDefinition beforeHook = mock(HookDefinition.class); + final HookDefinition beforeHook = mock(HookDefinition.class); when(beforeHook.matches(ArgumentMatchers.anyCollection())).thenReturn(true); - Runtime runtime = createRuntimeWithMockedGlue(beforeHook, HookType.Before, feature); + TestBackendSupplier testBackendSupplier = createTestBackendSupplier(feature, beforeHook); + + FeatureSupplier featureSupplier = new TestFeatureSupplier(bus, feature); + + Runtime runtime = Runtime.builder() + .withArgs() + .withBackendSupplier(testBackendSupplier) + .withFeatureSupplier(featureSupplier) + .withEventBus(bus) + .build(); runtime.run(); ArgumentCaptor capturedScenario = ArgumentCaptor.forClass(Scenario.class); @@ -299,6 +309,20 @@ public void should_make_scenario_name_available_to_hooks() throws Throwable { assertEquals("scenario name", capturedScenario.getValue().getName()); } + private TestBackendSupplier createTestBackendSupplier(final CucumberFeature feature, final HookDefinition beforeHook) { + return new TestBackendSupplier() { + @Override + public void loadGlue(Glue glue, List gluePaths) { + for (ScenarioDefinition child : feature.getGherkinFeature().getFeature().getChildren()) { + for (Step step : child.getSteps()) { + mockMatch(glue, step.getText()); + } + } + mockHook(glue, beforeHook, HookType.Before); + } + }; + } + @Test public void should_call_formatter_for_two_scenarios_with_background() { CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -405,18 +429,15 @@ public void should_call_formatter_with_correct_sequence_of_events_when_running_i " Scenario: scenario_3 name\n" + " Given first step\n"); - Map stepsToResult = new HashMap<>(); - stepsToResult.put("first step", result("passed")); - FormatterSpy formatterSpy = new FormatterSpy(); final List features = Arrays.asList(feature1, feature2, feature3); - TestHelper.builder() - .withFeatures(features) - .withStepsToResult(stepsToResult) - .withFormatterUnderTest(formatterSpy) - .withTimeServiceType(TestHelper.TimeServiceType.REAL_TIME) - .withRuntimeArgs("--threads", String.valueOf(features.size())) + Runtime.builder() + .withFeatureSupplier(new TestFeatureSupplier(bus, features)) + .withEventBus(bus) + .withArgs("--threads", String.valueOf(features.size())) + .withAdditionalPlugins(formatterSpy) + .withBackendSupplier(new TestHelper.TestHelperBackendSupplier(features)) .build() .run(); @@ -498,37 +519,6 @@ public Collection get() { .build(); } - private Runtime createRuntimeWithMockedGlue(final HookDefinition hook, - final HookType hookType, - final CucumberFeature feature, - String... runtimeArgs) { - TestBackendSupplier testBackendSupplier = new TestBackendSupplier() { - @Override - public void loadGlue(Glue glue, List gluePaths) { - for (ScenarioDefinition child : feature.getGherkinFeature().getFeature().getChildren()) { - for (Step step : child.getSteps()) { - mockMatch(glue, step.getText()); - } - } - mockHook(glue, hook, hookType); - } - }; - - FeatureSupplier featureSupplier = new FeatureSupplier() { - @Override - public List get() { - return singletonList(feature); - } - }; - - return Runtime.builder() - .withArgs(runtimeArgs) - .withBackendSupplier(testBackendSupplier) - .withFeatureSupplier(featureSupplier) - .build(); - - } - private void mockMatch(Glue glue, String text) { StepDefinition stepDefinition = new StubStepDefinition(text, TYPE_REGISTRY); glue.addStepDefinition(stepDefinition); diff --git a/core/src/test/java/cucumber/runner/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java similarity index 65% rename from core/src/test/java/cucumber/runner/SingletonRunnerSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 477c03403d..b08e86dd28 100644 --- a/core/src/test/java/cucumber/runner/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -1,17 +1,22 @@ -package cucumber.runner; - - -import cucumber.runtime.BackendModuleBackendSupplier; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +package io.cucumber.core.runtime; + + +import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.Env; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import org.junit.Before; import org.junit.Test; import java.util.Collections; +import static io.cucumber.core.options.Env.INSTANCE; +import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertSame; @@ -25,8 +30,8 @@ public class SingletonRunnerSupplierTest { @Before public void before() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, INSTANCE, emptyList()); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); diff --git a/core/src/test/java/cucumber/runtime/StubStepDefinition.java b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java similarity index 80% rename from core/src/test/java/cucumber/runtime/StubStepDefinition.java rename to core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java index e2cb7e5767..67f65a497b 100644 --- a/core/src/test/java/cucumber/runtime/StubStepDefinition.java +++ b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java @@ -1,12 +1,13 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; -import io.cucumber.stepexpression.TypeRegistry; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.ArgumentMatcher; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; import java.lang.reflect.Type; import java.util.Arrays; diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java new file mode 100644 index 0000000000..3db5b557b4 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -0,0 +1,30 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.event.EventBus; + +import java.util.Arrays; +import java.util.List; + +public class TestFeatureSupplier implements FeatureSupplier { + private final EventBus bus ; + private final List features; + + public TestFeatureSupplier(EventBus bus, CucumberFeature... features) { + this(bus, Arrays.asList(features)); + } + + public TestFeatureSupplier(EventBus bus, List features) { + this.bus = bus; + this.features = features; + } + + @Override + public List get() { + for (CucumberFeature feature : features) { + bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); + } + return features; + } +} diff --git a/core/src/test/java/cucumber/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java similarity index 78% rename from core/src/test/java/cucumber/runtime/ThreadLocalRunnerSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 5df7b16c5a..771764983e 100644 --- a/core/src/test/java/cucumber/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -1,16 +1,18 @@ -package cucumber.runtime; - - -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestCaseStarted; -import cucumber.runner.EventBus; -import cucumber.runner.Runner; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +package io.cucumber.core.runtime; + + +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.Env; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Before; import org.junit.Test; @@ -32,7 +34,7 @@ public class ThreadLocalRunnerSupplierTest { @Before public void before() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); diff --git a/core/src/test/java/cucumber/runtime/snippets/ArgumentPatternTest.java b/core/src/test/java/io/cucumber/core/snippets/ArgumentPatternTest.java similarity index 95% rename from core/src/test/java/cucumber/runtime/snippets/ArgumentPatternTest.java rename to core/src/test/java/io/cucumber/core/snippets/ArgumentPatternTest.java index d85ba1d333..a6ed184bde 100644 --- a/core/src/test/java/cucumber/runtime/snippets/ArgumentPatternTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/ArgumentPatternTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/snippets/FunctionNameGeneratorTest.java b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java similarity index 88% rename from core/src/test/java/cucumber/runtime/snippets/FunctionNameGeneratorTest.java rename to core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java index 8d08028732..bbe46b1742 100644 --- a/core/src/test/java/cucumber/runtime/snippets/FunctionNameGeneratorTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java @@ -1,13 +1,14 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; +import io.cucumber.core.api.options.SnippetType; import org.junit.Test; import static org.junit.Assert.assertEquals; public class FunctionNameGeneratorTest { - private FunctionNameGenerator underscore = new FunctionNameGenerator(new UnderscoreConcatenator()); - private FunctionNameGenerator camelCase = new FunctionNameGenerator(new CamelCaseConcatenator()); + private SnippetType.FunctionNameGenerator underscore = SnippetType.UNDERSCORE.getFunctionNameGenerator(); + private SnippetType.FunctionNameGenerator camelCase = SnippetType.CAMELCASE.getFunctionNameGenerator(); private void assertFunctionNames(String expectedUnderscore, String expectedCamelCase, String sentence) { assertEquals(expectedUnderscore, underscore.generateFunctionName(sentence)); diff --git a/core/src/test/java/io/cucumber/stepexpression/StepExpressionFactoryTest.java b/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java similarity index 98% rename from core/src/test/java/io/cucumber/stepexpression/StepExpressionFactoryTest.java rename to core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java index c488d5c173..0bd7e9aeb9 100644 --- a/core/src/test/java/io/cucumber/stepexpression/StepExpressionFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; diff --git a/core/src/test/java/io/cucumber/stepexpression/TableParser.java b/core/src/test/java/io/cucumber/core/stepexpression/TableParser.java similarity index 90% rename from core/src/test/java/io/cucumber/stepexpression/TableParser.java rename to core/src/test/java/io/cucumber/core/stepexpression/TableParser.java index 028232ad47..2f9fbf911c 100644 --- a/core/src/test/java/io/cucumber/stepexpression/TableParser.java +++ b/core/src/test/java/io/cucumber/core/stepexpression/TableParser.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTable.TableConverter; @@ -11,7 +11,7 @@ import java.util.List; -import static io.cucumber.stepexpression.PickleTableConverter.toTable; +import static io.cucumber.core.stepexpression.PickleTableConverter.toTable; public class TableParser { diff --git a/core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory b/core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory deleted file mode 100644 index 432208d2b2..0000000000 --- a/core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory +++ /dev/null @@ -1 +0,0 @@ -cucumber.runtime.io.TestResourceIteratorFactory diff --git a/core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory b/core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory new file mode 100644 index 0000000000..870ec1a23c --- /dev/null +++ b/core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory @@ -0,0 +1 @@ +io.cucumber.core.io.TestResourceIteratorFactory diff --git a/core/src/test/resources/cucumber/runtime/bar.properties b/core/src/test/resources/io/cucumber/core/bar.properties similarity index 100% rename from core/src/test/resources/cucumber/runtime/bar.properties rename to core/src/test/resources/io/cucumber/core/bar.properties diff --git a/core/src/test/resources/cucumber/runtime/foo.properties b/core/src/test/resources/io/cucumber/core/foo.properties similarity index 100% rename from core/src/test/resources/cucumber/runtime/foo.properties rename to core/src/test/resources/io/cucumber/core/foo.properties diff --git a/core/src/test/resources/cucumber/runtime/has spaces.properties b/core/src/test/resources/io/cucumber/core/has spaces.properties similarity index 100% rename from core/src/test/resources/cucumber/runtime/has spaces.properties rename to core/src/test/resources/io/cucumber/core/has spaces.properties diff --git a/core/src/test/resources/cucumber/runtime/formatter/FormatterInParallel.feature b/core/src/test/resources/io/cucumber/core/plugin/FormatterInParallel.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/FormatterInParallel.feature rename to core/src/test/resources/io/cucumber/core/plugin/FormatterInParallel.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/HTMLFormatterTest.feature b/core/src/test/resources/io/cucumber/core/plugin/HTMLFormatterTest.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/HTMLFormatterTest.feature rename to core/src/test/resources/io/cucumber/core/plugin/HTMLFormatterTest.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.feature b/core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.feature rename to core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json b/core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.json similarity index 99% rename from core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json rename to core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.json index edcccf5915..1ee24c5527 100644 --- a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json +++ b/core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.json @@ -344,7 +344,7 @@ "type": "scenario" } ], - "uri": "cucumber/runtime/formatter/JSONPrettyFormatterTest.feature", + "uri": "io/cucumber/core/plugin/JSONPrettyFormatterTest.feature", "tags": [] } ] \ No newline at end of file diff --git a/core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.feature b/core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.feature rename to core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml b/core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml similarity index 88% rename from core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml rename to core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml index 1f37c70ccd..4874af0802 100644 --- a/core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml +++ b/core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml @@ -1,5 +1,5 @@ - + - + - + - + io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator-testng @@ -23,18 +23,4 @@ test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - diff --git a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/DateCalculator.java b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java similarity index 84% rename from examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/DateCalculator.java rename to examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java index 4ab3eb3816..fc2d67b371 100644 --- a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/DateCalculator.java +++ b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Date; diff --git a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java similarity index 96% rename from examples/java-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java rename to examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java index c28c15e9cf..88ee9803b2 100644 --- a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java +++ b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Deque; import java.util.LinkedList; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java similarity index 93% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index e2ed09ce10..41a8efe958 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java similarity index 81% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index 66a69e5d0f..846f7c5fd1 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,10 +1,10 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; -import cucumber.examples.java.calculator.ShoppingStepdefs.Price; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Price; import io.cucumber.datatable.DataTableType; -import cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; import io.cucumber.cucumberexpressions.ParameterType; import java.text.SimpleDateFormat; @@ -12,7 +12,7 @@ import java.util.Locale; import java.util.Map; -import static cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; +import static io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; import static java.text.DateFormat.MEDIUM; import static java.text.DateFormat.getDateInstance; import static java.util.Locale.ENGLISH; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java similarity index 95% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index aeadb38019..be986911d1 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionBase.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionBase.java similarity index 87% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionBase.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionBase.java index 9169346a2e..5569411564 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionBase.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionBase.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java similarity index 83% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java index 51ceacc89e..24c7ce1aa8 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java @@ -1,9 +1,9 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; -import cucumber.api.testng.CucumberFeatureWrapper; -import cucumber.api.testng.PickleEventWrapper; -import cucumber.api.testng.TestNGCucumberRunner; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.testng.api.CucumberFeatureWrapper; +import io.cucumber.testng.api.PickleEventWrapper; +import io.cucumber.testng.api.TestNGCucumberRunner; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java similarity index 65% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index d278ed4ddd..e6f225b4a9 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.testng.api.AbstractTestNGCucumberTests; import org.testng.annotations.DataProvider; @CucumberOptions(plugin = "json:target/cucumber-report.json") diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java similarity index 96% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 4b20c10899..e0045ffb58 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature b/examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature similarity index 100% rename from examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature rename to examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature diff --git a/examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature b/examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature similarity index 100% rename from examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature rename to examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature diff --git a/examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/shopping.feature b/examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature similarity index 100% rename from examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/shopping.feature rename to examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index 7fa9509589..e33484b0b8 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -5,7 +5,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator @@ -39,14 +39,6 @@ 4 - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - diff --git a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/DateCalculator.java b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java similarity index 84% rename from examples/java-calculator/src/main/java/cucumber/examples/java/calculator/DateCalculator.java rename to examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java index 4ab3eb3816..fc2d67b371 100644 --- a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/DateCalculator.java +++ b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Date; diff --git a/examples/java8-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java similarity index 96% rename from examples/java8-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java rename to examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java index c28c15e9cf..88ee9803b2 100644 --- a/examples/java8-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java +++ b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Deque; import java.util.LinkedList; diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java b/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java deleted file mode 100644 index e1fcd4ff89..0000000000 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java +++ /dev/null @@ -1,4 +0,0 @@ -package cucumber.examples.java.calculator; - -public interface Example { -} diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java deleted file mode 100644 index 5a9978aa29..0000000000 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package cucumber.examples.java.calculator; - -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(plugin = {"progress", "json:target/cucumber-report.json"}) -@Category(Example.class) -public class RunCukesTest { - -} diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java similarity index 93% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 9e162b934a..50b230be0a 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java new file mode 100644 index 0000000000..b5be1f3072 --- /dev/null +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java @@ -0,0 +1,4 @@ +package io.cucumber.examples.java.calculator; + +public interface Example { +} diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java similarity index 85% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index 63c5d0011c..485adba05e 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,10 +1,10 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; -import cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; -import cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; +import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; import io.cucumber.cucumberexpressions.ParameterType; import java.text.SimpleDateFormat; diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java similarity index 95% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index c69beb7fd8..c64686efb6 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java new file mode 100644 index 0000000000..534ea5524d --- /dev/null +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -0,0 +1,11 @@ +package io.cucumber.examples.java.calculator; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(plugin = {"progress", "json:target/cucumber-report.json"}) +public class RunCukesTest { + +} diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java similarity index 96% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 60e87c1a67..917e3101f9 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature b/examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature similarity index 100% rename from examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature rename to examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature diff --git a/examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature b/examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature similarity index 100% rename from examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature rename to examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature diff --git a/examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature b/examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature similarity index 100% rename from examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature rename to examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature diff --git a/examples/java-gradle/.gitignore b/examples/java-gradle/.gitignore deleted file mode 100644 index f8b92c3aa0..0000000000 --- a/examples/java-gradle/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.gradle -build diff --git a/examples/java-gradle/README.md b/examples/java-gradle/README.md deleted file mode 100644 index 213bc73cb8..0000000000 --- a/examples/java-gradle/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Running Cucumber-JVM with step definitions in Java using Gradle's `javaexec` task - -## Credits - -This work is based on [dkowis/cucumber-jvm-groovy-example](https://github.com/dkowis/cucumber-jvm-groovy-example) - -## Motivation - -There exists [a number of issues](http://gradle.1045684.n5.nabble.com/Gradle-and-cucumber-jvm-tt5710562.html) which prevent seamless integration of Cucumber-JVM and Gradle. - -## Solution - -One possible solution is to use Cucumber's `Main` class to run your tests. You can do this by using the `javaexec` task in Gradle. - -## Running - -In order to run your Cucumber tests execute: - -```sh -gradle cucumber -``` - -## Caveats - -The Groovy example by [David Kowis](https://github.com/dkowis) runs perfectly, but it uses Groovy step definitions. - -If you're writing your step definitions in Java then the Gradle script needs to be changed slightly. - -Here are some caveats: - - * The `cucumber` task has to depend on `testClasses` task in order to compile test sources - - ```groovy - task cucumber(dependsOn: testClasses) { - ... - } - ``` - - * The `javaexec` classpath should include `main` and `test` output directories. - Otherwise Cucumber-JVM will not find your production classes/resources and step definitions respectively. - - ```groovy - classpath = configurations.testRuntimeClasspath + sourceSets.main.output + sourceSets.test.output - ``` - - * Cucumber's `--glue` should be set to your package name (e.g. `gradle.cucumber`) and **NOT** to `src/test/java` - - ```groovy - args = ['-f', 'pretty', '--glue', 'gradle.cucumber', 'src/test/resources'] - ``` - - - diff --git a/examples/java-gradle/build.gradle b/examples/java-gradle/build.gradle deleted file mode 100644 index 4d63d067bb..0000000000 --- a/examples/java-gradle/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -apply plugin: 'java' - -task cucumber(dependsOn: testClasses) { - doLast { - javaexec { - main = "cucumber.api.cli.Main" - classpath = configurations.testRuntimeClasspath + sourceSets.main.output + sourceSets.test.output - args = ['--plugin', 'pretty', '--glue', 'gradle.cucumber', 'src/test/resources'] - } - } -} - -dependencies { - testCompile 'io.cucumber:cucumber-java:3.0.2' - testCompile 'io.cucumber:cucumber-junit:3.0.2' - - testCompile 'junit:junit:4.12' -} - -repositories { - mavenCentral() -} diff --git a/examples/java-gradle/src/main/java/gradle/cucumber/Production.java b/examples/java-gradle/src/main/java/gradle/cucumber/Production.java deleted file mode 100644 index ea355abade..0000000000 --- a/examples/java-gradle/src/main/java/gradle/cucumber/Production.java +++ /dev/null @@ -1,9 +0,0 @@ -package gradle.cucumber; - -public class Production { - - public void doWork() { - throw new RuntimeException("production failed here"); - } - -} diff --git a/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java b/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java deleted file mode 100644 index be7bef22a8..0000000000 --- a/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java +++ /dev/null @@ -1,11 +0,0 @@ -package gradle.cucumber; - -import cucumber.api.java.en.When; - -public class BasicStepdefs { - - @When("I run a failing step") - public void I_run_a_failing_step() throws Throwable { - new Production().doWork(); - } -} diff --git a/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java b/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java deleted file mode 100644 index d9b7ad43ff..0000000000 --- a/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package gradle.cucumber; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; -import cucumber.api.CucumberOptions; - -@RunWith(Cucumber.class) -@CucumberOptions(plugin = {"pretty"}) -public class RunCukesTest { - -} diff --git a/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature b/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature deleted file mode 100644 index eb54644367..0000000000 --- a/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature +++ /dev/null @@ -1,4 +0,0 @@ -Feature: Gradle-Cucumber integration - - Scenario: Just a failing scenario - When I run a failing step diff --git a/examples/java-wicket/java-wicket-main/pom.xml b/examples/java-wicket/java-wicket-main/pom.xml index f057ab0921..7cb2916c06 100644 --- a/examples/java-wicket/java-wicket-main/pom.xml +++ b/examples/java-wicket/java-wicket-main/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-main Examples: Wicket application diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/Application.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/Application.java similarity index 65% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/Application.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/Application.java index bdaa2ce043..8bffccd318 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/Application.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/Application.java @@ -1,11 +1,11 @@ -package cucumber.examples.java.wicket; +package io.cucumber.examples.java.wicket; -import cucumber.examples.java.wicket.model.dao.CarDAO; -import cucumber.examples.java.wicket.model.dao.InMemoryCarDAO; -import cucumber.examples.java.wicket.model.entity.Car; -import cucumber.examples.java.wicket.view.Available; -import cucumber.examples.java.wicket.view.Create; -import cucumber.examples.java.wicket.view.Rent; +import io.cucumber.examples.java.wicket.model.dao.CarDAO; +import io.cucumber.examples.java.wicket.model.dao.InMemoryCarDAO; +import io.cucumber.examples.java.wicket.model.entity.Car; +import io.cucumber.examples.java.wicket.view.Available; +import io.cucumber.examples.java.wicket.view.Create; +import io.cucumber.examples.java.wicket.view.Rent; import org.apache.wicket.protocol.http.WebApplication; public class Application extends WebApplication { diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/CarDAO.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/CarDAO.java similarity index 53% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/CarDAO.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/CarDAO.java index ec200546f8..54429a0bb5 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/CarDAO.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/CarDAO.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.model.dao; +package io.cucumber.examples.java.wicket.model.dao; -import cucumber.examples.java.wicket.model.entity.Car; +import io.cucumber.examples.java.wicket.model.entity.Car; public interface CarDAO { public void add(Car car); diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java similarity index 88% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java index 500ad6218f..ab0d2e4cbf 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.model.dao; +package io.cucumber.examples.java.wicket.model.dao; -import cucumber.examples.java.wicket.model.entity.Car; +import io.cucumber.examples.java.wicket.model.entity.Car; import java.util.LinkedList; import java.util.List; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/entity/Car.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/entity/Car.java similarity index 75% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/entity/Car.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/entity/Car.java index 243e8fd099..2940d4b99a 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/entity/Car.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/entity/Car.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket.model.entity; +package io.cucumber.examples.java.wicket.model.entity; public class Car { private boolean rented; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Available.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Available.java similarity index 81% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Available.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Available.java index 28c0265b2a..1c5c81e217 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Available.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Available.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.view; +package io.cucumber.examples.java.wicket.view; -import cucumber.examples.java.wicket.Application; +import io.cucumber.examples.java.wicket.Application; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Create.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Create.java similarity index 93% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Create.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Create.java index 4b3e644696..51a431e0e1 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Create.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Create.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.view; +package io.cucumber.examples.java.wicket.view; -import cucumber.examples.java.wicket.Application; +import io.cucumber.examples.java.wicket.Application; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Rent.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Rent.java similarity index 88% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Rent.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Rent.java index 70da7ec18c..a3e2c12270 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Rent.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Rent.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.view; +package io.cucumber.examples.java.wicket.view; -import cucumber.examples.java.wicket.Application; +import io.cucumber.examples.java.wicket.Application; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.CompoundPropertyModel; diff --git a/examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Available.html b/examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Available.html similarity index 100% rename from examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Available.html rename to examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Available.html diff --git a/examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Create.html b/examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Create.html similarity index 100% rename from examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Create.html rename to examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Create.html diff --git a/examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Rent.html b/examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Rent.html similarity index 100% rename from examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Rent.html rename to examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Rent.html diff --git a/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml b/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml index f982d5e917..81194cac23 100644 --- a/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml +++ b/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml @@ -7,7 +7,7 @@ org.apache.wicket.protocol.http.WicketFilter applicationClassName - cucumber.examples.java.wicket.Application + io.cucumber.examples.java.wicket.Application diff --git a/examples/java-wicket/java-wicket-main/src/test/java/cucumber/examples/java/wicket/RentCarTest.java b/examples/java-wicket/java-wicket-main/src/test/java/io/cucumber/examples/java/wicket/RentCarTest.java similarity index 81% rename from examples/java-wicket/java-wicket-main/src/test/java/cucumber/examples/java/wicket/RentCarTest.java rename to examples/java-wicket/java-wicket-main/src/test/java/io/cucumber/examples/java/wicket/RentCarTest.java index 369329909f..68bae27248 100644 --- a/examples/java-wicket/java-wicket-main/src/test/java/cucumber/examples/java/wicket/RentCarTest.java +++ b/examples/java-wicket/java-wicket-main/src/test/java/io/cucumber/examples/java/wicket/RentCarTest.java @@ -1,8 +1,8 @@ -package cucumber.examples.java.wicket; +package io.cucumber.examples.java.wicket; -import cucumber.examples.java.wicket.view.Available; -import cucumber.examples.java.wicket.view.Create; -import cucumber.examples.java.wicket.view.Rent; +import io.cucumber.examples.java.wicket.view.Available; +import io.cucumber.examples.java.wicket.view.Create; +import io.cucumber.examples.java.wicket.view.Rent; import org.apache.wicket.util.tester.WicketTester; import org.junit.Test; diff --git a/examples/java-wicket/java-wicket-test/pom.xml b/examples/java-wicket/java-wicket-test/pom.xml index 2e19d52514..415925b6c3 100644 --- a/examples/java-wicket/java-wicket-test/pom.xml +++ b/examples/java-wicket/java-wicket-test/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-test Examples: Wicket application tested with Selenium diff --git a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/RunCukesIT.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java similarity index 52% rename from examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/RunCukesIT.java rename to examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java index 79251a9699..57edd50ce6 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/RunCukesIT.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket; +package io.cucumber.examples.java.wicket; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentACarSupport.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentACarSupport.java similarity index 96% rename from examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentACarSupport.java rename to examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentACarSupport.java index 98bf6f4565..8eabaf7b35 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentACarSupport.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentACarSupport.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket.steps; +package io.cucumber.examples.java.wicket.steps; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentStepdefs.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java similarity index 95% rename from examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentStepdefs.java rename to examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java index 7d9d933118..2c7205e81f 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentStepdefs.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket.steps; +package io.cucumber.examples.java.wicket.steps; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-wicket/java-wicket-test/src/test/resources/cucumber/examples/java/wicket/Rent.feature b/examples/java-wicket/java-wicket-test/src/test/resources/io/cucumber/examples/java/wicket/Rent.feature similarity index 100% rename from examples/java-wicket/java-wicket-test/src/test/resources/cucumber/examples/java/wicket/Rent.feature rename to examples/java-wicket/java-wicket-test/src/test/resources/io/cucumber/examples/java/wicket/Rent.feature diff --git a/examples/java-wicket/pom.xml b/examples/java-wicket/pom.xml index 4bc9a6d539..202600c6a4 100644 --- a/examples/java-wicket/pom.xml +++ b/examples/java-wicket/pom.xml @@ -3,7 +3,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket pom diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 9183e9e758..50083f5bc4 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java8-calculator @@ -28,20 +28,4 @@ test - - - - - org.apache.maven.plugins - maven-compiler-plugin - - true - UTF-8 - 1.8 - 1.8 - -XDignore.symbol.file=true - - - - diff --git a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java b/examples/java8-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java similarity index 96% rename from examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java rename to examples/java8-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java index c28c15e9cf..88ee9803b2 100644 --- a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java +++ b/examples/java8-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Deque; import java.util.LinkedList; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java similarity index 95% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 00f3417006..ec395c3175 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; import cucumber.api.java8.En; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java similarity index 52% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index be1a9a65cf..cbfe292145 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java similarity index 96% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index c49d4c3fc9..3ee4fde537 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import io.cucumber.datatable.DataTable; import cucumber.api.java8.En; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/TypeRegistryConfiguration.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java similarity index 76% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/TypeRegistryConfiguration.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java index 6f277ef1a3..317bafe6d8 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/TypeRegistryConfiguration.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java @@ -1,10 +1,10 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; -import cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; -import cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; +import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; import java.util.Locale; import java.util.Map; diff --git a/examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature b/examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature similarity index 100% rename from examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature rename to examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature diff --git a/examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature b/examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature similarity index 100% rename from examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature rename to examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature diff --git a/examples/pom.xml b/examples/pom.xml index e4dad3985e..971b1bf0bb 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-examples diff --git a/examples/spring-txn/pom.xml b/examples/spring-txn/pom.xml index 96eaad84ce..88cb8fca33 100644 --- a/examples/spring-txn/pom.xml +++ b/examples/spring-txn/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT spring-txn diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/Message.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/Message.java similarity index 96% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/Message.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/Message.java index ab252c8cc9..65d8017d5f 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/Message.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/Message.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import javax.persistence.Access; import javax.persistence.AccessType; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/MessageRepository.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/MessageRepository.java similarity index 77% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/MessageRepository.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/MessageRepository.java index 18a8fe0b40..b73c09459a 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/MessageRepository.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/MessageRepository.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import org.springframework.data.repository.CrudRepository; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/User.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/User.java similarity index 96% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/User.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/User.java index 44c37e8bad..95e0dbf7c1 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/User.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/User.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import javax.persistence.Access; import javax.persistence.AccessType; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/UserRepository.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/UserRepository.java similarity index 76% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/UserRepository.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/UserRepository.java index 2a10d4084f..4251b5ed9b 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/UserRepository.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/UserRepository.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import org.springframework.data.repository.CrudRepository; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/web/UserController.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/web/UserController.java similarity index 81% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/web/UserController.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/web/UserController.java index f81683a247..3e123da9a7 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/web/UserController.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/web/UserController.java @@ -1,7 +1,7 @@ -package cucumber.examples.spring.txn.web; +package io.cucumber.examples.spring.txn.web; -import cucumber.examples.spring.txn.User; -import cucumber.examples.spring.txn.UserRepository; +import io.cucumber.examples.spring.txn.User; +import io.cucumber.examples.spring.txn.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml b/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml index 987bd4c74b..94f466ea06 100644 --- a/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml +++ b/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml @@ -12,7 +12,7 @@ http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> - + diff --git a/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml b/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml index 21d3585df4..e6d32c0fdf 100644 --- a/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml +++ b/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml @@ -28,7 +28,7 @@ class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> - + @@ -46,6 +46,6 @@ - + diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java deleted file mode 100644 index 81226bd46e..0000000000 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package cucumber.examples.spring.txn; - -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.examples.spring.txn", "cucumber.api.spring"}) -public class RunCukesTest { -} diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/CucumberContextConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java similarity index 91% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/CucumberContextConfiguration.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java index 4676aaa13e..7bb030872d 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/CucumberContextConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.java.Before; import org.springframework.test.context.ContextConfiguration; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java new file mode 100644 index 0000000000..e9e44d8f74 --- /dev/null +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java @@ -0,0 +1,10 @@ +package io.cucumber.examples.spring.txn; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(extraGlue = {"cucumber.api.spring"}) +public class RunCukesTest { +} diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/SeeMessagesStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java similarity index 90% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/SeeMessagesStepdefs.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java index 6536071920..7a255cf23a 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/SeeMessagesStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java @@ -1,11 +1,9 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TypeRegistryConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java similarity index 86% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TypeRegistryConfiguration.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java index 607b8acc08..64afa07c2f 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TypeRegistryConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java @@ -1,7 +1,7 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java similarity index 85% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java index ac3b73d9b1..e0f55c29b2 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java @@ -1,9 +1,7 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.java.en.Given; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.transaction.support.TransactionSynchronizationManager; import static org.junit.Assert.assertTrue; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/mock/SpringMockFactory.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/mock/SpringMockFactory.java similarity index 93% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/mock/SpringMockFactory.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/mock/SpringMockFactory.java index 68645c6922..b6f8607a16 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/mock/SpringMockFactory.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/mock/SpringMockFactory.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn.mock; +package io.cucumber.examples.spring.txn.mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/search.feature b/examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/search.feature similarity index 100% rename from examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/search.feature rename to examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/search.feature diff --git a/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature b/examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/see_messages.feature similarity index 100% rename from examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature rename to examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/see_messages.feature diff --git a/examples/spring-txn/src/test/resources/mockContext.xml b/examples/spring-txn/src/test/resources/mockContext.xml index 69f38704dd..94949ac606 100644 --- a/examples/spring-txn/src/test/resources/mockContext.xml +++ b/examples/spring-txn/src/test/resources/mockContext.xml @@ -5,6 +5,6 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - + diff --git a/guice/README.md b/guice/README.md index 88bee86bdc..c9a8089c2e 100644 --- a/guice/README.md +++ b/guice/README.md @@ -6,4 +6,4 @@ migration section if upgrading from earlier versions of Cucumber Guice. [Read package documentation online at api.cucumber.io](https://github.com/cucumber/api.cucumber.io) -[Read package documentation offline (raw html)](src/main/java/cucumber/api/guice/package.html) +[Read package documentation offline (raw html)](src/main/java/io/cucumber/guice/api/package.html) diff --git a/guice/pom.xml b/guice/pom.xml index bbbea35c9f..599e10e3db 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-guice diff --git a/guice/src/main/java/cucumber/api/guice/CucumberScopes.java b/guice/src/main/java/cucumber/api/guice/CucumberScopes.java deleted file mode 100644 index b9dac00415..0000000000 --- a/guice/src/main/java/cucumber/api/guice/CucumberScopes.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.api.guice; - -import cucumber.runtime.java.guice.ScenarioScope; -import cucumber.runtime.java.guice.impl.SequentialScenarioScope; - -/** - * Provides a convenient cucumber.runtime.java.guice.ScenarioScope instance for use when declaring bindings - * in implementations of com.google.inject.Module. - */ -public class CucumberScopes { - public static final ScenarioScope SCENARIO = new SequentialScenarioScope(); -} diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceInstantiationFailed.java b/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceInstantiationFailed.java deleted file mode 100644 index 75136939cb..0000000000 --- a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceInstantiationFailed.java +++ /dev/null @@ -1,10 +0,0 @@ -package cucumber.runtime.java.guice.impl; - -import cucumber.runtime.CucumberException; - -public class InjectorSourceInstantiationFailed extends CucumberException { - - public InjectorSourceInstantiationFailed(String message, Throwable cause) { - super(message, cause); - } -} \ No newline at end of file diff --git a/guice/src/main/java/cucumber/api/guice/CucumberModules.java b/guice/src/main/java/io/cucumber/guice/api/CucumberModules.java similarity index 54% rename from guice/src/main/java/cucumber/api/guice/CucumberModules.java rename to guice/src/main/java/io/cucumber/guice/api/CucumberModules.java index 8a78912556..73c605effa 100644 --- a/guice/src/main/java/cucumber/api/guice/CucumberModules.java +++ b/guice/src/main/java/io/cucumber/guice/api/CucumberModules.java @@ -1,12 +1,11 @@ -package cucumber.api.guice; +package io.cucumber.guice.api; import com.google.inject.Module; -import cucumber.runtime.java.guice.impl.ScenarioModule; /** * Provides a convenient com.google.inject.Module instance that contains bindings for - * cucumber.runtime.java.guice.ScenarioScoped annotation and for - * cucumber.runtime.java.guice.ScenarioScope. + * ScenarioScoped annotation and for + * ScenarioScope. */ public class CucumberModules { public static final Module SCENARIO = new ScenarioModule(CucumberScopes.SCENARIO); diff --git a/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java b/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java new file mode 100644 index 0000000000..28436f9212 --- /dev/null +++ b/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java @@ -0,0 +1,9 @@ +package io.cucumber.guice.api; + +/** + * Provides a convenient ScenarioScope instance for use when declaring bindings + * in implementations of com.google.inject.Module. + */ +public class CucumberScopes { + public static final ScenarioScope SCENARIO = new SequentialScenarioScope(); +} diff --git a/guice/src/main/java/cucumber/runtime/java/guice/InjectorSource.java b/guice/src/main/java/io/cucumber/guice/api/InjectorSource.java similarity index 75% rename from guice/src/main/java/cucumber/runtime/java/guice/InjectorSource.java rename to guice/src/main/java/io/cucumber/guice/api/InjectorSource.java index 5f5a9d88d7..4ba0042cba 100644 --- a/guice/src/main/java/cucumber/runtime/java/guice/InjectorSource.java +++ b/guice/src/main/java/io/cucumber/guice/api/InjectorSource.java @@ -1,11 +1,11 @@ -package cucumber.runtime.java.guice; +package io.cucumber.guice.api; import com.google.inject.Injector; /** * An implentation of this interface is used to obtain an com.google.inject.Injector that is used to * provide instances of all the classes that are used to run the Cucumber tests. The injector should be configured with - * a binding for cucumber.runtime.java.guice.ScenarioScope. + * a binding for ScenarioScope. */ public interface InjectorSource { Injector getInjector(); diff --git a/guice/src/main/java/cucumber/api/guice/README.java b/guice/src/main/java/io/cucumber/guice/api/README.java similarity index 73% rename from guice/src/main/java/cucumber/api/guice/README.java rename to guice/src/main/java/io/cucumber/guice/api/README.java index 1854d00888..55e41f0e6b 100644 --- a/guice/src/main/java/cucumber/api/guice/README.java +++ b/guice/src/main/java/io/cucumber/guice/api/README.java @@ -1,4 +1,4 @@ -package cucumber.api.guice; +package io.cucumber.guice.api; /** diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/ScenarioModule.java b/guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java similarity index 78% rename from guice/src/main/java/cucumber/runtime/java/guice/impl/ScenarioModule.java rename to guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java index c5e7bf646a..4f8347da13 100644 --- a/guice/src/main/java/cucumber/runtime/java/guice/impl/ScenarioModule.java +++ b/guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java @@ -1,8 +1,6 @@ -package cucumber.runtime.java.guice.impl; +package io.cucumber.guice.api; import com.google.inject.AbstractModule; -import cucumber.runtime.java.guice.ScenarioScoped; -import cucumber.runtime.java.guice.ScenarioScope; public class ScenarioModule extends AbstractModule { diff --git a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScope.java b/guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java similarity index 87% rename from guice/src/main/java/cucumber/runtime/java/guice/ScenarioScope.java rename to guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java index 405c8389be..c255256062 100644 --- a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice; +package io.cucumber.guice.api; import com.google.inject.Scope; diff --git a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScoped.java b/guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java similarity index 83% rename from guice/src/main/java/cucumber/runtime/java/guice/ScenarioScoped.java rename to guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java index f11119e081..a4b049fc46 100644 --- a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScoped.java +++ b/guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice; +package io.cucumber.guice.api; import com.google.inject.ScopeAnnotation; @@ -11,7 +11,7 @@ /** * A custom Guice scope annotation that is usually bound to an instance of - * cucumber.runtime.java.guice.ScenarioScope. + * ScenarioScope. */ @Target({ TYPE, METHOD }) @Retention(RUNTIME) @ScopeAnnotation public @interface ScenarioScoped {} \ No newline at end of file diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/SequentialScenarioScope.java b/guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java similarity index 85% rename from guice/src/main/java/cucumber/runtime/java/guice/impl/SequentialScenarioScope.java rename to guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java index b0b370d1cd..bc62c1e040 100644 --- a/guice/src/main/java/cucumber/runtime/java/guice/impl/SequentialScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java @@ -1,21 +1,21 @@ -package cucumber.runtime.java.guice.impl; +package io.cucumber.guice.api; import com.google.inject.Key; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; -import cucumber.runtime.java.guice.ScenarioScope; +import io.cucumber.guice.api.ScenarioScope; import java.util.HashMap; import java.util.Map; -public class SequentialScenarioScope implements ScenarioScope { +class SequentialScenarioScope implements ScenarioScope { /** * Scopes a provider. The returned provider returns objects from this scope. * If an object does not exist in this scope, the provider can use the given * unscoped provider to retrieve one. - *

    - *

    Scope implementations are strongly encouraged to override + *

    + * Scope implementations are strongly encouraged to override * {@link Object#toString} in the returned provider and include the backing * provider's {@code toString()} output. * @@ -23,8 +23,8 @@ public class SequentialScenarioScope implements ScenarioScope { * @param unscoped locates an instance when one doesn't already exist in this * scope. * @return a new provider which only delegates to the given unscoped provider - * when an instance of the requested object doesn't already exist in this - * scope + * when an instance of the requested object doesn't already exist in this + * scope */ @Override public Provider scope(final Key key, final Provider unscoped) { diff --git a/guice/src/main/java/cucumber/api/guice/package.html b/guice/src/main/java/io/cucumber/guice/api/package.html similarity index 90% rename from guice/src/main/java/cucumber/api/guice/package.html rename to guice/src/main/java/io/cucumber/guice/api/package.html index 317aaa8a9c..79ce44ca8a 100644 --- a/guice/src/main/java/cucumber/api/guice/package.html +++ b/guice/src/main/java/io/cucumber/guice/api/package.html @@ -61,7 +61,7 @@

    Singleton scope

    Using scope annotations

    This is the easy route if you're new to Guice. To bind a class in scenario scope add the - cucumber.runtime.java.guice.ScenarioScoped annotation to the class definition. The class should have + io.cucumber.guice.api.ScenarioScoped annotation to the class definition. The class should have a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example:

    @@ -117,10 +117,10 @@ 

    Using module bindings

    As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements com.google.inject.Module. To do this you should create a class that implements - cucumber.runtime.java.guice.InjectorSource. This gives you complete control over how you obtain a + io.cucumber.guice.api.InjectorSource. This gives you complete control over how you obtain a Guice injector and it's Guice modules. The injector must provide a binding for - cucumber.runtime.java.guice.ScenarioScope. It should also provide a binding for the - cucumber.runtime.java.guice.ScenarioScoped annotation if your classes are using the annotation. The + io.cucumber.guice.api.ScenarioScope. It should also provide a binding for the + io.cucumber.guice.api.ScenarioScoped annotation if your classes are using the annotation. The easiest way to do this it to use CucumberModules.SCENARIO. For example:

    @@ -139,10 +139,10 @@ 

    Using module bindings

    }

    - Cucumber needs to know where to find the cucumber.runtime.java.guice.InjectorSource that it will use. + Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. You should create a properties file called cucumber.properties and place it in the root of the classpath. The file should contain a single property key called guice.injector-source with a value - equal to the fully qualified name of the cucumber.runtime.java.guice.InjectorSource. For example: + equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example:

             guice.injector-source=com.company.YourInjectorSource
    diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
    similarity index 85%
    rename from guice/src/main/java/cucumber/runtime/java/guice/impl/GuiceFactory.java
    rename to guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
    index 8e0ae75110..ccf963db0b 100644
    --- a/guice/src/main/java/cucumber/runtime/java/guice/impl/GuiceFactory.java
    +++ b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
    @@ -1,9 +1,9 @@
    -package cucumber.runtime.java.guice.impl;
    +package io.cucumber.guice.impl;
     
     import com.google.inject.Injector;
     import cucumber.api.java.ObjectFactory;
    -import cucumber.runtime.Env;
    -import cucumber.runtime.java.guice.ScenarioScope;
    +import io.cucumber.core.options.Env;
    +import io.cucumber.guice.api.ScenarioScope;
     
     /**
      * Guice implementation of the cucumber.api.java.ObjectFactory.
    @@ -20,7 +20,7 @@ public GuiceFactory() {
          * Package private constructor that is called by the public constructor at runtime and is also called directly by
          * tests.
          *
    -     * @param injector an injector configured with a binding for cucumber.runtime.java.guice.ScenarioScope.
    +     * @param injector an injector configured with a binding for ScenarioScope.
          */
         GuiceFactory(Injector injector) {
             this.injector = injector;
    diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
    similarity index 64%
    rename from guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceFactory.java
    rename to guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
    index 59c4dbc9f4..7cf2caca60 100644
    --- a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceFactory.java
    +++ b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
    @@ -1,23 +1,23 @@
    -package cucumber.runtime.java.guice.impl;
    +package io.cucumber.guice.impl;
     
     import com.google.inject.Guice;
    -import com.google.inject.Injector;
     import com.google.inject.Stage;
    -import cucumber.runtime.Env;
    -import cucumber.runtime.java.guice.InjectorSource;
    +import io.cucumber.core.options.Env;
    +import io.cucumber.guice.api.CucumberModules;
    +import io.cucumber.guice.api.InjectorSource;
     
     import static java.text.MessageFormat.format;
     
    -public class InjectorSourceFactory {
    +class InjectorSourceFactory {
     
    -    public static final String GUICE_INJECTOR_SOURCE_KEY = "guice.injector-source";
    +    static final String GUICE_INJECTOR_SOURCE_KEY = "guice.injector-source";
         private final Env env;
     
    -    public InjectorSourceFactory(Env env) {
    +    InjectorSourceFactory(Env env) {
             this.env = env;
         }
     
    -    public InjectorSource create() {
    +    InjectorSource create() {
             String injectorSourceClassName = env.get(GUICE_INJECTOR_SOURCE_KEY);
             if (injectorSourceClassName == null) {
                 return createDefaultScenarioModuleInjectorSource();
    @@ -27,13 +27,7 @@ public InjectorSource create() {
         }
     
         private InjectorSource createDefaultScenarioModuleInjectorSource() {
    -        return new InjectorSource() {
    -            @Override
    -            public Injector getInjector() {
    -                ScenarioModule scenarioModule = new ScenarioModule(new SequentialScenarioScope());
    -                return Guice.createInjector(Stage.PRODUCTION, scenarioModule);
    -            }
    -        };
    +        return () -> Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO);
         }
     
         private InjectorSource instantiateUserSpecifiedInjectorSource(String injectorSourceClassName) {
    diff --git a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
    new file mode 100644
    index 0000000000..8254682e9a
    --- /dev/null
    +++ b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
    @@ -0,0 +1,10 @@
    +package io.cucumber.guice.impl;
    +
    +import io.cucumber.core.exception.CucumberException;
    +
    +class InjectorSourceInstantiationFailed extends CucumberException {
    +
    +    InjectorSourceInstantiationFailed(String message, Throwable cause) {
    +        super(message, cause);
    +    }
    +}
    \ No newline at end of file
    diff --git a/guice/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory b/guice/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory
    new file mode 100644
    index 0000000000..a88d454ca6
    --- /dev/null
    +++ b/guice/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory
    @@ -0,0 +1 @@
    +io.cucumber.guice.impl.GuiceFactory
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java b/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java
    deleted file mode 100644
    index 5462ee1b16..0000000000
    --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -package cucumber.runtime.java.guice.integration;
    -
    -public class ScenarioScopedObject {
    -}
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java b/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java
    deleted file mode 100644
    index 0c55f1ace3..0000000000
    --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -package cucumber.runtime.java.guice.integration;
    -
    -public class SingletonObject {
    -}
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java b/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java
    deleted file mode 100644
    index 6da9e483b8..0000000000
    --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -package cucumber.runtime.java.guice.integration;
    -
    -public class UnScopedObject {
    -}
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtil.java b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtil.java
    similarity index 94%
    rename from guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtil.java
    rename to guice/src/test/java/io/cucumber/guice/collection/CollectionUtil.java
    index 244461ae54..0fec57755c 100644
    --- a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtil.java
    +++ b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtil.java
    @@ -1,4 +1,4 @@
    -package cucumber.runtime.java.guice.collection;
    +package io.cucumber.guice.collection;
     
     import java.util.List;
     
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtilTest.java b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java
    similarity index 97%
    rename from guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtilTest.java
    rename to guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java
    index f12aef2074..c7a61e54d3 100644
    --- a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtilTest.java
    +++ b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java
    @@ -1,4 +1,4 @@
    -package cucumber.runtime.java.guice.collection;
    +package io.cucumber.guice.collection;
     
     import org.junit.Before;
     import org.junit.Test;
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/impl/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
    similarity index 74%
    rename from guice/src/test/java/cucumber/runtime/java/guice/impl/GuiceFactoryTest.java
    rename to guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
    index 11ada40622..d9f405375a 100644
    --- a/guice/src/test/java/cucumber/runtime/java/guice/impl/GuiceFactoryTest.java
    +++ b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
    @@ -1,32 +1,36 @@
    -package cucumber.runtime.java.guice.impl;
    +package io.cucumber.guice.impl;
     
     import com.google.inject.AbstractModule;
    -import com.google.inject.ConfigurationException;
     import com.google.inject.Guice;
     import com.google.inject.Injector;
     import com.google.inject.Module;
     import com.google.inject.Scopes;
     import com.google.inject.Stage;
    -import cucumber.api.guice.CucumberModules;
    -import cucumber.api.guice.CucumberScopes;
     import cucumber.api.java.ObjectFactory;
    -import cucumber.runtime.java.guice.ScenarioScoped;
    +import io.cucumber.guice.api.CucumberModules;
    +import io.cucumber.guice.api.CucumberScopes;
    +import io.cucumber.guice.api.ScenarioScoped;
    +import io.cucumber.guice.matcher.ElementsAreAllEqualMatcher;
    +import io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher;
     import org.junit.After;
    +import org.junit.Rule;
     import org.junit.Test;
    +import org.junit.rules.ExpectedException;
     
     import javax.inject.Singleton;
     import java.util.Arrays;
     import java.util.List;
     
    -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual;
    -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique;
     import static org.hamcrest.CoreMatchers.containsString;
     import static org.hamcrest.CoreMatchers.notNullValue;
     import static org.junit.Assert.assertThat;
    -import static org.junit.Assert.fail;
    +import static org.junit.rules.ExpectedException.none;
     
     public class GuiceFactoryTest {
     
    +    @Rule
    +    public ExpectedException expectedException = none();
    +
         private ObjectFactory factory;
         private List instancesFromSameScenario;
         private List instancesFromDifferentScenarios;
    @@ -38,7 +42,7 @@ public void tearDown() {
         }
     
         @Test
    -    public void factoryCanBeIntantiatedWithDefaultConstructor() throws Exception {
    +    public void factoryCanBeIntantiatedWithDefaultConstructor() {
             factory = new GuiceFactory();
             assertThat(factory, notNullValue());
         }
    @@ -52,67 +56,69 @@ public void factoryCanBeIntantiatedWithArgConstructor() {
         @Test
         public void factoryStartFailsIfScenarioScopeIsNotBound() {
             factory = new GuiceFactory(Guice.createInjector());
    -        try {
    -            factory.start();
    -            fail();
    -        } catch (ConfigurationException e) {
    -            assertThat(e.getMessage(),
    -                    containsString("No implementation for cucumber.runtime.java.guice.ScenarioScope was bound"));
    -        }
    +        expectedException.expectMessage(containsString("No implementation for io.cucumber.guice.api.ScenarioScope was bound"));
    +        factory.start();
         }
     
    -    static class UnscopedClass {}
    +    static class UnscopedClass {
    +    }
     
         @Test
         public void shouldGiveNewInstancesOfUnscopedClassWithinAScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
             instancesFromSameScenario = getInstancesFromSameScenario(factory, UnscopedClass.class);
    -        assertThat(instancesFromSameScenario, elementsAreAllUnique());
    +        assertThat(instancesFromSameScenario, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
         @Test
         public void shouldGiveNewInstanceOfUnscopedClassForEachScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
             instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, UnscopedClass.class);
    -        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
    +        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
    -    @ScenarioScoped static class AnnotatedScenarioScopedClass {}
    +    @ScenarioScoped
    +    static class AnnotatedScenarioScopedClass {
    +    }
     
         @Test
         public void shouldGiveTheSameInstanceOfAnnotatedScenarioScopedClassWithinAScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
             instancesFromSameScenario = getInstancesFromSameScenario(factory, AnnotatedScenarioScopedClass.class);
    -        assertThat(instancesFromSameScenario, elementsAreAllEqual());
    +        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
         @Test
         public void shouldGiveNewInstanceOfAnnotatedScenarioScopedClassForEachScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
             instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, AnnotatedScenarioScopedClass.class);
    -        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
    +        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
    -    @Singleton static class AnnotatedSingletonClass {}
    +    @Singleton
    +    static class AnnotatedSingletonClass {
    +    }
     
         @Test
         public void shouldGiveTheSameInstanceOfAnnotatedSingletonClassWithinAScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
             instancesFromSameScenario = getInstancesFromSameScenario(factory, AnnotatedSingletonClass.class);
    -        assertThat(instancesFromSameScenario, elementsAreAllEqual());
    +        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
         @Test
         public void shouldGiveTheSameInstanceOfAnnotatedSingletonClassForEachScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
             instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, AnnotatedSingletonClass.class);
    -        assertThat(instancesFromDifferentScenarios, elementsAreAllEqual());
    +        assertThat(instancesFromDifferentScenarios, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
    -    static class BoundScenarioScopedClass {}
    +    static class BoundScenarioScopedClass {
    +    }
     
         final AbstractModule boundScenarioScopedClassModule = new AbstractModule() {
    -        @Override protected void configure() {
    +        @Override
    +        protected void configure() {
                 bind(BoundScenarioScopedClass.class).in(CucumberScopes.SCENARIO);
             }
         };
    @@ -121,20 +127,22 @@ static class BoundScenarioScopedClass {}
         public void shouldGiveTheSameInstanceOfBoundScenarioScopedClassWithinAScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundScenarioScopedClassModule));
             instancesFromSameScenario = getInstancesFromSameScenario(factory, BoundScenarioScopedClass.class);
    -        assertThat(instancesFromSameScenario, elementsAreAllEqual());
    +        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
         @Test
         public void shouldGiveNewInstanceOfBoundScenarioScopedClassForEachScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundScenarioScopedClassModule));
             instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, BoundScenarioScopedClass.class);
    -        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
    +        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
    -    static class BoundSingletonClass {}
    +    static class BoundSingletonClass {
    +    }
     
         final AbstractModule boundSingletonClassModule = new AbstractModule() {
    -        @Override protected void configure() {
    +        @Override
    +        protected void configure() {
                 bind(BoundSingletonClass.class).in(Scopes.SINGLETON);
             }
         };
    @@ -143,14 +151,14 @@ static class BoundSingletonClass {}
         public void shouldGiveTheSameInstanceOfBoundSingletonClassWithinAScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundSingletonClassModule));
             instancesFromSameScenario = getInstancesFromSameScenario(factory, BoundSingletonClass.class);
    -        assertThat(instancesFromSameScenario, elementsAreAllEqual());
    +        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
         @Test
         public void shouldGiveTheSameInstanceOfBoundSingletonClassForEachScenario() {
             factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundSingletonClassModule));
             instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, BoundSingletonClass.class);
    -        assertThat(instancesFromDifferentScenarios, elementsAreAllEqual());
    +        assertThat(instancesFromDifferentScenarios, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
         @Test
    @@ -162,7 +170,7 @@ protected void configure() {
                 }
             }));
             instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, AnnotatedSingletonClass.class);
    -        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
    +        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
         private Injector injector(Module... module) {
    diff --git a/guice/src/test/java/cucumber/runtime/java/guice/impl/InjectorSourceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
    similarity index 92%
    rename from guice/src/test/java/cucumber/runtime/java/guice/impl/InjectorSourceFactoryTest.java
    rename to guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
    index 61e3a84fda..c267538069 100644
    --- a/guice/src/test/java/cucumber/runtime/java/guice/impl/InjectorSourceFactoryTest.java
    +++ b/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
    @@ -1,17 +1,13 @@
    -package cucumber.runtime.java.guice.impl;
    +package io.cucumber.guice.impl;
     
     import com.google.inject.Injector;
    -import cucumber.runtime.Env;
    -import cucumber.runtime.java.guice.InjectorSource;
    -import org.junit.Assert;
    +import io.cucumber.core.options.Env;
    +import io.cucumber.guice.api.InjectorSource;
     import org.junit.Test;
     
     import java.io.ByteArrayOutputStream;
     import java.io.File;
     import java.io.FileInputStream;
    -import java.io.FileNotFoundException;
    -import java.net.URL;
    -import java.net.URLClassLoader;
     import java.util.Properties;
     
     import static org.hamcrest.CoreMatchers.instanceOf;
    @@ -123,7 +119,7 @@ public void failsToInstantiateClassWithNoDefaultConstructor() throws Exception {
        * 
        * 

    MyChildClassLoader is the only classloader with knowledge of c.r.j.guice.impl.LivesInChildClassLoader * - *

    The bytecode of LivesInChildClassLoader is intentionally renamed to 'LivesInChildClassLoader.class.txt' to prevent + *

    The bytecode of LivesInChildClassLoader is intentionally renamed to 'LivesInChildClassLoader.class.bin.txt' to prevent * this test's ClassLoader from resolving it. * *

    If InjectorSourceFactory calls Class#forName without an explicit ClassLoader argument, which is the behavior of @@ -139,7 +135,7 @@ public void instantiateClassInChildClassLoader() throws Exception { Thread.currentThread().setContextClassLoader( childClassLoader ); Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "cucumber.runtime.java.guice.impl.LivesInChildClassLoader"); + properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "io.cucumber.guice.impl.LivesInChildClassLoader"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); @@ -152,8 +148,8 @@ public MyChildClassLoader( ClassLoader parent ) { @Override protected Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { - if( name.equals( "cucumber.runtime.java.guice.impl.LivesInChildClassLoader" ) ) { - String filename = getClass().getClassLoader().getResource("cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin").getFile(); + if( name.equals( "io.cucumber.guice.impl.LivesInChildClassLoader" ) ) { + String filename = getClass().getClassLoader().getResource("io/cucumber/guice/impl/LivesInChildClassLoader.class.bin").getFile(); File file = new File( filename ); try { FileInputStream in = new FileInputStream( file ); diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.java.txt b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt similarity index 64% rename from guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.java.txt rename to guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt index 8a789bf33b..f0c2bf767b 100644 --- a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.java.txt +++ b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt @@ -1,7 +1,7 @@ -package cucumber.runtime.java.guice.impl; +package io.cucumber.guice.impl; import com.google.inject.Injector; -import cucumber.runtime.java.guice.InjectorSource; +import io.cucumber.guice.api.InjectorSource; public class LivesInChildClassLoader implements InjectorSource { @Override diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java similarity index 66% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/HelloWorldSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java index 14fbbb3a5d..16e3e51873 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/HelloWorldSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java @@ -1,7 +1,7 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.guice.api.ScenarioScoped; @ScenarioScoped public class HelloWorldSteps { diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/RunCukesTest.java b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java similarity index 83% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/RunCukesTest.java rename to guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java index ce47997ebf..10ba1c347f 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/RunCukesTest.java +++ b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; /** diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java new file mode 100644 index 0000000000..ef9723e8f8 --- /dev/null +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java @@ -0,0 +1,4 @@ +package io.cucumber.guice.integration; + +public class ScenarioScopedObject { +} diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java similarity index 85% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java index 93dba7fe0a..6035039919 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java @@ -1,18 +1,18 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; import javax.inject.Provider; import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.java.guice.collection.CollectionUtil.removeAllExceptFirstElement; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; +import static io.cucumber.guice.collection.CollectionUtil.removeAllExceptFirstElement; +import static io.cucumber.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; +import static io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java new file mode 100644 index 0000000000..1b4326ae95 --- /dev/null +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java @@ -0,0 +1,4 @@ +package io.cucumber.guice.integration; + +public class SingletonObject { +} diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java similarity index 88% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonScopedSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java index ad4c324fef..c03a281388 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java @@ -1,17 +1,17 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; import javax.inject.Provider; import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.java.guice.collection.CollectionUtil.removeAllExceptFirstElement; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; +import static io.cucumber.guice.collection.CollectionUtil.removeAllExceptFirstElement; +import static io.cucumber.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java new file mode 100644 index 0000000000..992f39e63e --- /dev/null +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java @@ -0,0 +1,4 @@ +package io.cucumber.guice.integration; + +public class UnScopedObject { +} diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java similarity index 91% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java index 1909f4855e..8c5f087d33 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; +import static io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/UnusedGlue.java b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java similarity index 90% rename from openejb/src/test/java/cucumber/runtime/java/openejb/UnusedGlue.java rename to guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java index 4f06280778..a75dcb5e07 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/UnusedGlue.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.guice.integration; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourInjectorSource.java b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java similarity index 69% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/YourInjectorSource.java rename to guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java index d6be328a3a..f7eec49773 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourInjectorSource.java +++ b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java @@ -1,10 +1,10 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Stage; -import cucumber.api.guice.CucumberModules; -import cucumber.runtime.java.guice.InjectorSource; +import io.cucumber.guice.api.CucumberModules; +import io.cucumber.guice.api.InjectorSource; public class YourInjectorSource implements InjectorSource { diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourModule.java b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java similarity index 80% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/YourModule.java rename to guice/src/test/java/io/cucumber/guice/integration/YourModule.java index 870ee22fea..9172300cfd 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourModule.java +++ b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import com.google.inject.AbstractModule; import com.google.inject.Scopes; -import cucumber.api.guice.CucumberScopes; +import io.cucumber.guice.api.CucumberScopes; public class YourModule extends AbstractModule { diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-no-scope.feature b/guice/src/test/java/io/cucumber/guice/integration/guice-no-scope.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-no-scope.feature rename to guice/src/test/java/io/cucumber/guice/integration/guice-no-scope.feature diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-scenario-scope.feature b/guice/src/test/java/io/cucumber/guice/integration/guice-scenario-scope.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-scenario-scope.feature rename to guice/src/test/java/io/cucumber/guice/integration/guice-scenario-scope.feature diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-singleton-scope.feature b/guice/src/test/java/io/cucumber/guice/integration/guice-singleton-scope.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-singleton-scope.feature rename to guice/src/test/java/io/cucumber/guice/integration/guice-singleton-scope.feature diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/hello.feature b/guice/src/test/java/io/cucumber/guice/integration/hello.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/hello.feature rename to guice/src/test/java/io/cucumber/guice/integration/hello.feature diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/AbstractMatcherTest.java b/guice/src/test/java/io/cucumber/guice/matcher/AbstractMatcherTest.java similarity index 98% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/AbstractMatcherTest.java rename to guice/src/test/java/io/cucumber/guice/matcher/AbstractMatcherTest.java index 737948f93a..23b827b5b7 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/AbstractMatcherTest.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/AbstractMatcherTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import junit.framework.TestCase; import org.hamcrest.Description; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcher.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcher.java similarity index 97% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcher.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcher.java index 6cf8cf4f48..cb69d651a4 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcher.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Description; import org.hamcrest.Factory; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcherTest.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcherTest.java similarity index 91% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcherTest.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcherTest.java index 1dca321b9b..a5134f02e9 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcherTest.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcherTest.java @@ -1,15 +1,13 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Matcher; import java.util.Arrays; import java.util.Collection; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; - public class ElementsAreAllEqualMatcherTest extends AbstractMatcherTest { - private final Matcher> matcher = elementsAreAllEqual(); + private final Matcher> matcher = ElementsAreAllEqualMatcher.elementsAreAllEqual(); @Override protected Matcher createMatcher() { diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllMatcher.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllMatcher.java similarity index 96% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllMatcher.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllMatcher.java index 5e2a3b2e75..f0bd803fc0 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllMatcher.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Description; import org.hamcrest.TypeSafeDiagnosingMatcher; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcher.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcher.java similarity index 97% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcher.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcher.java index e9435cd245..9966139e9e 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcher.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Description; import org.hamcrest.Factory; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcherTest.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcherTest.java similarity index 91% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcherTest.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcherTest.java index ccbf9f557b..2525f4142c 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcherTest.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcherTest.java @@ -1,15 +1,13 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Matcher; import java.util.Arrays; import java.util.Collection; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; - public class ElementsAreAllUniqueMatcherTest extends AbstractMatcherTest { - private final Matcher> matcher = elementsAreAllUnique(); + private final Matcher> matcher = ElementsAreAllUniqueMatcher.elementsAreAllUnique(); @Override protected Matcher createMatcher() { diff --git a/guice/src/test/resources/cucumber.properties b/guice/src/test/resources/cucumber.properties index 5fc09fea75..b3672ffdfa 100644 --- a/guice/src/test/resources/cucumber.properties +++ b/guice/src/test/resources/cucumber.properties @@ -1 +1 @@ -guice.injector-source=cucumber.runtime.java.guice.integration.YourInjectorSource +guice.injector-source=io.cucumber.guice.integration.YourInjectorSource diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin b/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin deleted file mode 100644 index da2c952a67..0000000000 Binary files a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin and /dev/null differ diff --git a/guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin b/guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin new file mode 100644 index 0000000000..f306ff0ede Binary files /dev/null and b/guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin differ diff --git a/java/pom.xml b/java/pom.xml index e3cbaaeed6..446292b7c1 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java diff --git a/java/src/main/code_generator/I18n.java.txt b/java/src/main/code_generator/I18n.java.txt index 119b091ec3..6788b4a3fa 100644 --- a/java/src/main/code_generator/I18n.java.txt +++ b/java/src/main/code_generator/I18n.java.txt @@ -1,6 +1,6 @@ package cucumber.api.java.${lang}; -import cucumber.runtime.java.StepDefAnnotation; +import io.cucumber.java.StepDefAnnotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/core/src/main/java/cucumber/api/PendingException.java b/java/src/main/java/cucumber/api/java/PendingException.java similarity index 65% rename from core/src/main/java/cucumber/api/PendingException.java rename to java/src/main/java/cucumber/api/java/PendingException.java index be30dd1c65..24606e14cc 100644 --- a/core/src/main/java/cucumber/api/PendingException.java +++ b/java/src/main/java/cucumber/api/java/PendingException.java @@ -1,8 +1,10 @@ -package cucumber.api; +package cucumber.api.java; + +import io.cucumber.core.backend.Pending; // We're deliberately not extending CucumberException (which is used to signal fatal errors) @Pending -public class PendingException extends RuntimeException { +public final class PendingException extends RuntimeException { public PendingException() { this("TODO: implement me"); } diff --git a/core/src/main/java/cucumber/api/Transpose.java b/java/src/main/java/cucumber/api/java/Transpose.java similarity index 97% rename from core/src/main/java/cucumber/api/Transpose.java rename to java/src/main/java/cucumber/api/java/Transpose.java index fb92a16f4c..713874285b 100644 --- a/core/src/main/java/cucumber/api/Transpose.java +++ b/java/src/main/java/cucumber/api/java/Transpose.java @@ -1,4 +1,4 @@ -package cucumber.api; +package cucumber.api.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/cucumber/runtime/java/AbstractJavaSnippet.java b/java/src/main/java/io/cucumber/java/AbstractJavaSnippet.java similarity index 95% rename from java/src/main/java/cucumber/runtime/java/AbstractJavaSnippet.java rename to java/src/main/java/io/cucumber/java/AbstractJavaSnippet.java index 91922e2c76..ed59461ccb 100644 --- a/java/src/main/java/cucumber/runtime/java/AbstractJavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/AbstractJavaSnippet.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.runtime.snippets.Snippet; +import io.cucumber.core.snippets.Snippet; import io.cucumber.datatable.DataTable; import java.lang.reflect.Type; diff --git a/java/src/main/java/cucumber/runtime/java/DefaultJavaObjectFactory.java b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java similarity index 87% rename from java/src/main/java/cucumber/runtime/java/DefaultJavaObjectFactory.java rename to java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java index 00bcc51b43..ea1bf2104f 100644 --- a/java/src/main/java/cucumber/runtime/java/DefaultJavaObjectFactory.java +++ b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java @@ -1,15 +1,14 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; /** - * This class has package scope so it doesn't get loaded by reflection, + * This class has package scope so it doesn't loadGlue loaded by reflection, * thereby colliding with other DI implementations. */ class DefaultJavaObjectFactory implements ObjectFactory { diff --git a/java/src/main/java/cucumber/runtime/java/Function.java b/java/src/main/java/io/cucumber/java/Function.java similarity index 64% rename from java/src/main/java/cucumber/runtime/java/Function.java rename to java/src/main/java/io/cucumber/java/Function.java index fe6ea885e2..5cb1e9c509 100644 --- a/java/src/main/java/cucumber/runtime/java/Function.java +++ b/java/src/main/java/io/cucumber/java/Function.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; public interface Function { diff --git a/java/src/main/java/cucumber/runtime/java/Java8Snippet.java b/java/src/main/java/io/cucumber/java/Java8Snippet.java similarity index 69% rename from java/src/main/java/cucumber/runtime/java/Java8Snippet.java rename to java/src/main/java/io/cucumber/java/Java8Snippet.java index 76f9d1e66e..0a25a55c9d 100644 --- a/java/src/main/java/cucumber/runtime/java/Java8Snippet.java +++ b/java/src/main/java/io/cucumber/java/Java8Snippet.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; final class Java8Snippet extends AbstractJavaSnippet { @@ -7,7 +7,7 @@ public String template() { return "" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + - "{5} throw new cucumber.api.PendingException();\n" + + "{5} throw new cucumber.api.java.PendingException();\n" + "'}');\n"; } } diff --git a/java/src/main/java/cucumber/runtime/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java similarity index 88% rename from java/src/main/java/cucumber/runtime/java/JavaBackend.java rename to java/src/main/java/io/cucumber/java/JavaBackend.java index a99111585a..80ca08b6ac 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -1,29 +1,29 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import static cucumber.runtime.io.MultiLoader.packageName; -import static cucumber.runtime.java.ObjectFactoryLoader.loadObjectFactory; +import static io.cucumber.core.io.MultiLoader.packageName; +import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; import static java.lang.Thread.currentThread; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; import cucumber.api.java.BeforeStep; import cucumber.api.java.ObjectFactory; import cucumber.api.java8.GlueBase; -import cucumber.runtime.Backend; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Env; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.Utils; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.snippets.FunctionNameGenerator; -import cucumber.runtime.snippets.Snippet; -import cucumber.runtime.snippets.SnippetGenerator; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.options.Env; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.PickleStep; import java.lang.annotation.Annotation; @@ -117,7 +117,6 @@ public void buildWorld() { // in the constructor. try { INSTANCE.set(this); - glue.removeScenarioScopedGlue(); for (Class glueBaseClass : glueBaseClasses) { objectFactory.getInstance(glueBaseClass); } @@ -132,7 +131,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return snippetGenerator.getSnippet(step, keyword, functionNameGenerator); } @@ -205,12 +204,12 @@ public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { private String expression(Annotation annotation) throws Throwable { Method expressionMethod = annotation.getClass().getMethod("value"); - return (String) Utils.invoke(annotation, expressionMethod, 0); + return (String) Invoker.invoke(annotation, expressionMethod, 0); } private long timeoutMillis(Annotation annotation) throws Throwable { Method regexpMethod = annotation.getClass().getMethod("timeout"); - return (Long) Utils.invoke(annotation, regexpMethod, 0); + return (Long) Invoker.invoke(annotation, regexpMethod, 0); } } diff --git a/java/src/main/java/cucumber/runtime/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java similarity index 83% rename from java/src/main/java/cucumber/runtime/java/JavaHookDefinition.java rename to java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 3868b87375..7dfe3bba38 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,13 +1,13 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.MethodFormat; -import cucumber.runtime.Utils; -import cucumber.runtime.filter.TagPredicate; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.filter.TagPredicate; import gherkin.pickles.PickleTag; +import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; import java.util.Collection; @@ -57,7 +57,7 @@ public void execute(Scenario scenario) throws Throwable { throw new CucumberException("Hooks must declare 0 or 1 arguments. " + method.toString()); } - Utils.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); + Invoker.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } @Override diff --git a/java/src/main/java/cucumber/runtime/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java similarity index 71% rename from java/src/main/java/cucumber/runtime/java/JavaSnippet.java rename to java/src/main/java/io/cucumber/java/JavaSnippet.java index 485973f38a..3f4955bbc2 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; final class JavaSnippet extends AbstractJavaSnippet { @@ -8,7 +8,7 @@ public String template() { "@{0}(\"{1}\")\n" + "public void {2}({3}) '{'\n" + " // {4}\n" + - "{5} throw new cucumber.api.PendingException();\n" + + "{5} throw new cucumber.api.java.PendingException();\n" + "'}'\n"; } } diff --git a/java/src/main/java/cucumber/runtime/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java similarity index 78% rename from java/src/main/java/cucumber/runtime/java/JavaStepDefinition.java rename to java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 5d21272867..68ca065efb 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -1,15 +1,15 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.ObjectFactory; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.ArgumentMatcher; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import cucumber.runtime.MethodFormat; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; -import cucumber.runtime.Utils; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; import gherkin.pickles.PickleStep; import java.lang.reflect.Method; @@ -45,7 +45,7 @@ private StepExpression createExpression(String expression, TypeRegistry typeRegi } public void execute(Object[] args) throws Throwable { - Utils.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); + Invoker.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } public List matchedArguments(PickleStep step) { diff --git a/java/src/main/java/cucumber/runtime/java/LambdaGlueRegistry.java b/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java similarity index 72% rename from java/src/main/java/cucumber/runtime/java/LambdaGlueRegistry.java rename to java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java index b720d6105e..46ad5454a8 100644 --- a/java/src/main/java/cucumber/runtime/java/LambdaGlueRegistry.java +++ b/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; public interface LambdaGlueRegistry { ThreadLocal INSTANCE = new ThreadLocal(); diff --git a/java/src/main/java/cucumber/runtime/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java similarity index 92% rename from java/src/main/java/cucumber/runtime/java/MethodScanner.java rename to java/src/main/java/io/cucumber/java/MethodScanner.java index 5132e43819..e5bbeadec2 100644 --- a/java/src/main/java/cucumber/runtime/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -1,18 +1,18 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; import cucumber.api.java.BeforeStep; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Utils; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.Reflections; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.List; -import static cucumber.runtime.io.MultiLoader.packageName; +import static io.cucumber.core.io.MultiLoader.packageName; class MethodScanner { @@ -31,7 +31,7 @@ public MethodScanner(ClassFinder classFinder) { public void scan(JavaBackend javaBackend, List gluePaths) { for (String gluePath : gluePaths) { for (Class glueCodeClass : classFinder.getDescendants(Object.class, packageName(gluePath))) { - while (glueCodeClass != null && glueCodeClass != Object.class && !Utils.isInstantiable(glueCodeClass)) { + while (glueCodeClass != null && glueCodeClass != Object.class && !Reflections.isInstantiable(glueCodeClass)) { // those can't be instantiated without container class present. glueCodeClass = glueCodeClass.getSuperclass(); } diff --git a/java/src/main/java/cucumber/runtime/java/ObjectFactoryLoader.java b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java similarity index 57% rename from java/src/main/java/cucumber/runtime/java/ObjectFactoryLoader.java rename to java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java index f4fe0ac325..d83eb034db 100644 --- a/java/src/main/java/cucumber/runtime/java/ObjectFactoryLoader.java +++ b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java @@ -1,46 +1,55 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.NoInstancesException; -import cucumber.runtime.Reflections; -import cucumber.runtime.TooManyInstancesException; +import io.cucumber.core.io.ClassFinder; -import static java.util.Arrays.asList; +import java.util.Iterator; +import java.util.ServiceLoader; public class ObjectFactoryLoader { + + private static final ServiceLoader LOADER = ServiceLoader.load(ObjectFactory.class); + private ObjectFactoryLoader() { } /** * Loads an instance of {@link ObjectFactory}. The class name can be explicit, or it can be null. - * When it's null, the implementation is searched for in the

    cucumber.runtime
    packahe. + * When it's null, the implementation is searched for in the
    cucumber.runtime
    package. * * @param classFinder where to load classes from * @param objectFactoryClassName specific class name of {@link ObjectFactory} implementation. May be null. * @return an instance of {@link ObjectFactory} */ + // TODO remove once confirmed classFinder and/or objectFactoryClassName are not need for serviceLoader public static ObjectFactory loadObjectFactory(ClassFinder classFinder, String objectFactoryClassName) { + return loadObjectFactory(); + } + + /** + * Loads an instance of {@link ObjectFactory} using the {@link ServiceLoader}. + * The class name can be explicit, or it can be null. + * When it's null, the implementation is searched for in the
    cucumber.runtime
    package. + * + * @return an instance of {@link ObjectFactory} + */ + public static ObjectFactory loadObjectFactory() { + + final Iterator objectFactories = LOADER.iterator(); + ObjectFactory objectFactory; - try { - Reflections reflections = new Reflections(classFinder); - - if(objectFactoryClassName != null) { - Class objectFactoryClass = (Class) classFinder.loadClass(objectFactoryClassName); - objectFactory = reflections.newInstance(new Class[0], new Object[0], objectFactoryClass); - } else { - objectFactory = reflections.instantiateExactlyOneSubclass(ObjectFactory.class, asList("cucumber.runtime"), new Class[0], new Object[0], null); - } - } catch (TooManyInstancesException e) { - System.out.println(e.getMessage()); - System.out.println(getMultipleObjectFactoryLogMessage()); + if (objectFactories.hasNext()) { + objectFactory = objectFactories.next(); + + } else { objectFactory = new DefaultJavaObjectFactory(); - } catch (NoInstancesException e) { + } + + if (objectFactories.hasNext()) { + System.out.println(getMultipleObjectFactoryLogMessage()); objectFactory = new DefaultJavaObjectFactory(); - } catch (ClassNotFoundException e) { - throw new CucumberException("Couldn't instantiate custom ObjectFactory", e); } + return objectFactory; } @@ -53,4 +62,5 @@ private static String getMultipleObjectFactoryLogMessage() { sb.append("In order to enjoy IoC features, please remove the unnecessary dependencies from your classpath.\n"); return sb.toString(); } + } diff --git a/java/src/main/java/cucumber/runtime/java/ParameterInfo.java b/java/src/main/java/io/cucumber/java/ParameterInfo.java similarity index 95% rename from java/src/main/java/cucumber/runtime/java/ParameterInfo.java rename to java/src/main/java/io/cucumber/java/ParameterInfo.java index 7c8a0cd1e3..17969ff52f 100644 --- a/java/src/main/java/cucumber/runtime/java/ParameterInfo.java +++ b/java/src/main/java/io/cucumber/java/ParameterInfo.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.api.Transpose; +import cucumber.api.java.Transpose; import java.lang.annotation.Annotation; import java.lang.reflect.Method; diff --git a/java/src/main/java/io/cucumber/java/StaticGlue.java b/java/src/main/java/io/cucumber/java/StaticGlue.java new file mode 100644 index 0000000000..e6304007bf --- /dev/null +++ b/java/src/main/java/io/cucumber/java/StaticGlue.java @@ -0,0 +1,57 @@ +package io.cucumber.java; + +import cucumber.api.java.ObjectFactory; +import io.cucumber.core.stepexpression.TypeRegistry; + +public class StaticGlue { + + + + private static interface GlueProvider { + + StaticGlue loadGlue(String glue_paths); + } + + private static class JavaGlueProvider implements GlueProvider{ + + // same constructor as JavaBackend + + @Override + public StaticGlue loadGlue(String glue_paths) { + // create glue instance + + // add glue methods + + return null; + } + } + + + private static class Main { + + public void main(){ + + StaticGlue staticGlue = new JavaGlueProvider().loadGlue("glue paths"); + + staticGlue.buildWorld(); + + + + } + + + } + + private void buildWorld() { + } + + + private TypeRegistry typeRegistry; + private ObjectFactory objectFactory; + + + + +} + + diff --git a/java/src/main/java/cucumber/runtime/java/StepDefAnnotation.java b/java/src/main/java/io/cucumber/java/StepDefAnnotation.java similarity index 89% rename from java/src/main/java/cucumber/runtime/java/StepDefAnnotation.java rename to java/src/main/java/io/cucumber/java/StepDefAnnotation.java index 9d16b0db08..c678bf299b 100644 --- a/java/src/main/java/cucumber/runtime/java/StepDefAnnotation.java +++ b/java/src/main/java/io/cucumber/java/StepDefAnnotation.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java b/java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java deleted file mode 100644 index 0a81ebbd42..0000000000 --- a/java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java +++ /dev/null @@ -1,6 +0,0 @@ -package cucumber.runtime.java.incorrectlysubclassedstepdefs; - -import cucumber.runtime.java.stepdefs.Stepdefs; - -public class SubclassesStepdefs extends Stepdefs { -} diff --git a/java/src/test/java/cucumber/runtime/java/Java8SnippetTest.java b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java similarity index 89% rename from java/src/test/java/cucumber/runtime/java/Java8SnippetTest.java rename to java/src/test/java/io/cucumber/java/Java8SnippetTest.java index 6ae8215d72..dbebc6d4ec 100644 --- a/java/src/test/java/cucumber/runtime/java/Java8SnippetTest.java +++ b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.runtime.snippets.SnippetGenerator; +import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; @@ -21,7 +21,7 @@ public void generatesPlainSnippet() { String expected = "" + "Given(\"I have {int} cukes in my {string} belly\", (Integer int1, String string) -> {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "});\n"; System.out.println(expected); assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); diff --git a/java/src/test/java/cucumber/runtime/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java similarity index 77% rename from java/src/test/java/cucumber/runtime/java/JavaBackendTest.java rename to java/src/test/java/io/cucumber/java/JavaBackendTest.java index b53fe6fd1e..be7ce641e5 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -1,15 +1,15 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.java.stepdefs.Stepdefs; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.java.stepdefs.Stepdefs; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Before; import org.junit.Test; @@ -45,7 +45,7 @@ public void finds_step_definitions_by_classpath_url() { @Test public void finds_step_definitions_by_package_name() { GlueStub glue = new GlueStub(); - backend.loadGlue(glue, asList("cucumber.runtime.java.stepdefs")); + backend.loadGlue(glue, asList("io.cucumber.java.stepdefs")); backend.buildWorld(); assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); } @@ -53,7 +53,7 @@ public void finds_step_definitions_by_package_name() { @Test(expected = CucumberException.class) public void detects_subclassed_glue_and_throws_exception() { GlueStub glue = new GlueStub(); - backend.loadGlue(glue, asList("cucumber.runtime.java.stepdefs", "cucumber.runtime.java.incorrectlysubclassedstepdefs")); + backend.loadGlue(glue, asList("io.cucumber.java.stepdefs", "io.cucumber.java.incorrectlysubclassedstepdefs")); } private class GlueStub implements Glue { @@ -83,8 +83,5 @@ public void addAfterHook(HookDefinition hookDefinition) { throw new UnsupportedOperationException(); } - @Override - public void removeScenarioScopedGlue() { - } } } diff --git a/java/src/test/java/cucumber/runtime/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java similarity index 93% rename from java/src/test/java/cucumber/runtime/java/JavaHookTest.java rename to java/src/test/java/io/cucumber/java/JavaHookTest.java index 604fef0dd2..9b1648308a 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -1,19 +1,19 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; import cucumber.api.java.BeforeStep; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -186,7 +186,7 @@ public void fails_if_hook_argument_is_not_scenario_result() throws Throwable { verify(glue).addAfterHook(javaHookDefinitionArgumentCaptor.capture()); HookDefinition bad = javaHookDefinitionArgumentCaptor.getValue(); - expectedException.expectMessage("When a hook declares an argument it must be of type cucumber.api.Scenario. public void cucumber.runtime.java.JavaHookTest$BadHook.after(java.lang.String)"); + expectedException.expectMessage("When a hook declares an argument it must be of type io.cucumber.core.api.Scenario. public void io.cucumber.java.JavaHookTest$BadHook.after(java.lang.String)"); bad.execute(mock(Scenario.class)); } diff --git a/java/src/test/java/cucumber/runtime/java/JavaObjectFactoryTest.java b/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java similarity index 96% rename from java/src/test/java/cucumber/runtime/java/JavaObjectFactoryTest.java rename to java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java index 3f9dbb83b1..e36f4b3e43 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaObjectFactoryTest.java +++ b/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/java/src/test/java/cucumber/runtime/java/JavaSnippetTest.java b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java similarity index 90% rename from java/src/test/java/cucumber/runtime/java/JavaSnippetTest.java rename to java/src/test/java/io/cucumber/java/JavaSnippetTest.java index e1cb252981..c61a2bb5f0 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaSnippetTest.java +++ b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java @@ -1,8 +1,7 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.runtime.snippets.FunctionNameGenerator; -import cucumber.runtime.snippets.SnippetGenerator; -import cucumber.runtime.snippets.UnderscoreConcatenator; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.Argument; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; @@ -28,7 +27,7 @@ public class JavaSnippetTest { private static final String GIVEN_KEYWORD = "Given"; - private final FunctionNameGenerator functionNameGenerator = new FunctionNameGenerator(new UnderscoreConcatenator()); + private final SnippetType.FunctionNameGenerator functionNameGenerator = SnippetType.UNDERSCORE.getFunctionNameGenerator(); @Test public void generatesPlainSnippet() { @@ -36,7 +35,7 @@ public void generatesPlainSnippet() { "@Given(\"I have {int} cukes in my {string} belly\")\n" + "public void i_have_cukes_in_my_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); } @@ -59,7 +58,7 @@ public Size transform(String... strings) { "@Given(\"I have {double} cukes in my {size} belly\")\n" + "public void i_have_cukes_in_my_belly(Double double1, Size size) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4.2 cukes in my large belly", customParameterType)); } @@ -82,9 +81,9 @@ public List transform(String... strings) { String expected = "" + "@Given(\"I have {sizes} bellies\")\n" + - "public void i_have_bellies(java.util.List sizes) {\n" + + "public void i_have_bellies(java.util.List sizes) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have large and small bellies", customParameterType)); } @@ -95,7 +94,7 @@ public void generatesCopyPasteReadyStepSnippetForNumberParameters() { "@Given(\"before {int} after\")\n" + "public void before_after(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("before 5 after")); } @@ -106,7 +105,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIllegalJavaIdentifierChars( "@Given(\"I have {int} cukes in: my {string} red-belly!\")\n" + "public void i_have_cukes_in_my_red_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in: my \"big\" red-belly!")); } @@ -117,7 +116,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIntegersInsideStringParamet "@Given(\"the DI system receives a message saying {string}\")\n" + "public void the_DI_system_receives_a_message_saying(String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("the DI system receives a message saying \"{ dataIngestion: { feeds: [ feed: { merchantId: 666, feedId: 1, feedFileLocation: feed.csv } ] }\"")); } @@ -128,7 +127,7 @@ public void generatesSnippetWithDollarSigns() { "@Given(\"I have ${int}\")\n" + "public void i_have_$(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have $5")); } @@ -139,7 +138,7 @@ public void generatesSnippetWithQuestionMarks() { "@Given(\"is there an error?:\")\n" + "public void is_there_an_error() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("is there an error?:")); } @@ -150,7 +149,7 @@ public void generatesSnippetWithLotsOfNonIdentifierCharacters() { "@Given(\"\\\\([a-z]*)?.+\")\n" + "public void a_z() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("([a-z]*)?.+")); } @@ -161,7 +160,7 @@ public void generatesSnippetWithParentheses() { "@Given(\"I have {int} cukes \\\\(maybe more)\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes (maybe more)")); } @@ -172,7 +171,7 @@ public void generatesSnippetWithBrackets() { "@Given(\"I have {int} cukes [maybe more]\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes [maybe more]")); } @@ -183,7 +182,7 @@ public void generatesSnippetWithDocString() { "@Given(\"I have:\")\n" + "public void i_have(String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have:", new PickleString(null, "hello"))); } @@ -207,13 +206,13 @@ public String transform(String... strings) { "@Given(\"I have a {docString}:\")\n" + "public void i_have_a(String docString, String docString1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have a {string}:\")\n" + "public void i_have_a(String string, String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have a \"Documentation String\":", new PickleString(null, "hello"), customParameterType)); } @@ -242,7 +241,7 @@ public void generatesSnippetWithDataTable() { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have:", dataTable)); @@ -274,7 +273,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have in table {string}:\")\n" + @@ -286,7 +285,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have in table \"M6\":", dataTable, customParameterType)); @@ -298,7 +297,7 @@ public void generateSnippetWithOutlineParam() { "@Given(\"Then it responds \")\n" + "public void then_it_responds_param() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("Then it responds ")); diff --git a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java similarity index 81% rename from java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTest.java rename to java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 44dbd5fcd2..267140a41f 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -1,23 +1,24 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestStepFinished; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestStepFinished; import cucumber.api.java.ObjectFactory; import cucumber.api.java.en.Given; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.Runner; -import cucumber.runner.TimeService; -import cucumber.runner.AmbiguousStepDefinitionsException; -import cucumber.runtime.Backend; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.DuplicateStepDefinitionException; -import cucumber.runtime.RuntimeOptions; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.Env; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.AmbiguousStepDefinitionsException; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; @@ -32,10 +33,11 @@ import java.util.Collections; import java.util.Locale; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -69,7 +71,7 @@ public void createBackendAndLoadNoGlue() { ObjectFactory factory = new SingletonFactory(defs); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); this.backend = new JavaBackend(factory, classFinder, typeRegistry); - RuntimeOptions runtimeOptions = new RuntimeOptions(""); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); BackendSupplier backendSupplier = new BackendSupplier() { @Override diff --git a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java similarity index 96% rename from java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTransposeTest.java rename to java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index 0fc7f2d404..7670397781 100755 --- a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,16 +1,16 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.api.Transpose; +import cucumber.api.java.Transpose; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleRow; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTable; import io.cucumber.datatable.DataTable; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; diff --git a/java/src/test/java/cucumber/runtime/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java similarity index 79% rename from java/src/test/java/cucumber/runtime/java/MethodScannerTest.java rename to java/src/test/java/io/cucumber/java/MethodScannerTest.java index ba5efe2208..f6d3f2a4c6 100644 --- a/java/src/test/java/cucumber/runtime/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,12 +1,12 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Glue; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; @@ -54,7 +54,7 @@ public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoS backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), Stepdefs2.class); fail(); } catch (CucumberException e) { - assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class cucumber.runtime.java.MethodScannerTest$Stepdefs2 extends class cucumber.runtime.java.MethodScannerTest$BaseStepDefs", e.getMessage()); + assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs", e.getMessage()); } } @@ -64,7 +64,7 @@ public void loadGlue_fails_when_class_is_not_subclass_of_declaring_class() throw backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), String.class); fail(); } catch (CucumberException e) { - assertEquals("class cucumber.runtime.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage()); + assertEquals("class io.cucumber.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage()); } } diff --git a/java/src/test/java/cucumber/runtime/java/SingletonFactory.java b/java/src/test/java/io/cucumber/java/SingletonFactory.java similarity index 95% rename from java/src/test/java/cucumber/runtime/java/SingletonFactory.java rename to java/src/test/java/io/cucumber/java/SingletonFactory.java index f07273fdf2..b66cf0265b 100644 --- a/java/src/test/java/cucumber/runtime/java/SingletonFactory.java +++ b/java/src/test/java/io/cucumber/java/SingletonFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; diff --git a/java/src/test/java/cucumber/runtime/java/StringJoiner.java b/java/src/test/java/io/cucumber/java/StringJoiner.java similarity index 94% rename from java/src/test/java/cucumber/runtime/java/StringJoiner.java rename to java/src/test/java/io/cucumber/java/StringJoiner.java index 4f20e32e00..6e7ad782b7 100644 --- a/java/src/test/java/cucumber/runtime/java/StringJoiner.java +++ b/java/src/test/java/io/cucumber/java/StringJoiner.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; public class StringJoiner { public static String join(String delimiter, Iterable strings){ diff --git a/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java b/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java new file mode 100644 index 0000000000..da629b3506 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java @@ -0,0 +1,6 @@ +package io.cucumber.java.incorrectlysubclassedstepdefs; + +import io.cucumber.java.stepdefs.Stepdefs; + +public class SubclassesStepdefs extends Stepdefs { +} diff --git a/java/src/test/java/cucumber/runtime/java/stepdefs/Stepdefs.java b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java similarity index 74% rename from java/src/test/java/cucumber/runtime/java/stepdefs/Stepdefs.java rename to java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java index bbd62867b5..668c964300 100644 --- a/java/src/test/java/cucumber/runtime/java/stepdefs/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.stepdefs; +package io.cucumber.java.stepdefs; import cucumber.api.java.en.Given; diff --git a/java/src/test/java/cucumber/runtime/java/test/Authors.java b/java/src/test/java/io/cucumber/java/test/Authors.java similarity index 97% rename from java/src/test/java/cucumber/runtime/java/test/Authors.java rename to java/src/test/java/io/cucumber/java/test/Authors.java index 5cb9d2e364..980e64cdde 100644 --- a/java/src/test/java/cucumber/runtime/java/test/Authors.java +++ b/java/src/test/java/io/cucumber/java/test/Authors.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; -import cucumber.api.Transpose; +import cucumber.api.java.Transpose; import cucumber.api.java.en.Given; import java.util.List; diff --git a/weld/src/test/java/cucumber/runtime/java/weld/RunCukesTest.java b/java/src/test/java/io/cucumber/java/test/RunCukesTest.java similarity index 55% rename from weld/src/test/java/cucumber/runtime/java/weld/RunCukesTest.java rename to java/src/test/java/io/cucumber/java/test/RunCukesTest.java index 8dd2b6095d..3888a44e6c 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/RunCukesTest.java +++ b/java/src/test/java/io/cucumber/java/test/RunCukesTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.weld; +package io.cucumber.java.test; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/java/src/test/java/cucumber/runtime/java/test/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java similarity index 91% rename from java/src/test/java/cucumber/runtime/java/test/ScenarioStepDefs.java rename to java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java index b4585e4321..540e057b8a 100644 --- a/java/src/test/java/cucumber/runtime/java/test/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.Before; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/java/src/test/java/cucumber/runtime/java/test/Stepdefs.java b/java/src/test/java/io/cucumber/java/test/Stepdefs.java similarity index 91% rename from java/src/test/java/cucumber/runtime/java/test/Stepdefs.java rename to java/src/test/java/io/cucumber/java/test/Stepdefs.java index a51e4e94ec..f6300dca6f 100644 --- a/java/src/test/java/cucumber/runtime/java/test/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/test/Stepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.java.en.Given; diff --git a/java/src/test/java/cucumber/runtime/java/test/SubstitutionStepdefs.java b/java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java similarity index 97% rename from java/src/test/java/cucumber/runtime/java/test/SubstitutionStepdefs.java rename to java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java index 60ff4934e5..dfa289a9e2 100644 --- a/java/src/test/java/cucumber/runtime/java/test/SubstitutionStepdefs.java +++ b/java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/java/src/test/java/cucumber/runtime/java/test/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java similarity index 78% rename from java/src/test/java/cucumber/runtime/java/test/TypeRegistryConfiguration.java rename to java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java index 783d5b88e8..35dc165fe3 100644 --- a/java/src/test/java/cucumber/runtime/java/test/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java @@ -1,12 +1,11 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; -import cucumber.runtime.java.test.Authors.Author; -import cucumber.runtime.java.test.Stepdefs.Person; +import io.cucumber.java.test.Authors.Author; import io.cucumber.datatable.TableTransformer; import java.util.Locale; @@ -16,10 +15,10 @@ public class TypeRegistryConfiguration implements TypeRegistryConfigurer { - private final TableEntryTransformer personEntryTransformer = new TableEntryTransformer() { + private final TableEntryTransformer personEntryTransformer = new TableEntryTransformer() { @Override - public Person transform(Map tableEntry) { - Person person = new Person(); + public Stepdefs.Person transform(Map tableEntry) { + Stepdefs.Person person = new Stepdefs.Person(); person.first = tableEntry.get("first"); person.last = tableEntry.get("last"); return person; @@ -58,7 +57,7 @@ public void configureTypeRegistry(TypeRegistry typeRegistry) { singleAuthorTransformer)); typeRegistry.defineDataTableType(new DataTableType( - Person.class, + Stepdefs.Person.class, personEntryTransformer)); } } diff --git a/weld/src/test/java/cucumber/runtime/java/weld/UnusedGlue.java b/java/src/test/java/io/cucumber/java/test/UnusedGlue.java similarity index 91% rename from weld/src/test/java/cucumber/runtime/java/weld/UnusedGlue.java rename to java/src/test/java/io/cucumber/java/test/UnusedGlue.java index 8ea276ac90..f1d55e3ec1 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/UnusedGlue.java +++ b/java/src/test/java/io/cucumber/java/test/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.java.test; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/java/src/test/resources/cucumber/runtime/java/test/authors.feature b/java/src/test/resources/io/cucumber/java/test/authors.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/authors.feature rename to java/src/test/resources/io/cucumber/java/test/authors.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/cukes.feature b/java/src/test/resources/io/cucumber/java/test/cukes.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/cukes.feature rename to java/src/test/resources/io/cucumber/java/test/cukes.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/french-iso-8859-1-cukes.feature b/java/src/test/resources/io/cucumber/java/test/french-iso-8859-1-cukes.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/french-iso-8859-1-cukes.feature rename to java/src/test/resources/io/cucumber/java/test/french-iso-8859-1-cukes.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/scenario.feature b/java/src/test/resources/io/cucumber/java/test/scenario.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/scenario.feature rename to java/src/test/resources/io/cucumber/java/test/scenario.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/scenario_outline_substitution.feature b/java/src/test/resources/io/cucumber/java/test/scenario_outline_substitution.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/scenario_outline_substitution.feature rename to java/src/test/resources/io/cucumber/java/test/scenario_outline_substitution.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/table_conversion.feature b/java/src/test/resources/io/cucumber/java/test/table_conversion.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/table_conversion.feature rename to java/src/test/resources/io/cucumber/java/test/table_conversion.feature diff --git a/java8/pom.xml b/java8/pom.xml index ce678477b4..78062ecb46 100644 --- a/java8/pom.xml +++ b/java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java8 diff --git a/java8/src/main/code_generator/I18n.java8.txt b/java8/src/main/code_generator/I18n.java8.txt index 974ca00998..fccf9eec79 100644 --- a/java8/src/main/code_generator/I18n.java8.txt +++ b/java8/src/main/code_generator/I18n.java8.txt @@ -11,9 +11,9 @@ import cucumber.api.java8.StepdefBody.A7; import cucumber.api.java8.StepdefBody.A8; import cucumber.api.java8.StepdefBody.A9; -import cucumber.runtime.java.LambdaGlueRegistry; -import cucumber.runtime.java8.Java8StepDefinition; -import cucumber.runtime.java8.LambdaGlueBase; +import io.cucumber.java.LambdaGlueRegistry; +import io.cucumber.java8.Java8StepDefinition; +import io.cucumber.java8.LambdaGlueBase; /** * To execute steps in a feature file the steps must be diff --git a/java8/src/main/java/cucumber/api/java8/HookBody.java b/java8/src/main/java/cucumber/api/java8/HookBody.java index a08688fc6d..235286c29d 100644 --- a/java8/src/main/java/cucumber/api/java8/HookBody.java +++ b/java8/src/main/java/cucumber/api/java8/HookBody.java @@ -1,6 +1,6 @@ package cucumber.api.java8; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; public interface HookBody { void accept(Scenario scenario) throws Throwable; diff --git a/java8/src/main/java/cucumber/runtime/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java similarity index 89% rename from java8/src/main/java/cucumber/runtime/java8/Java8HookDefinition.java rename to java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 04dab0e791..616b6316af 100644 --- a/java8/src/main/java/cucumber/runtime/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -1,14 +1,14 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import static java.util.Arrays.asList; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java8.HookBody; import cucumber.api.java8.HookNoArgsBody; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.filter.TagPredicate; -import cucumber.runtime.Timeout; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.filter.TagPredicate; import gherkin.pickles.PickleTag; +import io.cucumber.core.runtime.Invoker; import java.util.Collection; @@ -44,7 +44,7 @@ public String getLocation(boolean detail) { @Override public void execute(final Scenario scenario) throws Throwable { - Timeout.timeout(() -> { + Invoker.timeout(() -> { if (hookBody != null) { hookBody.accept(scenario); } else { diff --git a/java8/src/main/java/cucumber/runtime/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java similarity index 88% rename from java8/src/main/java/cucumber/runtime/java8/Java8StepDefinition.java rename to java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index f85ec7c156..de0e9ba60a 100644 --- a/java8/src/main/java/cucumber/runtime/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -1,21 +1,21 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; -import static cucumber.runtime.java8.ParameterInfo.fromTypes; +import static io.cucumber.java8.ParameterInfo.fromTypes; import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.StepdefBody; -import io.cucumber.stepexpression.ArgumentMatcher; -import cucumber.runtime.CucumberException; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; -import cucumber.runtime.Utils; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.TypeResolver; +import io.cucumber.core.stepexpression.TypeResolver; import java.lang.reflect.Method; import java.lang.reflect.Type; @@ -104,7 +104,7 @@ public Integer getParameterCount() { @Override public void execute(final Object[] args) throws Throwable { - Utils.invoke(body, method, timeoutMillis, args); + Invoker.invoke(body, method, timeoutMillis, args); } @Override diff --git a/java8/src/main/java/cucumber/runtime/java8/LambdaGlueBase.java b/java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java similarity index 99% rename from java8/src/main/java/cucumber/runtime/java8/LambdaGlueBase.java rename to java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java index b42ab674f0..c1110a0a6f 100644 --- a/java8/src/main/java/cucumber/runtime/java8/LambdaGlueBase.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import cucumber.api.java8.GlueBase; import cucumber.api.java8.HookBody; import cucumber.api.java8.HookNoArgsBody; -import cucumber.runtime.java.JavaBackend; +import io.cucumber.java.JavaBackend; public interface LambdaGlueBase extends GlueBase { diff --git a/java8/src/main/java/cucumber/runtime/java8/ParameterInfo.java b/java8/src/main/java/io/cucumber/java8/ParameterInfo.java similarity index 96% rename from java8/src/main/java/cucumber/runtime/java8/ParameterInfo.java rename to java8/src/main/java/io/cucumber/java8/ParameterInfo.java index cf25658446..36ed36b789 100644 --- a/java8/src/main/java/cucumber/runtime/java8/ParameterInfo.java +++ b/java8/src/main/java/io/cucumber/java8/ParameterInfo.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import java.lang.annotation.Annotation; import java.lang.reflect.Type; diff --git a/java8/src/test/java/cucumber/runtime/java8/Java8AnonInnerClassStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java similarity index 95% rename from java8/src/test/java/cucumber/runtime/java8/Java8AnonInnerClassStepDefinitionTest.java rename to java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java index 0a38d0c0fb..8a8e0c55f4 100644 --- a/java8/src/test/java/cucumber/runtime/java8/Java8AnonInnerClassStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import static org.junit.Assert.assertEquals; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.StepdefBody; import org.junit.Test; diff --git a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java similarity index 89% rename from java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java rename to java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index 63e79a1cb4..0189e77298 100644 --- a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.java.Function; -import cucumber.runtime.java.LambdaGlueRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.java.Function; +import io.cucumber.java.LambdaGlueRegistry; import org.hamcrest.CustomTypeSafeMatcher; import org.junit.Rule; import org.junit.Test; diff --git a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java similarity index 93% rename from java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionTest.java rename to java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java index 82c96d01cc..6243478ca3 100644 --- a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import static org.junit.Assert.assertEquals; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.StepdefBody; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import org.junit.Test; import java.util.List; diff --git a/java8/src/test/java/cucumber/runtime/java8/SomeLambdaStepDefs.java b/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java similarity index 87% rename from java8/src/test/java/cucumber/runtime/java8/SomeLambdaStepDefs.java rename to java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java index 4332765c17..7a182f5531 100644 --- a/java8/src/test/java/cucumber/runtime/java8/SomeLambdaStepDefs.java +++ b/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import cucumber.api.java8.En; diff --git a/java8/src/test/java/cucumber/runtime/java8/test/AnonInnerClassStepdefs.java b/java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java similarity index 78% rename from java8/src/test/java/cucumber/runtime/java8/test/AnonInnerClassStepdefs.java rename to java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java index d302f2c90d..ed0af031de 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/AnonInnerClassStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java @@ -1,14 +1,14 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; import static org.junit.Assert.assertEquals; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.GlueBase; import cucumber.api.java8.StepdefBody; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.java.Function; -import cucumber.runtime.java.JavaBackend; -import cucumber.runtime.java8.Java8StepDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.java.Function; +import io.cucumber.java.JavaBackend; +import io.cucumber.java8.Java8StepDefinition; public class AnonInnerClassStepdefs implements GlueBase { diff --git a/java8/src/test/java/cucumber/runtime/java8/test/LambdaStepdefs.java b/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java similarity index 98% rename from java8/src/test/java/cucumber/runtime/java8/test/LambdaStepdefs.java rename to java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java index e702d80b28..33f8864dae 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/LambdaStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java @@ -1,11 +1,11 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; import cucumber.api.java8.En; diff --git a/java/src/test/java/cucumber/runtime/java/test/RunCukesTest.java b/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java similarity index 55% rename from java/src/test/java/cucumber/runtime/java/test/RunCukesTest.java rename to java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java index 19b64b353d..96c3db3894 100644 --- a/java/src/test/java/cucumber/runtime/java/test/RunCukesTest.java +++ b/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.test; +package io.cucumber.java8.test; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/java8/src/test/java/cucumber/runtime/java8/test/TypeRegistryConfiguration.java b/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java similarity index 79% rename from java8/src/test/java/cucumber/runtime/java8/test/TypeRegistryConfiguration.java rename to java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java index 871f8669f3..16c6468b9f 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/TypeRegistryConfiguration.java +++ b/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; -import cucumber.runtime.java8.test.LambdaStepdefs.Person; +import io.cucumber.java8.test.LambdaStepdefs.Person; import java.util.Locale; import java.util.Map; diff --git a/java8/src/test/resources/cucumber/runtime/java8/test/anon-inner-class-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/test/anon-inner-class-step-definitions.feature similarity index 100% rename from java8/src/test/resources/cucumber/runtime/java8/test/anon-inner-class-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/test/anon-inner-class-step-definitions.feature diff --git a/java8/src/test/resources/cucumber/runtime/java8/test/lambda-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/test/lambda-step-definitions.feature similarity index 100% rename from java8/src/test/resources/cucumber/runtime/java8/test/lambda-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/test/lambda-step-definitions.feature diff --git a/junit/pom.xml b/junit/pom.xml index 5cac88f9c7..a7e09ee78b 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-junit diff --git a/junit/src/main/java/cucumber/runtime/junit/NotificationLevel.java b/junit/src/main/java/cucumber/runtime/junit/NotificationLevel.java deleted file mode 100644 index 0b527e80d2..0000000000 --- a/junit/src/main/java/cucumber/runtime/junit/NotificationLevel.java +++ /dev/null @@ -1,10 +0,0 @@ -package cucumber.runtime.junit; - -public enum NotificationLevel { - SCENARIO, - STEP; - - String lowerCaseName() { - return name().toLowerCase(); - } -} diff --git a/junit/src/main/java/cucumber/runtime/junit/SkippedThrowable.java b/junit/src/main/java/cucumber/runtime/junit/SkippedThrowable.java deleted file mode 100644 index 409de0e3e2..0000000000 --- a/junit/src/main/java/cucumber/runtime/junit/SkippedThrowable.java +++ /dev/null @@ -1,9 +0,0 @@ -package cucumber.runtime.junit; - -class SkippedThrowable extends Throwable { - private static final long serialVersionUID = 1L; - - public SkippedThrowable(NotificationLevel scenarioOrStep) { - super(String.format("This %s is skipped", scenarioOrStep.lowerCaseName()), null, false, false); - } -} diff --git a/junit/src/main/java/cucumber/runtime/junit/Assertions.java b/junit/src/main/java/io/cucumber/junit/api/Assertions.java similarity index 76% rename from junit/src/main/java/cucumber/runtime/junit/Assertions.java rename to junit/src/main/java/io/cucumber/junit/api/Assertions.java index e7cb7d5835..4c56c9dc41 100644 --- a/junit/src/main/java/cucumber/runtime/junit/Assertions.java +++ b/junit/src/main/java/io/cucumber/junit/api/Assertions.java @@ -1,18 +1,19 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; -public class Assertions { +class Assertions { private Assertions() { } - public static void assertNoCucumberAnnotatedMethods(Class clazz) { + static void assertNoCucumberAnnotatedMethods(Class clazz) { for (Method method : clazz.getDeclaredMethods()) { for (Annotation annotation : method.getAnnotations()) { - if (annotation.annotationType().getName().startsWith("cucumber")) { + if (annotation.annotationType().getName().startsWith("cucumber") //TODO: Remove once migrated + || annotation.annotationType().getName().startsWith("io.cucumber")) { throw new CucumberException( "\n\n" + "Classes annotated with @RunWith(Cucumber.class) must not define any\n" + diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java similarity index 71% rename from junit/src/main/java/cucumber/api/junit/Cucumber.java rename to junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 39b2eeab10..292b3e3c0d 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -1,31 +1,27 @@ -package cucumber.api.junit; +package io.cucumber.junit.api; -import cucumber.api.CucumberOptions; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.BackendModuleBackendSupplier; -import cucumber.runtime.BackendSupplier; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.FeaturePathFeatureSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.formatter.Plugins; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.model.FeatureLoader; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.RuntimeOptionsFactory; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.junit.Assertions; -import cucumber.runtime.junit.FeatureRunner; -import cucumber.runtime.junit.JUnitOptions; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.runtime.FeaturePathFeatureSupplier; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.options.RuntimeOptionsFactory; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.model.CucumberFeature; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -48,7 +44,7 @@ * @CucumberOptions(plugin = "pretty") * public class RunCukesTest { * } -Fail *
    + * Fail *
    *

    * Cucumber will look for a {@code .feature} file on the classpath, using the same resource * path as the annotated class ({@code .class} substituted by {@code .feature}). @@ -79,34 +75,29 @@ public Cucumber(Class clazz) throws InitializationError { super(clazz); ClassLoader classLoader = clazz.getClassLoader(); Assertions.assertNoCucumberAnnotatedMethods(clazz); + ResourceLoader resourceLoader = new MultiLoader(classLoader); - RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz); + RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz, resourceLoader); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - ResourceLoader resourceLoader = new MultiLoader(classLoader); + this.bus = new TimeServiceEventBus(TimeService.SYSTEM); + FeatureLoader featureLoader = new FeatureLoader(resourceLoader); - FeaturePathFeatureSupplier featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions); - // Parse the features early. Don't proceed when there are lexer errors - final List features = featureSupplier.get(); + FeaturePathFeatureSupplier featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); - this.bus = new TimeServiceEventBus(TimeService.SYSTEM); - Plugins plugins = new Plugins(classLoader, new PluginFactory(), bus, runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); - RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); - this.filters = new Filters(runtimeOptions, rerunFilters); + this.filters = new Filters(runtimeOptions); this.junitOptions = new JUnitOptions(runtimeOptions.isStrict(), runtimeOptions.getJunitOptions()); final StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); // Start the run before reading the features. // Allows the test source read events to be broadcast properly bus.send(new TestRunStarted(bus.getTime())); - for (CucumberFeature feature : features) { - feature.sendTestSourceRead(bus); - } + addChildren(featureSupplier.get()); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); - addChildren(features); } @Override diff --git a/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java similarity index 82% rename from junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java rename to junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java index 61b8686617..067444da7f 100644 --- a/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java @@ -1,13 +1,13 @@ -package cucumber.runtime.junit; - -import cucumber.runtime.CucumberException; -import cucumber.runtime.FeatureCompiler; -import cucumber.runtime.filter.Filters; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; -import cucumber.runtime.model.CucumberFeature; +package io.cucumber.junit.api; + import gherkin.ast.Feature; import gherkin.events.PickleEvent; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.filter.Filters; +import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; import org.junit.runners.ParentRunner; @@ -17,16 +17,17 @@ import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.junit.PickleRunners.withNoStepDescriptions; -import static cucumber.runtime.junit.PickleRunners.withStepDescriptions; +import static io.cucumber.junit.api.PickleRunners.withNoStepDescriptions; +import static io.cucumber.junit.api.PickleRunners.withStepDescriptions; + -public class FeatureRunner extends ParentRunner { - private final List children = new ArrayList(); +class FeatureRunner extends ParentRunner { + private final List children = new ArrayList<>(); private final CucumberFeature cucumberFeature; private Description description; - public FeatureRunner(CucumberFeature cucumberFeature, Filters filters, ThreadLocalRunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) throws InitializationError { + FeatureRunner(CucumberFeature cucumberFeature, Filters filters, ThreadLocalRunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) throws InitializationError { super(null); this.cucumberFeature = cucumberFeature; buildFeatureElementRunners(filters, runnerSupplier, jUnitOptions); diff --git a/junit/src/main/java/cucumber/runtime/junit/JUnitOptions.java b/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java similarity index 82% rename from junit/src/main/java/cucumber/runtime/junit/JUnitOptions.java rename to junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java index ff012cc6de..deac4e6a4e 100644 --- a/junit/src/main/java/cucumber/runtime/junit/JUnitOptions.java +++ b/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java @@ -1,15 +1,15 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.runtime.CucumberException; -import cucumber.util.FixJava; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.util.FixJava; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.List; -public class JUnitOptions { - private static final String OPTIONS_RESOURCE = "/cucumber/api/junit/OPTIONS.txt"; +class JUnitOptions { + private static final String OPTIONS_RESOURCE = "/io/cucumber/api/junit/OPTIONS.txt"; private static String optionsText; private final boolean strict; @@ -24,9 +24,9 @@ public class JUnitOptions { * @param strict * @param argv the arguments */ - public JUnitOptions(boolean strict, List argv) { + JUnitOptions(boolean strict, List argv) { this.strict = strict; - argv = new ArrayList(argv); // in case the one passed in is unmodifiable. + argv = new ArrayList<>(argv); // in case the one passed in is unmodifiable. parse(argv); } @@ -51,10 +51,10 @@ private void parse(List args) { boolean filenameCompatibleNames() { return filenameCompatibleNames; } - public boolean stepNotifications(){ + boolean stepNotifications(){ return stepNotifications; } - public boolean isStrict() { + boolean isStrict() { return strict; } diff --git a/junit/src/main/java/cucumber/runtime/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java similarity index 90% rename from junit/src/main/java/cucumber/runtime/junit/JUnitReporter.java rename to junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java index 56dd204fec..83011e794d 100644 --- a/junit/src/main/java/cucumber/runtime/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java @@ -1,14 +1,14 @@ -package cucumber.runtime.junit; - -import cucumber.api.Result; -import cucumber.api.PickleStepTestStep; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.runner.EventBus; -import cucumber.runtime.junit.PickleRunners.PickleRunner; +package io.cucumber.junit.api; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.core.event.EventBus; import org.junit.runner.Description; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; @@ -16,7 +16,10 @@ import java.util.ArrayList; -public class JUnitReporter { +import static io.cucumber.junit.api.SkippedThrowable.NotificationLevel.SCENARIO; +import static io.cucumber.junit.api.SkippedThrowable.NotificationLevel.STEP; + +class JUnitReporter { private final JUnitOptions junitOptions; private final EventBus bus; @@ -67,7 +70,7 @@ public void receive(TestCaseFinished event) { }; - public JUnitReporter(EventBus bus, JUnitOptions junitOption) { + JUnitReporter(EventBus bus, JUnitOptions junitOption) { this.junitOptions = junitOption; this.bus = bus; bus.registerHandlerFor(TestCaseStarted.class, testCaseStartedHandler); @@ -76,7 +79,7 @@ public JUnitReporter(EventBus bus, JUnitOptions junitOption) { bus.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); } - public void finishExecutionUnit() { + void finishExecutionUnit() { bus.removeHandlerFor(TestCaseStarted.class, testCaseStartedHandler); bus.removeHandlerFor(TestStepStarted.class, testStepStartedHandler); bus.removeHandlerFor(TestStepFinished.class, testStepFinishedHandler); @@ -114,7 +117,7 @@ void handleStepResult(PickleStepTestStep testStep, Result result) { break; case SKIPPED: if (error == null) { - error = new SkippedThrowable(NotificationLevel.STEP); + error = new SkippedThrowable(STEP); } else { stepErrors.add(error); } @@ -155,7 +158,7 @@ void handleTestCaseResult(Result result) { break; case SKIPPED: if (stepErrors.isEmpty()) { - stepErrors.add(new SkippedThrowable(NotificationLevel.SCENARIO)); + stepErrors.add(new SkippedThrowable(SCENARIO)); } for (Throwable error : stepErrors) { pickleRunnerNotifier.addFailedAssumption(error); diff --git a/junit/src/main/java/cucumber/runtime/junit/PickleRunners.java b/junit/src/main/java/io/cucumber/junit/api/PickleRunners.java similarity index 98% rename from junit/src/main/java/cucumber/runtime/junit/PickleRunners.java rename to junit/src/main/java/io/cucumber/junit/api/PickleRunners.java index 7efe1c241a..236290161d 100644 --- a/junit/src/main/java/cucumber/runtime/junit/PickleRunners.java +++ b/junit/src/main/java/io/cucumber/junit/api/PickleRunners.java @@ -1,7 +1,7 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.runner.Runner; -import cucumber.runner.RunnerSupplier; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runtime.RunnerSupplier; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; diff --git a/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java b/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java new file mode 100644 index 0000000000..c27577d81b --- /dev/null +++ b/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java @@ -0,0 +1,18 @@ +package io.cucumber.junit.api; + +class SkippedThrowable extends Throwable { + private static final long serialVersionUID = 1L; + + SkippedThrowable(NotificationLevel scenarioOrStep) { + super(String.format("This %s is skipped", scenarioOrStep.lowerCaseName()), null, false, false); + } + + enum NotificationLevel { + SCENARIO, + STEP; + + String lowerCaseName() { + return name().toLowerCase(); + } + } +} diff --git a/junit/src/main/java/cucumber/runtime/junit/UndefinedThrowable.java b/junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java similarity index 57% rename from junit/src/main/java/cucumber/runtime/junit/UndefinedThrowable.java rename to junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java index e6d687cf1e..97c8c34281 100644 --- a/junit/src/main/java/cucumber/runtime/junit/UndefinedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java @@ -1,14 +1,14 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -public class UndefinedThrowable extends Throwable { +class UndefinedThrowable extends Throwable { private static final long serialVersionUID = 1L; - public UndefinedThrowable() { + UndefinedThrowable() { super("This step is undefined", null, false, false); } - public UndefinedThrowable(String stepText) { + UndefinedThrowable(String stepText) { super(String.format("The step \"%s\" is undefined", stepText), null, false, false); } } diff --git a/junit/src/main/resources/cucumber/api/junit/OPTIONS.txt b/junit/src/main/resources/io/cucumber/api/junit/OPTIONS.txt similarity index 100% rename from junit/src/main/resources/cucumber/api/junit/OPTIONS.txt rename to junit/src/main/resources/io/cucumber/api/junit/OPTIONS.txt diff --git a/junit/src/test/java/cucumber/annotation/DummyWhen.java b/junit/src/test/java/cucumber/annotation/DummyWhen.java deleted file mode 100644 index e21b686750..0000000000 --- a/junit/src/test/java/cucumber/annotation/DummyWhen.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface DummyWhen { - -} diff --git a/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java b/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java new file mode 100644 index 0000000000..a9f32dd29b --- /dev/null +++ b/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java @@ -0,0 +1,32 @@ +package io.cucumber.junit.api; + +import io.cucumber.core.exception.CucumberException; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +public class AssertionsTest { + + + @Test(expected = CucumberException.class) + public void should_throw_cucumber_exception_when_annotated() { + Assertions.assertNoCucumberAnnotatedMethods(WithCucumberMethod.class); + } + + + @RunWith(Cucumber.class) + final static class WithCucumberMethod { + + @StubCucumberAnnotation + public void before() { + + } + + } + @Retention(RetentionPolicy.RUNTIME) + @interface StubCucumberAnnotation { + } + +} \ No newline at end of file diff --git a/junit/src/test/java/cucumber/runtime/junit/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/api/CucumberTest.java similarity index 90% rename from junit/src/test/java/cucumber/runtime/junit/CucumberTest.java rename to junit/src/test/java/io/cucumber/junit/api/CucumberTest.java index e2733cfe22..c5352f6ecd 100644 --- a/junit/src/test/java/cucumber/runtime/junit/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/CucumberTest.java @@ -1,9 +1,7 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.annotation.DummyWhen; -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; -import cucumber.runtime.CucumberException; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.exception.CucumberException; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -18,7 +16,10 @@ import org.mockito.Mockito; import java.io.File; -import java.io.IOException; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.List; import static java.util.Collections.emptyList; @@ -147,7 +148,7 @@ public void cucumber_can_run_pickles_in_parallel() throws Exception { public void cucumber_returns_description_tree_with_features_and_pickles() throws InitializationError { Description description = new Cucumber(RunCukesTestValidEmpty.class).getDescription(); - assertThat(description.getDisplayName(), is("cucumber.runtime.junit.CucumberTest$RunCukesTestValidEmpty")); + assertThat(description.getDisplayName(), is("io.cucumber.junit.api.CucumberTest$RunCukesTestValidEmpty")); Description feature = description.getChildren().get(0); assertThat(feature.getDisplayName(), is("Feature: Feature A")); Description pickle = feature.getChildren().get(0); @@ -186,7 +187,7 @@ public void no_stepdefs_in_cucumber_runner_invalid() { public class ImplicitFeatureAndGluePath { } - @CucumberOptions(features = {"classpath:cucumber/runtime/junit"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit/api"}) public class ExplicitFeaturePath { } @@ -194,14 +195,19 @@ public class ExplicitFeaturePath { public class ExplicitFeaturePathWithNoFeatures { } - @CucumberOptions(features = {"classpath:cucumber/runtime/error/lexer_error.feature"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit/error/lexer_error.feature"}) public class LexerErrorFeature { } - @CucumberOptions(features = {"classpath:cucumber/runtime/error/lexer_error.feature"}, plugin = {"json:lexor_error_feature.json"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit/error/lexer_error.feature"}, plugin = {"json:target/lexor_error_feature.json"}) public class FormatterWithLexerErrorFeature { } + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public static @interface DummyWhen { + + } } diff --git a/junit/src/test/java/cucumber/runtime/junit/DescriptionMatcher.java b/junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java similarity index 92% rename from junit/src/test/java/cucumber/runtime/junit/DescriptionMatcher.java rename to junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java index 1f9647c2e3..70c18cf4a7 100644 --- a/junit/src/test/java/cucumber/runtime/junit/DescriptionMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; import org.junit.runner.Description; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/cucumber/runtime/junit/FailureMatcher.java b/junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java similarity index 92% rename from junit/src/test/java/cucumber/runtime/junit/FailureMatcher.java rename to junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java index c3377221cf..8dc1876ac3 100644 --- a/junit/src/test/java/cucumber/runtime/junit/FailureMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; import org.junit.runner.notification.Failure; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/cucumber/runtime/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java similarity index 94% rename from junit/src/test/java/cucumber/runtime/junit/FeatureRunnerTest.java rename to junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java index b531914d13..249774d71d 100644 --- a/junit/src/test/java/cucumber/runtime/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java @@ -1,17 +1,19 @@ -package cucumber.runtime.junit; - -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.Backend; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.RuntimeOptions; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureLoader; +package io.cucumber.junit.api; + +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureLoader; import org.junit.Test; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; @@ -24,6 +26,7 @@ import java.util.Set; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.argThat; @@ -152,9 +155,7 @@ private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, Strin } private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { - final RuntimeOptions runtimeOptions = new RuntimeOptions(""); - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); final TimeService timeServiceStub = new TimeService() { @Override @@ -170,9 +171,13 @@ public Collection get() { }; EventBus bus = new TimeServiceEventBus(timeServiceStub); - FeatureLoader featureLoader = new FeatureLoader(resourceLoader); - RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); - Filters filters = new Filters(runtimeOptions, rerunFilters); + FeatureLoader featureLoader = new FeatureLoader(new ResourceLoader() { + @Override + public Iterable resources(String path, String suffix) { + return emptyList(); + } + }); + Filters filters = new Filters(runtimeOptions); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); return new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOption); } diff --git a/junit/src/test/java/cucumber/runtime/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java similarity index 97% rename from junit/src/test/java/cucumber/runtime/junit/JUnitReporterTest.java rename to junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java index 91fdbe2053..15d219ebbb 100644 --- a/junit/src/test/java/cucumber/runtime/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java @@ -1,12 +1,11 @@ -package cucumber.runtime.junit; - -import cucumber.api.PendingException; -import cucumber.api.Result; -import cucumber.api.PickleStepTestStep; -import cucumber.runner.EventBus; -import cucumber.runtime.junit.JUnitReporter.EachTestNotifier; -import cucumber.runtime.junit.JUnitReporter.NoTestNotifier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; +package io.cucumber.junit.api; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.event.EventBus; +import io.cucumber.junit.api.JUnitReporter.EachTestNotifier; +import io.cucumber.junit.api.JUnitReporter.NoTestNotifier; +import io.cucumber.junit.api.PickleRunners.PickleRunner; import gherkin.pickles.PickleStep; import org.junit.AssumptionViolatedException; import org.junit.Test; @@ -157,7 +156,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_pen createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -177,7 +176,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_pen createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -196,7 +195,7 @@ public void test_step_finished_adds_the_step_exeption_for_pending_steps() { createNonStrictReporter(); createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -283,7 +282,7 @@ public void test_step_finished_adds_the_step_exeption_for_failed_steps() { createNonStrictReporter(); createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.FAILED, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); diff --git a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java similarity index 87% rename from junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithNoStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java index 835a0e6b51..94d92eb3bb 100644 --- a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java @@ -1,17 +1,17 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; - -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; import gherkin.events.PickleEvent; +import io.cucumber.core.runtime.RunnerSupplier; +import io.cucumber.junit.api.PickleRunners.PickleRunner; import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + public class PickleRunnerWithNoStepDescriptionsTest { @Test @@ -23,7 +23,7 @@ public void shouldUseScenarioNameWithFeatureNameAsClassNameForDisplayName() thro PickleRunner runner = PickleRunners.withNoStepDescriptions( "feature name", - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJUnitOptions() ); @@ -40,7 +40,7 @@ public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOp PickleRunner runner = PickleRunners.withNoStepDescriptions( "feature name", - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJUnitOptions("--filename-compatible-names") ); diff --git a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java similarity index 91% rename from junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java index 04989133a3..b6c472d173 100644 --- a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java @@ -1,14 +1,14 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.mock; -import cucumber.runtime.FeatureCompiler; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; -import cucumber.runtime.junit.PickleRunners.WithStepDescriptions; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.runtime.RunnerSupplier; +import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.junit.api.PickleRunners.WithStepDescriptions; +import io.cucumber.core.model.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; @@ -44,7 +44,7 @@ public void shouldAssignUnequalDescriptionsToDifferentOccurrencesOfSameStepInASc }; WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -82,7 +82,7 @@ public void shouldAssignUnequalDescriptionsToDifferentStepsInAScenarioOutline() }; WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -110,7 +110,7 @@ public void shouldIncludeScenarioNameAsClassNameInStepDescriptions() throws Exce FeatureCompiler compiler = new FeatureCompiler(); List pickleEvents = compiler.compileFeature(features); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -133,7 +133,7 @@ public void shouldUseScenarioNameForDisplayName() throws Exception { " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJUnitOptions() ); @@ -149,7 +149,7 @@ public void shouldUseStepKeyworkAndNameForChildName() throws Exception { " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -165,7 +165,7 @@ public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOp " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJunitOptions("--filename-compatible-names") ); diff --git a/junit/src/test/java/cucumber/runtime/junit/RunCukesTest.java b/junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java similarity index 56% rename from junit/src/test/java/cucumber/runtime/junit/RunCukesTest.java rename to junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java index f1bf13352c..5aee36340d 100644 --- a/junit/src/test/java/cucumber/runtime/junit/RunCukesTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java @@ -1,6 +1,5 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/test/java/cucumber/runtime/junit/RunCukesTestNoStepNotifications.java b/junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java similarity index 60% rename from junit/src/test/java/cucumber/runtime/junit/RunCukesTestNoStepNotifications.java rename to junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java index eb0a4f77d4..ec8973b566 100644 --- a/junit/src/test/java/cucumber/runtime/junit/RunCukesTestNoStepNotifications.java +++ b/junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java @@ -1,7 +1,6 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.core.api.options.CucumberOptions; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/main/java/cucumber/runtime/junit/SanityChecker.java b/junit/src/test/java/io/cucumber/junit/api/SanityChecker.java similarity index 98% rename from junit/src/main/java/cucumber/runtime/junit/SanityChecker.java rename to junit/src/test/java/io/cucumber/junit/api/SanityChecker.java index 86cde39852..b9e05fc0a3 100644 --- a/junit/src/main/java/cucumber/runtime/junit/SanityChecker.java +++ b/junit/src/test/java/io/cucumber/junit/api/SanityChecker.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; import junit.framework.AssertionFailedError; import junit.framework.JUnit4TestAdapter; diff --git a/junit/src/test/java/cucumber/runtime/junit/SanityTest.java b/junit/src/test/java/io/cucumber/junit/api/SanityTest.java similarity index 93% rename from junit/src/test/java/cucumber/runtime/junit/SanityTest.java rename to junit/src/test/java/io/cucumber/junit/api/SanityTest.java index 0af9c28be6..dd1c3a24cf 100644 --- a/junit/src/test/java/cucumber/runtime/junit/SanityTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/SanityTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; import org.junit.Test; diff --git a/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java b/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java new file mode 100644 index 0000000000..fc4a2bf45e --- /dev/null +++ b/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java @@ -0,0 +1,14 @@ +package io.cucumber.junit.api; + +import io.cucumber.core.backend.Pending; + +@Pending +public final class TestPendingException extends RuntimeException { + public TestPendingException() { + this("TODO: implement me"); + } + + public TestPendingException(String message) { + super(message); + } +} diff --git a/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java b/junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java similarity index 93% rename from junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java rename to junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java index 214eb2c808..dd10168c4b 100644 --- a/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java +++ b/junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java @@ -1,6 +1,6 @@ -package cucumber.runtime.junit; +package io.cucumber.junit.api; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.CucumberFeature; import gherkin.AstBuilder; import gherkin.Parser; import gherkin.TokenMatcher; diff --git a/junit/src/test/java/cucumber/runtime/stub/StubBackend.java b/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java similarity index 84% rename from junit/src/test/java/cucumber/runtime/stub/StubBackend.java rename to junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java index 2f1b2cb691..2043a8ea5f 100644 --- a/junit/src/test/java/cucumber/runtime/stub/StubBackend.java +++ b/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java @@ -1,12 +1,12 @@ -package cucumber.runtime.stub; - -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.snippets.FunctionNameGenerator; +package io.cucumber.junit.api.stub; + +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.ResourceLoader; import gherkin.pickles.PickleStep; import java.util.Collections; @@ -84,7 +84,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("STUB SNIPPET"); } } diff --git a/junit/src/test/resources/cucumber/runtime/junit/fa.feature b/junit/src/test/resources/io/cucumber/junit/api/fa.feature similarity index 100% rename from junit/src/test/resources/cucumber/runtime/junit/fa.feature rename to junit/src/test/resources/io/cucumber/junit/api/fa.feature diff --git a/junit/src/test/resources/cucumber/runtime/junit/fb.feature b/junit/src/test/resources/io/cucumber/junit/api/fb.feature similarity index 100% rename from junit/src/test/resources/cucumber/runtime/junit/fb.feature rename to junit/src/test/resources/io/cucumber/junit/api/fb.feature diff --git a/junit/src/test/resources/cucumber/runtime/error/lexer_error.feature b/junit/src/test/resources/io/cucumber/junit/error/lexer_error.feature similarity index 100% rename from junit/src/test/resources/cucumber/runtime/error/lexer_error.feature rename to junit/src/test/resources/io/cucumber/junit/error/lexer_error.feature diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 401889555c..35e0785f89 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-kotlin-java8 @@ -12,7 +12,7 @@ Cucumber-JVM: Kotlin Java8 - 1.2.41 + 1.2.51 diff --git a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/LambdaStepdefs.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt similarity index 96% rename from kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/LambdaStepdefs.kt rename to kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt index 18688a8551..bd9d2bff5a 100644 --- a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/LambdaStepdefs.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt @@ -1,6 +1,6 @@ -package cucumber.runtime.kotlin.test; +package io.cucumber.runtime.kotlin.test; -import cucumber.api.Scenario +import io.cucumber.core.api.Scenario import io.cucumber.datatable.DataTable import cucumber.api.java8.En import org.junit.Assert.* diff --git a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/RunCukesTest.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt similarity index 51% rename from kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/RunCukesTest.kt rename to kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt index 77e63fff7f..07332164b6 100644 --- a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/RunCukesTest.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt @@ -1,6 +1,6 @@ -package cucumber.runtime.kotlin.test +package io.cucumber.runtime.kotlin.test -import cucumber.api.junit.Cucumber +import io.cucumber.junit.api.Cucumber import org.junit.runner.RunWith @RunWith(Cucumber::class) diff --git a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/TypeRegistryConfiguration.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt similarity index 85% rename from kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/TypeRegistryConfiguration.kt rename to kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt index f0957c7d44..e9d395e27d 100644 --- a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/TypeRegistryConfiguration.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt @@ -1,7 +1,7 @@ -package cucumber.runtime.kotlin.test +package io.cucumber.runtime.kotlin.test -import cucumber.api.TypeRegistryConfigurer -import cucumber.api.TypeRegistry +import io.cucumber.core.api.TypeRegistryConfigurer +import io.cucumber.core.api.TypeRegistry import io.cucumber.datatable.DataTableType import io.cucumber.datatable.TableEntryTransformer import java.util.Locale diff --git a/kotlin-java8/src/test/resources/cucumber/runtime/kotlin/test/kotlin.feature b/kotlin-java8/src/test/resources/io/cucumber/kotlin/kotlin.feature similarity index 100% rename from kotlin-java8/src/test/resources/cucumber/runtime/kotlin/test/kotlin.feature rename to kotlin-java8/src/test/resources/io/cucumber/kotlin/kotlin.feature diff --git a/needle/pom.xml b/needle/pom.xml index 15d2598257..2bfd609c77 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-needle diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstance.java b/needle/src/main/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstance.java similarity index 86% rename from needle/src/main/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstance.java rename to needle/src/main/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstance.java index 3ac2b0d39a..256e968af7 100755 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstance.java +++ b/needle/src/main/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstance.java @@ -1,8 +1,7 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; -import cucumber.api.needle.InjectionProviderInstancesSupplier; -import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.NeedleFactory; +import io.cucumber.needle.api.InjectionProviderInstancesSupplier; +import io.cucumber.needle.api.NeedleInjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import de.akquinet.jbosscc.needle.reflection.ReflectionUtil; import org.slf4j.Logger; @@ -16,7 +15,7 @@ /** * Collects {@link InjectionProvider} instances. */ -public enum CollectInjectionProvidersFromStepsInstance { +enum CollectInjectionProvidersFromStepsInstance { /** * stateless Singleton */ @@ -33,7 +32,7 @@ public enum CollectInjectionProvidersFromStepsInstance { * @param instance step definition instance * @return collected injection providers. */ - public final InjectionProvider[] apply(final T instance) { + final InjectionProvider[] apply(final T instance) { final Set> providers = new LinkedHashSet>(); for (final Field field : ReflectionUtil.getAllFieldsWithAnnotation(instance, NeedleInjectionProvider.class)) { field.setAccessible(true); diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructor.java b/needle/src/main/java/io/cucumber/needle/CreateInstanceByDefaultConstructor.java similarity index 80% rename from needle/src/main/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructor.java rename to needle/src/main/java/io/cucumber/needle/CreateInstanceByDefaultConstructor.java index b3d2e42078..380df19e4d 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructor.java +++ b/needle/src/main/java/io/cucumber/needle/CreateInstanceByDefaultConstructor.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -6,7 +6,7 @@ /** * Instantiates new java object by default constructor */ -public enum CreateInstanceByDefaultConstructor { +enum CreateInstanceByDefaultConstructor { /** * Singleton */ @@ -14,7 +14,7 @@ public enum CreateInstanceByDefaultConstructor { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public final T apply(final Class type) { + final T apply(final Class type) { try { final T newInstance = type.getConstructor().newInstance(); logger.debug("newInstance by DefaultConstructor: " + newInstance); diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/CucumberNeedleConfiguration.java b/needle/src/main/java/io/cucumber/needle/CucumberNeedleConfiguration.java similarity index 91% rename from needle/src/main/java/cucumber/runtime/java/needle/config/CucumberNeedleConfiguration.java rename to needle/src/main/java/io/cucumber/needle/CucumberNeedleConfiguration.java index cc15d9b948..2067d37e24 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/CucumberNeedleConfiguration.java +++ b/needle/src/main/java/io/cucumber/needle/CucumberNeedleConfiguration.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; -import cucumber.api.needle.InjectionProviderInstancesSupplier; +import io.cucumber.needle.api.InjectionProviderInstancesSupplier; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,11 +12,11 @@ /** * Reads cucumber-needle.properties to initialize additional {@link InjectionProvider}s. */ -public class CucumberNeedleConfiguration { +class CucumberNeedleConfiguration { /** * Default properties fiel name. */ - public static final String RESOURCE_CUCUMBER_NEEDLE = "cucumber-needle"; + static final String RESOURCE_CUCUMBER_NEEDLE = "cucumber-needle"; @SuppressWarnings("unused") private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -34,7 +34,7 @@ public CucumberNeedleConfiguration() { this(RESOURCE_CUCUMBER_NEEDLE); } - public CucumberNeedleConfiguration(final String resourceName) { + CucumberNeedleConfiguration(final String resourceName) { final ResourceBundle resourceBundle = loadResourceBundle.apply(resourceName); final Set classNames = readInjectionProviderClassNames.apply(resourceBundle); diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/LoadResourceBundle.java b/needle/src/main/java/io/cucumber/needle/LoadResourceBundle.java similarity index 94% rename from needle/src/main/java/cucumber/runtime/java/needle/config/LoadResourceBundle.java rename to needle/src/main/java/io/cucumber/needle/LoadResourceBundle.java index f79fc52b8f..63c1a62615 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/LoadResourceBundle.java +++ b/needle/src/main/java/io/cucumber/needle/LoadResourceBundle.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,7 +10,7 @@ /** * Null safe Resource Loader. If ResourceBundle does not exist, an empty Bundle is returned. */ -public enum LoadResourceBundle { +enum LoadResourceBundle { INSTANCE; public static final ResourceBundle EMPTY_RESOURCE_BUNDLE = new ResourceBundle() { diff --git a/needle/src/main/java/cucumber/runtime/java/needle/NeedleFactory.java b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java similarity index 89% rename from needle/src/main/java/cucumber/runtime/java/needle/NeedleFactory.java rename to needle/src/main/java/io/cucumber/needle/NeedleFactory.java index 78efaa861b..3d07ad86a4 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/NeedleFactory.java +++ b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java @@ -1,9 +1,6 @@ -package cucumber.runtime.java.needle; +package io.cucumber.needle; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.java.needle.config.CollectInjectionProvidersFromStepsInstance; -import cucumber.runtime.java.needle.config.CreateInstanceByDefaultConstructor; -import cucumber.runtime.java.needle.config.CucumberNeedleConfiguration; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.slf4j.Logger; @@ -12,7 +9,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE; import static java.lang.String.format; /** @@ -26,7 +22,7 @@ public class NeedleFactory extends NeedleTestcase implements ObjectFactory { private final CollectInjectionProvidersFromStepsInstance collectInjectionProvidersFromStepsInstance = CollectInjectionProvidersFromStepsInstance.INSTANCE; public NeedleFactory() { - super(setUpInjectionProviders(RESOURCE_CUCUMBER_NEEDLE)); + super(setUpInjectionProviders(CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE)); } @Override diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNames.java b/needle/src/main/java/io/cucumber/needle/ReadInjectionProviderClassNames.java similarity index 91% rename from needle/src/main/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNames.java rename to needle/src/main/java/io/cucumber/needle/ReadInjectionProviderClassNames.java index dbab929ca3..07b8137af3 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNames.java +++ b/needle/src/main/java/io/cucumber/needle/ReadInjectionProviderClassNames.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; import java.util.LinkedHashSet; import java.util.ResourceBundle; @@ -7,7 +7,7 @@ /** * Read ClassNames from properties. */ -public enum ReadInjectionProviderClassNames { +enum ReadInjectionProviderClassNames { /** * Singleton Instance */ diff --git a/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java b/needle/src/main/java/io/cucumber/needle/api/InjectionProviderInstancesSupplier.java similarity index 90% rename from needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java rename to needle/src/main/java/io/cucumber/needle/api/InjectionProviderInstancesSupplier.java index 271f1dd9d1..7905d4937f 100644 --- a/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java +++ b/needle/src/main/java/io/cucumber/needle/api/InjectionProviderInstancesSupplier.java @@ -1,6 +1,6 @@ -package cucumber.api.needle; +package io.cucumber.needle.api; -import cucumber.runtime.java.needle.NeedleFactory; +import io.cucumber.needle.NeedleFactory; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/needle/src/main/java/cucumber/api/needle/NeedleInjectionProvider.java b/needle/src/main/java/io/cucumber/needle/api/NeedleInjectionProvider.java similarity index 94% rename from needle/src/main/java/cucumber/api/needle/NeedleInjectionProvider.java rename to needle/src/main/java/io/cucumber/needle/api/NeedleInjectionProvider.java index 2a15534b97..a7de393931 100755 --- a/needle/src/main/java/cucumber/api/needle/NeedleInjectionProvider.java +++ b/needle/src/main/java/io/cucumber/needle/api/NeedleInjectionProvider.java @@ -1,4 +1,4 @@ -package cucumber.api.needle; +package io.cucumber.needle.api; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/needle/src/main/java/cucumber/api/needle/package.html b/needle/src/main/java/io/cucumber/needle/api/package.html similarity index 100% rename from needle/src/main/java/cucumber/api/needle/package.html rename to needle/src/main/java/io/cucumber/needle/api/package.html diff --git a/needle/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory b/needle/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory new file mode 100644 index 0000000000..fb070b0935 --- /dev/null +++ b/needle/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.needle.NeedleFactory diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java b/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java deleted file mode 100755 index feff9b2d35..0000000000 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runtime.java.needle.test.injectionprovider; - -public interface NameGetter { - - String getName(); - -} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java b/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java deleted file mode 100755 index 96a98496bb..0000000000 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runtime.java.needle.test.injectionprovider; - -public interface ValueGetter { - - String getValue(); - -} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java b/needle/src/test/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstanceTest.java similarity index 88% rename from needle/src/test/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java rename to needle/src/test/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstanceTest.java index 8ba0781364..c64980d9e9 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java +++ b/needle/src/test/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstanceTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -11,9 +11,8 @@ import org.junit.Test; -import cucumber.api.needle.InjectionProviderInstancesSupplier; -import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.injection.NamedInjectionProvider; +import io.cucumber.needle.api.InjectionProviderInstancesSupplier; +import io.cucumber.needle.api.NeedleInjectionProvider; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructorTest.java b/needle/src/test/java/io/cucumber/needle/CreateInstanceByDefaultConstructorTest.java similarity index 95% rename from needle/src/test/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructorTest.java rename to needle/src/test/java/io/cucumber/needle/CreateInstanceByDefaultConstructorTest.java index 0c86050b9f..e52402733e 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructorTest.java +++ b/needle/src/test/java/io/cucumber/needle/CreateInstanceByDefaultConstructorTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; import static org.junit.Assert.assertNotNull; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/CucumberNeedleConfigurationTest.java b/needle/src/test/java/io/cucumber/needle/CucumberNeedleConfigurationTest.java similarity index 56% rename from needle/src/test/java/cucumber/runtime/java/needle/config/CucumberNeedleConfigurationTest.java rename to needle/src/test/java/io/cucumber/needle/CucumberNeedleConfigurationTest.java index 758e42d0c3..b8ab72a943 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/CucumberNeedleConfigurationTest.java +++ b/needle/src/test/java/io/cucumber/needle/CucumberNeedleConfigurationTest.java @@ -1,7 +1,5 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.isInjectionProvider; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.isInjectionProviderInstanceSupplier; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -10,8 +8,8 @@ import org.junit.Test; -import cucumber.api.needle.InjectionProviderInstancesSupplier; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.api.InjectionProviderInstancesSupplier; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; public class CucumberNeedleConfigurationTest { @@ -29,9 +27,9 @@ public void shouldReturnEmptyInstances() { @Test public void shouldEvaluateIfTypeIsInjectionProviderOrSupplier() throws Exception { - assertTrue(isInjectionProvider(SimpleNameGetterProvider.class)); - assertFalse(isInjectionProviderInstanceSupplier(SimpleNameGetterProvider.class)); - assertFalse(isInjectionProvider(A.class)); - assertTrue(isInjectionProviderInstanceSupplier(A.class)); + assertTrue(CucumberNeedleConfiguration.isInjectionProvider(SimpleNameGetterProvider.class)); + assertFalse(CucumberNeedleConfiguration.isInjectionProviderInstanceSupplier(SimpleNameGetterProvider.class)); + assertFalse(CucumberNeedleConfiguration.isInjectionProvider(A.class)); + assertTrue(CucumberNeedleConfiguration.isInjectionProviderInstanceSupplier(A.class)); } } diff --git a/needle/src/test/java/cucumber/runtime/java/needle/injection/DefaultInstanceInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/DefaultInstanceInjectionProvider.java similarity index 97% rename from needle/src/test/java/cucumber/runtime/java/needle/injection/DefaultInstanceInjectionProvider.java rename to needle/src/test/java/io/cucumber/needle/DefaultInstanceInjectionProvider.java index 877dd77f76..c13d44474e 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/injection/DefaultInstanceInjectionProvider.java +++ b/needle/src/test/java/io/cucumber/needle/DefaultInstanceInjectionProvider.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.injection; +package io.cucumber.needle; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/LoadCucumberNeedleResourceBundleTest.java b/needle/src/test/java/io/cucumber/needle/LoadCucumberNeedleResourceBundleTest.java similarity index 84% rename from needle/src/test/java/cucumber/runtime/java/needle/config/LoadCucumberNeedleResourceBundleTest.java rename to needle/src/test/java/io/cucumber/needle/LoadCucumberNeedleResourceBundleTest.java index b8b15ccecb..261ec158b8 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/LoadCucumberNeedleResourceBundleTest.java +++ b/needle/src/test/java/io/cucumber/needle/LoadCucumberNeedleResourceBundleTest.java @@ -1,6 +1,5 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; -import static cucumber.runtime.java.needle.config.LoadResourceBundle.EMPTY_RESOURCE_BUNDLE; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -9,6 +8,8 @@ import java.util.ResourceBundle; +import io.cucumber.needle.LoadResourceBundle; +import org.hamcrest.CoreMatchers; import org.junit.Test; public class LoadCucumberNeedleResourceBundleTest { @@ -19,7 +20,7 @@ public class LoadCucumberNeedleResourceBundleTest { public void shouldReturnEmptyResourceBundleWhenResourceDoesNotExist() throws Exception { final ResourceBundle resourceBundle = function.apply("does-not-exist"); assertNotNull(resourceBundle); - assertThat(resourceBundle, is(EMPTY_RESOURCE_BUNDLE)); + assertThat(resourceBundle, CoreMatchers.is(LoadResourceBundle.EMPTY_RESOURCE_BUNDLE)); } @Test @@ -31,7 +32,7 @@ public void shouldReturnExistingResourceBundle() throws Exception { @Test public void shouldAlwaysReturnEmptyForEmptyResourceBundle() throws Exception { - final ResourceBundle resourceBundle = EMPTY_RESOURCE_BUNDLE; + final ResourceBundle resourceBundle = LoadResourceBundle.EMPTY_RESOURCE_BUNDLE; assertNotNull(resourceBundle.getObject("foo")); assertThat(resourceBundle.getString("foo"), is("")); diff --git a/needle/src/test/java/cucumber/runtime/java/needle/injection/NamedInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/NamedInjectionProvider.java similarity index 97% rename from needle/src/test/java/cucumber/runtime/java/needle/injection/NamedInjectionProvider.java rename to needle/src/test/java/io/cucumber/needle/NamedInjectionProvider.java index 1f588ba7b0..6217569e59 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/injection/NamedInjectionProvider.java +++ b/needle/src/test/java/io/cucumber/needle/NamedInjectionProvider.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.injection; +package io.cucumber.needle; import javax.inject.Named; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/NeedleFactoryTest.java b/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java similarity index 79% rename from needle/src/test/java/cucumber/runtime/java/needle/NeedleFactoryTest.java rename to needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java index 9a84c3266e..b709de9e20 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/NeedleFactoryTest.java +++ b/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle; +package io.cucumber.needle; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNotNull; @@ -6,8 +6,7 @@ import org.junit.Test; -import cucumber.runtime.java.needle.config.CucumberNeedleConfiguration; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; public class NeedleFactoryTest { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNamesTest.java b/needle/src/test/java/io/cucumber/needle/ReadInjectionProviderClassNamesTest.java similarity index 87% rename from needle/src/test/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNamesTest.java rename to needle/src/test/java/io/cucumber/needle/ReadInjectionProviderClassNamesTest.java index 3a6dddcb91..09541c2844 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNamesTest.java +++ b/needle/src/test/java/io/cucumber/needle/ReadInjectionProviderClassNamesTest.java @@ -1,6 +1,5 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.core.IsCollectionContaining.hasItems; import static org.junit.Assert.assertNotNull; @@ -9,9 +8,12 @@ import java.util.ResourceBundle; import java.util.Set; +import io.cucumber.needle.CucumberNeedleConfiguration; +import io.cucumber.needle.LoadResourceBundle; +import io.cucumber.needle.ReadInjectionProviderClassNames; import org.junit.Test; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; public class ReadInjectionProviderClassNamesTest { @@ -19,7 +21,7 @@ public class ReadInjectionProviderClassNamesTest { @Test public void shouldReturnProviderFromCucumberNeedleProperties() throws Exception { - final Set classNames = function.apply(loadBundle(RESOURCE_CUCUMBER_NEEDLE)); + final Set classNames = function.apply(loadBundle(CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE)); assertNotNull(classNames); assertThat(classNames.size(), is(1)); assertThat(classNames.iterator().next(), is(SimpleNameGetterProvider.class.getCanonicalName())); diff --git a/java8/src/test/java/cucumber/runtime/java8/test/RunCukesTest.java b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java old mode 100644 new mode 100755 similarity index 55% rename from java8/src/test/java/cucumber/runtime/java8/test/RunCukesTest.java rename to needle/src/test/java/io/cucumber/needle/RunCukesTest.java index 507c5f5e17..bcb819351b --- a/java8/src/test/java/cucumber/runtime/java8/test/RunCukesTest.java +++ b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java @@ -1,8 +1,9 @@ -package cucumber.runtime.java8.test; +package io.cucumber.needle; -import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; +import io.cucumber.junit.api.Cucumber; + @RunWith(Cucumber.class) public class RunCukesTest { } diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalGlue.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java similarity index 67% rename from needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalGlue.java rename to needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java index a3f0bf8d1f..4662d9456b 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalGlue.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test; +package io.cucumber.needle.test; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -6,8 +6,8 @@ import javax.inject.Inject; import cucumber.api.java.Before; -import cucumber.runtime.java.needle.test.injectionprovider.NameGetter; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.test.injectionprovider.NameGetter; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; public class AtmWithdrawalGlue { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalSteps.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java similarity index 84% rename from needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalSteps.java rename to needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java index 674cbc646d..b804a0e2ee 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test; +package io.cucumber.needle.test; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNotNull; @@ -10,13 +10,13 @@ import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; -import cucumber.api.needle.InjectionProviderInstancesSupplier; -import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.injection.DefaultInstanceInjectionProvider; -import cucumber.runtime.java.needle.test.atm.AtmService; -import cucumber.runtime.java.needle.test.atm.AtmServiceBean; -import cucumber.runtime.java.needle.test.atm.BicGetter; -import cucumber.runtime.java.needle.test.injectionprovider.ValueInjectionProvider; +import io.cucumber.needle.api.InjectionProviderInstancesSupplier; +import io.cucumber.needle.api.NeedleInjectionProvider; +import io.cucumber.needle.DefaultInstanceInjectionProvider; +import io.cucumber.needle.test.atm.AtmService; +import io.cucumber.needle.test.atm.AtmServiceBean; +import io.cucumber.needle.test.atm.BicGetter; +import io.cucumber.needle.test.injectionprovider.ValueInjectionProvider; import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.hamcrest.core.Is; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/MoreSteps.java b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java similarity index 84% rename from needle/src/test/java/cucumber/runtime/java/needle/test/MoreSteps.java rename to needle/src/test/java/io/cucumber/needle/test/MoreSteps.java index dbe9f27171..f9cf7f5176 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/MoreSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java @@ -1,11 +1,11 @@ -package cucumber.runtime.java.needle.test; +package io.cucumber.needle.test; import static org.junit.Assert.assertTrue; import cucumber.api.java.Before; import cucumber.api.java.en.Given; -import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.injection.DefaultInstanceInjectionProvider; +import io.cucumber.needle.api.NeedleInjectionProvider; +import io.cucumber.needle.DefaultInstanceInjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import javax.inject.Inject; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmService.java b/needle/src/test/java/io/cucumber/needle/test/atm/AtmService.java similarity index 75% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmService.java rename to needle/src/test/java/io/cucumber/needle/test/atm/AtmService.java index 1718e7dc3e..498855d5a1 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmService.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/AtmService.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; public interface AtmService { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBean.java b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBean.java similarity index 80% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBean.java rename to needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBean.java index 9116e6d868..bfa17178a4 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBean.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBean.java @@ -1,11 +1,10 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.inject.Inject; -import cucumber.runtime.java.needle.test.injectionprovider.ValueGetter; -import cucumber.runtime.java.needle.test.injectionprovider.ValueGetter; +import io.cucumber.needle.test.injectionprovider.ValueGetter; @Stateless public class AtmServiceBean implements AtmService { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBeanTest.java b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBeanTest.java similarity index 92% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBeanTest.java rename to needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBeanTest.java index d411a1d91f..54e77fc4a8 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBeanTest.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBeanTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/BicGetter.java b/needle/src/test/java/io/cucumber/needle/test/atm/BicGetter.java similarity index 53% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/BicGetter.java rename to needle/src/test/java/io/cucumber/needle/test/atm/BicGetter.java index cf8c1c6627..45880bc706 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/BicGetter.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/BicGetter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; public interface BicGetter { diff --git a/needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java new file mode 100755 index 0000000000..b0f6ccc93f --- /dev/null +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java @@ -0,0 +1,7 @@ +package io.cucumber.needle.test.injectionprovider; + +public interface NameGetter { + + String getName(); + +} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/SimpleNameGetterProvider.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/SimpleNameGetterProvider.java similarity index 93% rename from needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/SimpleNameGetterProvider.java rename to needle/src/test/java/io/cucumber/needle/test/injectionprovider/SimpleNameGetterProvider.java index 39c80974ef..87bae925a8 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/SimpleNameGetterProvider.java +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/SimpleNameGetterProvider.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.injectionprovider; +package io.cucumber.needle.test.injectionprovider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation; diff --git a/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java new file mode 100755 index 0000000000..f6229d426a --- /dev/null +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java @@ -0,0 +1,7 @@ +package io.cucumber.needle.test.injectionprovider; + +public interface ValueGetter { + + String getValue(); + +} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java similarity index 71% rename from needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueInjectionProvider.java rename to needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java index 83c2c12e53..ec5d13d6af 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueInjectionProvider.java +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.needle.test.injectionprovider; +package io.cucumber.needle.test.injectionprovider; -import cucumber.runtime.java.needle.injection.DefaultInstanceInjectionProvider; +import io.cucumber.needle.DefaultInstanceInjectionProvider; /** * Returns a value provider returning the value given in constructor. diff --git a/needle/src/test/resources/cucumber-needle.properties b/needle/src/test/resources/cucumber-needle.properties index a0066dea76..2ddd102324 100644 --- a/needle/src/test/resources/cucumber-needle.properties +++ b/needle/src/test/resources/cucumber-needle.properties @@ -1 +1 @@ -custom.injection.provider.classes = cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider +custom.injection.provider.classes = io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider diff --git a/needle/src/test/resources/cucumber/runtime/java/needle/atm.feature b/needle/src/test/resources/io/cucumber/needle/atm.feature similarity index 100% rename from needle/src/test/resources/cucumber/runtime/java/needle/atm.feature rename to needle/src/test/resources/io/cucumber/needle/atm.feature diff --git a/openejb/pom.xml b/openejb/pom.xml index 7653bc8b8a..e53f4da639 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -6,7 +6,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-openejb diff --git a/openejb/src/main/java/cucumber/api/openejb/README.java b/openejb/src/main/java/cucumber/api/openejb/README.java deleted file mode 100644 index c11069d2f3..0000000000 --- a/openejb/src/main/java/cucumber/api/openejb/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.api.openejb; - - -public class README { -} diff --git a/openejb/src/main/java/cucumber/runtime/java/openejb/OpenEJBObjectFactory.java b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java similarity index 95% rename from openejb/src/main/java/cucumber/runtime/java/openejb/OpenEJBObjectFactory.java rename to openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java index 6cefde1a7b..54192bcd53 100644 --- a/openejb/src/main/java/cucumber/runtime/java/openejb/OpenEJBObjectFactory.java +++ b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.openejb; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import cucumber.api.java.ObjectFactory; import org.apache.openejb.OpenEjbContainer; diff --git a/openejb/src/main/java/io/cucumber/openejb/README.java b/openejb/src/main/java/io/cucumber/openejb/README.java new file mode 100644 index 0000000000..fb47cd4438 --- /dev/null +++ b/openejb/src/main/java/io/cucumber/openejb/README.java @@ -0,0 +1,5 @@ +package io.cucumber.openejb; + + +public class README { +} diff --git a/openejb/src/main/java/cucumber/api/openejb/package.html b/openejb/src/main/java/io/cucumber/openejb/package.html similarity index 100% rename from openejb/src/main/java/cucumber/api/openejb/package.html rename to openejb/src/main/java/io/cucumber/openejb/package.html diff --git a/openejb/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory b/openejb/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory new file mode 100644 index 0000000000..f7f69708e0 --- /dev/null +++ b/openejb/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.openejb.OpenEJBObjectFactory diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/RunCukesTest.java b/openejb/src/test/java/cucumber/runtime/java/openejb/RunCukesTest.java deleted file mode 100644 index 27c91af1b8..0000000000 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/RunCukesTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package cucumber.runtime.java.openejb; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -public class RunCukesTest { -} diff --git a/weld/src/test/java/cucumber/runtime/java/weld/Belly.java b/openejb/src/test/java/io/cucumber/openejb/Belly.java similarity index 83% rename from weld/src/test/java/cucumber/runtime/java/weld/Belly.java rename to openejb/src/test/java/io/cucumber/openejb/Belly.java index 53926230b8..3e903f1290 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/Belly.java +++ b/openejb/src/test/java/io/cucumber/openejb/Belly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.openejb; public class Belly { private int cukes; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/BellyStepdefs.java b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java similarity index 92% rename from openejb/src/test/java/cucumber/runtime/java/openejb/BellyStepdefs.java rename to openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java index 5d28c77245..4e42281038 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/BellyStepdefs.java +++ b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.openejb; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/OpenEJBObjectFactoryTest.java b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java similarity index 94% rename from openejb/src/test/java/cucumber/runtime/java/openejb/OpenEJBObjectFactoryTest.java rename to openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java index 4809af1979..0840c05093 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/OpenEJBObjectFactoryTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.openejb; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java new file mode 100644 index 0000000000..e07b04d9da --- /dev/null +++ b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java @@ -0,0 +1,8 @@ +package io.cucumber.openejb; + +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +public class RunCukesTest { +} diff --git a/java/src/test/java/cucumber/runtime/java/test/UnusedGlue.java b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java similarity index 91% rename from java/src/test/java/cucumber/runtime/java/test/UnusedGlue.java rename to openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java index 90bb7ace4b..87f9e18d55 100644 --- a/java/src/test/java/cucumber/runtime/java/test/UnusedGlue.java +++ b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.openejb; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/openejb/src/test/resources/cucumber/runtime/java/openejb/cukes.feature b/openejb/src/test/resources/io/cucumber/openejb/cukes.feature similarity index 100% rename from openejb/src/test/resources/cucumber/runtime/java/openejb/cukes.feature rename to openejb/src/test/resources/io/cucumber/openejb/cukes.feature diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 4c77682bf6..8007af6de0 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-picocontainer @@ -53,12 +53,12 @@ - + - + diff --git a/picocontainer/src/main/java/cucumber/api/picocontainer/README.java b/picocontainer/src/main/java/cucumber/api/picocontainer/README.java deleted file mode 100644 index 934bbdb2d2..0000000000 --- a/picocontainer/src/main/java/cucumber/api/picocontainer/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.api.picocontainer; - - -public class README { -} diff --git a/picocontainer/src/main/java/cucumber/runtime/java/picocontainer/PicoFactory.java b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java similarity index 88% rename from picocontainer/src/main/java/cucumber/runtime/java/picocontainer/PicoFactory.java rename to picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java index aeb50dfc1d..a11d9612b0 100644 --- a/picocontainer/src/main/java/cucumber/runtime/java/picocontainer/PicoFactory.java +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java @@ -1,7 +1,7 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.Utils; +import io.cucumber.core.reflection.Reflections; import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoBuilder; @@ -30,7 +30,7 @@ public void stop() { } public boolean addClass(Class clazz) { - if (Utils.isInstantiable(clazz) && classes.add(clazz)) { + if (Reflections.isInstantiable(clazz) && classes.add(clazz)) { addConstructorDependencies(clazz); } return true; diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/README.java b/picocontainer/src/main/java/io/cucumber/picocontainer/README.java new file mode 100644 index 0000000000..80d6123537 --- /dev/null +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/README.java @@ -0,0 +1,5 @@ +package io.cucumber.picocontainer; + + +public class README { +} diff --git a/picocontainer/src/main/java/cucumber/api/picocontainer/package.html b/picocontainer/src/main/java/io/cucumber/picocontainer/package.html similarity index 100% rename from picocontainer/src/main/java/cucumber/api/picocontainer/package.html rename to picocontainer/src/main/java/io/cucumber/picocontainer/package.html diff --git a/picocontainer/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory b/picocontainer/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory new file mode 100644 index 0000000000..235a25f5d4 --- /dev/null +++ b/picocontainer/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.picocontainer.PicoFactory diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/RunCukesTest.java b/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/RunCukesTest.java deleted file mode 100644 index cf2aba1dd6..0000000000 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/RunCukesTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package cucumber.runtime.java.picocontainer; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - - -@RunWith(Cucumber.class) -public class RunCukesTest { -} diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/DisposableCucumberBelly.java b/picocontainer/src/test/java/io/cucumber/picocontainer/DisposableCucumberBelly.java similarity index 95% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/DisposableCucumberBelly.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/DisposableCucumberBelly.java index c6d8cc465b..09d09e7185 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/DisposableCucumberBelly.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/DisposableCucumberBelly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import org.picocontainer.Disposable; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/PicoFactoryTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java similarity index 96% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/PicoFactoryTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java index fbbb6322f2..8ce2ecb797 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/PicoFactoryTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/RunCukesTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java old mode 100755 new mode 100644 similarity index 55% rename from needle/src/test/java/cucumber/runtime/java/needle/RunCukesTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java index 2762e074b5..8a2ebd6f49 --- a/needle/src/test/java/cucumber/runtime/java/needle/RunCukesTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.needle; +package io.cucumber.picocontainer; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; -import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) public class RunCukesTest { diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java new file mode 100644 index 0000000000..31b61b0c8d --- /dev/null +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java @@ -0,0 +1,86 @@ +package io.cucumber.picocontainer; + +import junit.framework.AssertionFailedError; +import junit.framework.JUnit4TestAdapter; +import junit.framework.Test; +import junit.framework.TestListener; +import junit.framework.TestResult; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +/** + * Listener that makes sure Cucumber fires events in the right order + */ +public class SanityChecker implements TestListener { + private static final String INDENT = " "; + private static final String INSANITY = "INSANITY"; + + private List tests = new ArrayList(); + private final StringWriter out = new StringWriter(); + + public static void run(Class testClass) { + run(testClass, false); + } + + public static void run(Class testClass, boolean debug) { + JUnit4TestAdapter testAdapter = new JUnit4TestAdapter(testClass); + TestResult result = new TestResult(); + SanityChecker listener = new SanityChecker(); + result.addListener(listener); + testAdapter.run(result); + String output = listener.getOutput(); + if (output.contains(INSANITY)) { + throw new RuntimeException("Something went wrong\n" + output); + } + if (debug) { + System.out.println("===== " + testClass.getName()); + System.out.println(output); + System.out.println("====="); + } + } + + @Override + public void addError(Test test, Throwable t) { + } + + @Override + public void addFailure(Test test, AssertionFailedError t) { + } + + @Override + public void startTest(Test started) { + spaces(); + out.append("START ").append(started.toString()).append("\n"); + tests.add(started); + } + + @Override + public void endTest(Test ended) { + try { + Test lastStarted = tests.remove(tests.size() - 1); + spaces(); + out.append("END ").append(ended.toString()).append("\n"); + if (!lastStarted.toString().equals(ended.toString())) { + out.append(INSANITY).append("\n"); + String errorMessage = String.format("Started : %s\nEnded : %s\n", lastStarted, ended); + out.append(errorMessage).append("\n"); + } + } catch (Exception e) { + out.append(INSANITY).append("\n"); + e.printStackTrace(new PrintWriter(out)); + } + } + + private void spaces() { + for (int i = 0; i < tests.size(); i++) { + out.append(INDENT); + } + } + + private String getOutput() { + return out.toString(); + } +} diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SanityTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java similarity index 62% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SanityTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java index d6dc669aa3..540f8584f1 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SanityTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java @@ -1,7 +1,5 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; -import cucumber.runtime.junit.SanityChecker; -import org.junit.Ignore; import org.junit.Test; public class SanityTest { diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SomeTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SomeTest.java similarity index 79% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SomeTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/SomeTest.java index 6782ba74d2..cd7f61c563 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SomeTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SomeTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import org.junit.Test; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/StepDefs.java b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java similarity index 94% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/StepDefs.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java index 49302c392e..5873c3eea4 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/StepDefs.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java @@ -1,7 +1,7 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; -import cucumber.api.PendingException; -import cucumber.api.Scenario; +import cucumber.api.java.PendingException; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/UnusedGlue.java b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java similarity index 89% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/UnusedGlue.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java index 613fd27397..ebdd900f52 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/UnusedGlue.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/cukes.feature b/picocontainer/src/test/resources/io/cucumber/picocontainer/cukes.feature similarity index 100% rename from picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/cukes.feature rename to picocontainer/src/test/resources/io/cucumber/picocontainer/cukes.feature diff --git a/picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/issue-225.feature b/picocontainer/src/test/resources/io/cucumber/picocontainer/issue-225.feature similarity index 100% rename from picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/issue-225.feature rename to picocontainer/src/test/resources/io/cucumber/picocontainer/issue-225.feature diff --git a/pom.xml b/pom.xml index fe770218b9..c42377adda 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT pom Cucumber-JVM Cucumber for the JVM @@ -42,7 +42,7 @@ 5.1.0 2.4.15 2.15 - 4.3.10.RELEASE + 4.3.18.RELEASE 1.11.6.RELEASE 5.1.1.Final @@ -665,8 +665,8 @@ 3.6.2 UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 -Werror @@ -683,8 +683,7 @@ 3.0.0-M1 false - cucumber.runtime,cucumber.runtime.*,org.springframework - + io.cucumber.*,org.springframework http://docs.oracle.com/javase/7/docs/api/ http://junit.sourceforge.net/javadoc/ @@ -810,17 +809,13 @@ true - cucumber\.runner\..* - cucumber\.runtime\..* - cucumber\.util\..* + io\.cucumber..* true - cucumber\.runner\..* - cucumber\.runtime\..* - cucumber\.util\..* + io\.cucumber\..* org\.springframework\.core\..* diff --git a/spring/pom.xml b/spring/pom.xml index e63cc2ac41..af6677a5f3 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-spring diff --git a/spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java b/spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java new file mode 100644 index 0000000000..2573d246fe --- /dev/null +++ b/spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java @@ -0,0 +1,131 @@ +/* + * Copyright 2002-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.cucumber.spring; + +import java.util.Set; + +import org.springframework.beans.BeanUtils; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.test.context.BootstrapContext; +import org.springframework.test.context.BootstrapWith; +import org.springframework.test.context.CacheAwareContextLoaderDelegate; +import org.springframework.test.context.TestContextBootstrapper; +import org.springframework.test.context.cache.ContextCache; +import org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate; +import org.springframework.test.context.cache.DefaultContextCache; +import org.springframework.test.context.support.DefaultBootstrapContext; +import org.springframework.util.ClassUtils; + +/** + * {@code BootstrapUtils} is a collection of utility methods to assist with + * bootstrapping the Spring TestContext Framework. + * + * @author Sam Brannen + * @author Phillip Webb + * @since 4.1 + * @see BootstrapWith + * @see BootstrapContext + * @see TestContextBootstrapper + */ +abstract class FixBootstrapUtils { + + private static ThreadLocal contextCache = new ThreadLocal(){ + @Override + protected ContextCache initialValue() { + return new DefaultContextCache(); + } + }; + + private static final String DEFAULT_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME = + "org.springframework.test.context.support.DefaultTestContextBootstrapper"; + + private static final String DEFAULT_WEB_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME = + "org.springframework.test.context.web.WebTestContextBootstrapper"; + + private static final String WEB_APP_CONFIGURATION_ANNOTATION_CLASS_NAME = + "org.springframework.test.context.web.WebAppConfiguration"; + + static BootstrapContext createBootstrapContext(Class testClass) { + CacheAwareContextLoaderDelegate contextLoader = new DefaultCacheAwareContextLoaderDelegate(contextCache.get()); + return new DefaultBootstrapContext(testClass, contextLoader); + } + + /** + * Resolve the {@link TestContextBootstrapper} type for the test class in the + * supplied {@link BootstrapContext}, instantiate it, and provide it a reference + * to the {@link BootstrapContext}. + *

    If the {@link BootstrapWith @BootstrapWith} annotation is present on + * the test class, either directly or as a meta-annotation, then its + * {@link BootstrapWith#value value} will be used as the bootstrapper type. + * Otherwise, either the + * {@link org.springframework.test.context.support.DefaultTestContextBootstrapper + * DefaultTestContextBootstrapper} or the + * {@link org.springframework.test.context.web.WebTestContextBootstrapper + * WebTestContextBootstrapper} will be used, depending on the presence of + * {@link org.springframework.test.context.web.WebAppConfiguration @WebAppConfiguration}. + * @param bootstrapContext the bootstrap context to use + * @return a fully configured {@code TestContextBootstrapper} + */ + static TestContextBootstrapper resolveTestContextBootstrapper(BootstrapContext bootstrapContext) { + Class testClass = bootstrapContext.getTestClass(); + + Class clazz = null; + try { + clazz = resolveExplicitTestContextBootstrapper(testClass); + if (clazz == null) { + clazz = resolveDefaultTestContextBootstrapper(testClass); + } + TestContextBootstrapper testContextBootstrapper = + BeanUtils.instantiateClass(clazz, TestContextBootstrapper.class); + testContextBootstrapper.setBootstrapContext(bootstrapContext); + return testContextBootstrapper; + } + catch (IllegalStateException ex) { + throw ex; + } + catch (Throwable ex) { + throw new IllegalStateException("Could not load TestContextBootstrapper [" + clazz + + "]. Specify @BootstrapWith's 'value' attribute or make the default bootstrapper class available.", + ex); + } + } + + private static Class resolveExplicitTestContextBootstrapper(Class testClass) { + Set annotations = AnnotatedElementUtils.findAllMergedAnnotations(testClass, BootstrapWith.class); + if (annotations.size() < 1) { + return null; + } + if (annotations.size() > 1) { + throw new IllegalStateException(String.format( + "Configuration error: found multiple declarations of @BootstrapWith for test class [%s]: %s", + testClass.getName(), annotations)); + } + return annotations.iterator().next().value(); + } + + private static Class resolveDefaultTestContextBootstrapper(Class testClass) throws Exception { + ClassLoader classLoader = FixBootstrapUtils.class.getClassLoader(); + AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(testClass, + WEB_APP_CONFIGURATION_ANNOTATION_CLASS_NAME, false, false); + if (attributes != null) { + return ClassUtils.forName(DEFAULT_WEB_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME, classLoader); + } + return ClassUtils.forName(DEFAULT_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME, classLoader); + } + +} diff --git a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeContext.java b/spring/src/main/java/io/cucumber/spring/GlueCodeContext.java similarity index 97% rename from spring/src/main/java/cucumber/runtime/java/spring/GlueCodeContext.java rename to spring/src/main/java/io/cucumber/spring/GlueCodeContext.java index e400e0ed58..30765dfdca 100644 --- a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeContext.java +++ b/spring/src/main/java/io/cucumber/spring/GlueCodeContext.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; import java.util.HashMap; import java.util.Map; diff --git a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeScope.java b/spring/src/main/java/io/cucumber/spring/GlueCodeScope.java similarity index 96% rename from spring/src/main/java/cucumber/runtime/java/spring/GlueCodeScope.java rename to spring/src/main/java/io/cucumber/spring/GlueCodeScope.java index 61d2bcc4ae..2c0822bb6c 100644 --- a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeScope.java +++ b/spring/src/main/java/io/cucumber/spring/GlueCodeScope.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.Scope; diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/io/cucumber/spring/SpringFactory.java similarity index 85% rename from spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java rename to spring/src/main/java/io/cucumber/spring/SpringFactory.java index 067654fe30..ef4d50bd6d 100644 --- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java +++ b/spring/src/main/java/io/cucumber/spring/SpringFactory.java @@ -1,11 +1,7 @@ -package cucumber.runtime.java.spring; - -import static java.util.Arrays.asList; -import static org.springframework.test.context.FixBootstrapUtils.createBootstrapContext; -import static org.springframework.test.context.FixBootstrapUtils.resolveTestContextBootstrapper; +package io.cucumber.spring; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -27,6 +23,10 @@ import java.util.Set; import java.util.Stack; +import static io.cucumber.spring.FixBootstrapUtils.createBootstrapContext; +import static io.cucumber.spring.FixBootstrapUtils.resolveTestContextBootstrapper; +import static java.util.Arrays.asList; + /** * Spring based implementation of ObjectFactory. *

    @@ -182,9 +182,9 @@ private boolean isNewContextCreated() { private void registerStepClassBeanDefinition(ConfigurableListableBeanFactory beanFactory, Class stepClass) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; BeanDefinition beanDefinition = BeanDefinitionBuilder - .genericBeanDefinition(stepClass) - .setScope(GlueCodeScope.NAME) - .getBeanDefinition(); + .genericBeanDefinition(stepClass) + .setScope(GlueCodeScope.NAME) + .getBeanDefinition(); registry.registerBeanDefinition(stepClass.getName(), beanDefinition); } @@ -215,7 +215,7 @@ public T getInstance(final Class type) { private static boolean dependsOnSpringContext(Class type) { for (Annotation annotation : type.getAnnotations()) { - if(annotatedWithSupportedSpringRootTestAnnotations(annotation)){ + if (annotatedWithSupportedSpringRootTestAnnotations(annotation)) { return true; } } @@ -228,29 +228,30 @@ private static boolean annotatedWithSupportedSpringRootTestAnnotations(Annotatio ContextHierarchy.class, BootstrapWith.class)); } -} -class CucumberTestContextManager extends TestContextManager { - CucumberTestContextManager(Class testClass) { - // Does the same as TestContextManager(Class) but creates a - // DefaultCacheAwareContextLoaderDelegate that uses a thread local contextCache. - super(resolveTestContextBootstrapper(createBootstrapContext(testClass))); - registerGlueCodeScope(getContext()); - } + static class CucumberTestContextManager extends TestContextManager { - ConfigurableListableBeanFactory getBeanFactory() { - return getContext().getBeanFactory(); - } + CucumberTestContextManager(Class testClass) { + // Does the same as TestContextManager(Class) but creates a + // DefaultCacheAwareContextLoaderDelegate that uses a thread local contextCache. + super(resolveTestContextBootstrapper(createBootstrapContext(testClass))); + registerGlueCodeScope(getContext()); + } - private ConfigurableApplicationContext getContext() { - return (ConfigurableApplicationContext)getTestContext().getApplicationContext(); - } + ConfigurableListableBeanFactory getBeanFactory() { + return getContext().getBeanFactory(); + } - private void registerGlueCodeScope(ConfigurableApplicationContext context) { - do { - context.getBeanFactory().registerScope(GlueCodeScope.NAME, new GlueCodeScope()); - context = (ConfigurableApplicationContext)context.getParent(); - } while (context != null); + private ConfigurableApplicationContext getContext() { + return (ConfigurableApplicationContext) getTestContext().getApplicationContext(); + } + + private void registerGlueCodeScope(ConfigurableApplicationContext context) { + do { + context.getBeanFactory().registerScope(GlueCodeScope.NAME, new GlueCodeScope()); + context = (ConfigurableApplicationContext) context.getParent(); + } while (context != null); + } } } diff --git a/spring/src/main/java/cucumber/api/spring/SpringTransactionHooks.java b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java similarity index 99% rename from spring/src/main/java/cucumber/api/spring/SpringTransactionHooks.java rename to spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java index 8c258867b7..aab9c0acdc 100644 --- a/spring/src/main/java/cucumber/api/spring/SpringTransactionHooks.java +++ b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java @@ -1,4 +1,4 @@ -package cucumber.api.spring; +package io.cucumber.spring.api; import cucumber.api.java.After; import cucumber.api.java.Before; diff --git a/spring/src/main/java/cucumber/api/spring/package.html b/spring/src/main/java/io/cucumber/spring/api/package.html similarity index 100% rename from spring/src/main/java/cucumber/api/spring/package.html rename to spring/src/main/java/io/cucumber/spring/api/package.html diff --git a/spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java b/spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java deleted file mode 100644 index c8e6f29807..0000000000 --- a/spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.springframework.test.context; - -import org.springframework.test.context.cache.ContextCache; -import org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate; -import org.springframework.test.context.cache.DefaultContextCache; -import org.springframework.test.context.support.DefaultBootstrapContext; - -public class FixBootstrapUtils extends BootstrapUtils { - - private static ThreadLocal contextCache = new ThreadLocal(){ - @Override - protected ContextCache initialValue() { - return new DefaultContextCache(); - } - }; - - public static BootstrapContext createBootstrapContext(Class testClass) { - CacheAwareContextLoaderDelegate contextLoader = new DefaultCacheAwareContextLoaderDelegate(contextCache.get()); - return new DefaultBootstrapContext(testClass, contextLoader); - } - - public static TestContextBootstrapper resolveTestContextBootstrapper(BootstrapContext bootstrapContext) { - return BootstrapUtils.resolveTestContextBootstrapper(bootstrapContext); - } -} diff --git a/spring/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory b/spring/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory new file mode 100644 index 0000000000..b7b15815b0 --- /dev/null +++ b/spring/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.spring.SpringFactory diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java deleted file mode 100644 index e6a965b853..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java +++ /dev/null @@ -1,20 +0,0 @@ -package cucumber.runtime.java.spring.commonglue; - -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; - -public class UnusedGlue { - public UnusedGlue() { - throw new IllegalStateException(); - } - - @Given("unused") - public void unused() { - throw new IllegalStateException(); - } - - @Before("@unused") - public void unusedHook() { - throw new IllegalStateException(); - } -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java deleted file mode 100644 index 2ca572b61c..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package cucumber.runtime.java.spring.contextconfig; - -import cucumber.api.CucumberOptions; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.runtime.java.spring.contextconfig", - "cucumber.runtime.java.spring.commonglue", - "cucumber.api.spring"}, - features = {"classpath:cucumber/runtime/java/spring/cukes.feature", - "classpath:cucumber/runtime/java/spring/xmlBasedSpring.feature", - "classpath:cucumber/runtime/java/spring/stepdefInjection.feature", - "classpath:cucumber/runtime/java/spring/transaction.feature"}) -public class RunCukesTest { -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java deleted file mode 100644 index 11b1548ab9..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.runtime.java.spring.dirtiescontextconfig; - -import cucumber.api.CucumberOptions; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.runtime.java.spring.dirtiescontextconfig"}, - features = {"classpath:cucumber/runtime/java/spring/dirtyCukes.feature"}) -public class RunCukesTest { -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/RunCukesTest.java deleted file mode 100644 index 15508ac52f..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/RunCukesTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package cucumber.runtime.java.spring.metaconfig.dirties; - -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.runtime.java.spring.metaconfig.dirties"}, - features = {"classpath:cucumber/runtime/java/spring/dirtyCukesWithMetaConfiguration.feature"}) -public class RunCukesTest { -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java deleted file mode 100644 index 8a79f5ff47..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.runtime.java.spring.webappconfig; - -import cucumber.api.CucumberOptions; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.runtime.java.spring.webappconfig"}, - features = {"classpath:cucumber/runtime/java/spring/springWebContextInjection.feature"}) -public class RunCukesTest { -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java similarity index 84% rename from spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java rename to spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java index f7ac3342b0..2e5ccc5174 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java +++ b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java @@ -1,20 +1,20 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.java.spring.beans.BellyBean; -import cucumber.runtime.java.spring.commonglue.AutowiresPlatformTransactionManager; -import cucumber.runtime.java.spring.commonglue.AutowiresThirdStepDef; -import cucumber.runtime.java.spring.commonglue.OneStepDef; -import cucumber.runtime.java.spring.commonglue.ThirdStepDef; -import cucumber.runtime.java.spring.componentannotation.WithComponentAnnotation; -import cucumber.runtime.java.spring.componentannotation.WithControllerAnnotation; -import cucumber.runtime.java.spring.metaconfig.general.BellyMetaStepdefs; -import cucumber.runtime.java.spring.contextconfig.BellyStepdefs; -import cucumber.runtime.java.spring.contextconfig.WithSpringAnnotations; -import cucumber.runtime.java.spring.contexthierarchyconfig.WithContextHierarchyAnnotation; -import cucumber.runtime.java.spring.dirtiescontextconfig.DirtiesContextBellyStepDefs; -import cucumber.runtime.java.spring.metaconfig.dirties.DirtiesContextBellyMetaStepDefs; +import io.cucumber.spring.beans.BellyBean; +import io.cucumber.spring.commonglue.AutowiresPlatformTransactionManager; +import io.cucumber.spring.commonglue.AutowiresThirdStepDef; +import io.cucumber.spring.commonglue.OneStepDef; +import io.cucumber.spring.commonglue.ThirdStepDef; +import io.cucumber.spring.componentannotation.WithComponentAnnotation; +import io.cucumber.spring.componentannotation.WithControllerAnnotation; +import io.cucumber.spring.metaconfig.general.BellyMetaStepdefs; +import io.cucumber.spring.contextconfig.BellyStepdefs; +import io.cucumber.spring.contextconfig.WithSpringAnnotations; +import io.cucumber.spring.contexthierarchyconfig.WithContextHierarchyAnnotation; +import io.cucumber.spring.dirtiescontextconfig.DirtiesContextBellyStepDefs; +import io.cucumber.spring.metaconfig.dirties.DirtiesContextBellyMetaStepDefs; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -243,7 +243,9 @@ public void shouldUseCucumberXmlIfNoClassWithSpringAnnotationIsFound() { @Test public void shouldFailIfMultipleClassesWithSpringAnnotationsAreFound() { expectedException.expect(CucumberException.class); - expectedException.expectMessage("Glue class class cucumber.runtime.java.spring.contextconfig.BellyStepdefs and class cucumber.runtime.java.spring.contextconfig.WithSpringAnnotations both attempt to configure the spring context"); + + + expectedException.expectMessage("Glue class class io.cucumber.spring.contextconfig.BellyStepdefs and class io.cucumber.spring.contextconfig.WithSpringAnnotations both attempt to configure the spring context"); final ObjectFactory factory = new SpringFactory(); factory.addClass(WithSpringAnnotations.class); factory.addClass(BellyStepdefs.class); @@ -252,7 +254,7 @@ public void shouldFailIfMultipleClassesWithSpringAnnotationsAreFound() { @Test public void shouldFailIfClassWithSpringComponentAnnotationsIsFound() { expectedException.expect(CucumberException.class); - expectedException.expectMessage("Glue class cucumber.runtime.java.spring.componentannotation.WithComponentAnnotation was annotated with @Component"); + expectedException.expectMessage("Glue class io.cucumber.spring.componentannotation.WithComponentAnnotation was annotated with @Component"); expectedException.expectMessage("Please remove the @Component annotation"); final ObjectFactory factory = new SpringFactory(); factory.addClass(WithComponentAnnotation.class); @@ -261,7 +263,7 @@ public void shouldFailIfClassWithSpringComponentAnnotationsIsFound() { @Test public void shouldFailIfClassWithAnnotationAnnotatedWithSpringComponentAnnotationsIsFound() { expectedException.expect(CucumberException.class); - expectedException.expectMessage("Glue class cucumber.runtime.java.spring.componentannotation.WithControllerAnnotation was annotated with @Controller"); + expectedException.expectMessage("Glue class io.cucumber.spring.componentannotation.WithControllerAnnotation was annotated with @Controller"); expectedException.expectMessage("Please remove the @Controller annotation"); final ObjectFactory factory = new SpringFactory(); factory.addClass(WithControllerAnnotation.class); diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java b/spring/src/test/java/io/cucumber/spring/beans/Belly.java similarity index 84% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java rename to spring/src/test/java/io/cucumber/spring/beans/Belly.java index 8126b1ef80..697a881f73 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java +++ b/spring/src/test/java/io/cucumber/spring/beans/Belly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.stereotype.Component; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java b/spring/src/test/java/io/cucumber/spring/beans/BellyBean.java similarity index 80% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java rename to spring/src/test/java/io/cucumber/spring/beans/BellyBean.java index 93c59c7abe..fafa3b5d84 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java +++ b/spring/src/test/java/io/cucumber/spring/beans/BellyBean.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; public class BellyBean { diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java b/spring/src/test/java/io/cucumber/spring/beans/DummyComponent.java similarity index 68% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java rename to spring/src/test/java/io/cucumber/spring/beans/DummyComponent.java index 50fe8cda6e..4cfc741fd6 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java +++ b/spring/src/test/java/io/cucumber/spring/beans/DummyComponent.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.stereotype.Component; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java b/spring/src/test/java/io/cucumber/spring/beans/PlatformTransactionManagerImpl.java similarity index 95% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java rename to spring/src/test/java/io/cucumber/spring/beans/PlatformTransactionManagerImpl.java index 9961056a18..2ca3c71f62 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java +++ b/spring/src/test/java/io/cucumber/spring/beans/PlatformTransactionManagerImpl.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.PlatformTransactionManager; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java b/spring/src/test/java/io/cucumber/spring/beans/TestController.java similarity index 91% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java rename to spring/src/test/java/io/cucumber/spring/beans/TestController.java index 118d30408a..d59fdf8474 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java +++ b/spring/src/test/java/io/cucumber/spring/beans/TestController.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java similarity index 90% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java index 473086a530..c4c8e11464 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import cucumber.api.java.en.Then; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresPlatformTransactionManager.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java rename to spring/src/test/java/io/cucumber/spring/commonglue/AutowiresPlatformTransactionManager.java index 8b15b85e87..9cebda154e 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresPlatformTransactionManager.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.PlatformTransactionManager; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresThirdStepDef.java similarity index 83% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/AutowiresThirdStepDef.java index 5ed22fda3d..fcac7188ef 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresThirdStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java similarity index 93% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java index 0dcb460b2d..9615dbc58a 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java similarity index 87% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java index d0cfdce7ff..da60dd40a5 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import cucumber.api.java.en.Then; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java similarity index 96% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java rename to spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java index 849f3bce7c..4e1d25c44e 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import cucumber.api.java.After; import cucumber.api.java.Before; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnusedGlue.java b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java similarity index 88% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/UnusedGlue.java rename to spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java index 2847c71ec5..464fab2877 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnusedGlue.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.spring.commonglue; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithComponentAnnotation.java b/spring/src/test/java/io/cucumber/spring/componentannotation/WithComponentAnnotation.java similarity index 62% rename from spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithComponentAnnotation.java rename to spring/src/test/java/io/cucumber/spring/componentannotation/WithComponentAnnotation.java index b312d3836a..c0c4b4925b 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithComponentAnnotation.java +++ b/spring/src/test/java/io/cucumber/spring/componentannotation/WithComponentAnnotation.java @@ -1,10 +1,8 @@ -package cucumber.runtime.java.spring.componentannotation; +package io.cucumber.spring.componentannotation; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.ContextHierarchy; @Component public class WithComponentAnnotation { diff --git a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithControllerAnnotation.java b/spring/src/test/java/io/cucumber/spring/componentannotation/WithControllerAnnotation.java similarity index 70% rename from spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithControllerAnnotation.java rename to spring/src/test/java/io/cucumber/spring/componentannotation/WithControllerAnnotation.java index 3cf24e485c..ba17c6765e 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithControllerAnnotation.java +++ b/spring/src/test/java/io/cucumber/spring/componentannotation/WithControllerAnnotation.java @@ -1,9 +1,8 @@ -package cucumber.runtime.java.spring.componentannotation; +package io.cucumber.spring.componentannotation; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.stereotype.Repository; @Controller public class WithControllerAnnotation { diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java similarity index 81% rename from spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java rename to spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java index 52e1a2e1ab..232bce423d 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.spring.contextconfig; +package io.cucumber.spring.contextconfig; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java new file mode 100644 index 0000000000..6a07ccc28c --- /dev/null +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java @@ -0,0 +1,17 @@ +package io.cucumber.spring.contextconfig; + +import io.cucumber.core.api.options.CucumberOptions; + +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(glue = {"cucumber.runtime.java.spring.contextconfig", + "cucumber.runtime.java.spring.commonglue", + "cucumber.api.spring"}, + features = {"classpath:io/cucumber/spring/cukes.feature", + "classpath:io/cucumber/spring/xmlBasedSpring.feature", + "classpath:io/cucumber/spring/stepdefInjection.feature", + "classpath:io/cucumber/spring/transaction.feature"}) +public class RunCukesTest { +} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java b/spring/src/test/java/io/cucumber/spring/contextconfig/WithSpringAnnotations.java similarity index 85% rename from spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java rename to spring/src/test/java/io/cucumber/spring/contextconfig/WithSpringAnnotations.java index a43c91a677..427f578234 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/WithSpringAnnotations.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.spring.contextconfig; +package io.cucumber.spring.contextconfig; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java b/spring/src/test/java/io/cucumber/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java similarity index 83% rename from spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java rename to spring/src/test/java/io/cucumber/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java index 26367de653..8a0b3023ae 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java +++ b/spring/src/test/java/io/cucumber/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.spring.contexthierarchyconfig; +package io.cucumber.spring.contexthierarchyconfig; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextHierarchy; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java rename to spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java index 72b56c1505..bd492d0fed 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java.spring.dirtiescontextconfig; +package io.cucumber.spring.dirtiescontextconfig; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java new file mode 100644 index 0000000000..df6966521a --- /dev/null +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java @@ -0,0 +1,12 @@ +package io.cucumber.spring.dirtiescontextconfig; + +import io.cucumber.core.api.options.CucumberOptions; + +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(glue = {"io.cucumber.spring.dirtiescontextconfig"}, + features = {"classpath:io/cucumber/spring/dirtyCukes.feature"}) +public class RunCukesTest { +} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/hooks/SpringTransactionHooksTest.java b/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java similarity index 89% rename from spring/src/test/java/cucumber/runtime/java/spring/hooks/SpringTransactionHooksTest.java rename to spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java index b16a98d29b..108ccbe4ea 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/hooks/SpringTransactionHooksTest.java +++ b/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java @@ -1,11 +1,12 @@ -package cucumber.runtime.java.spring.hooks; +package io.cucumber.spring.hooks; -import cucumber.api.spring.SpringTransactionHooks; +import io.cucumber.spring.api.SpringTransactionHooks; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.springframework.beans.factory.BeanFactory; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; @@ -15,10 +16,13 @@ import static org.mockito.Mockito.isA; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.quality.Strictness.STRICT_STUBS; -@RunWith(MockitoJUnitRunner.class) public class SpringTransactionHooksTest { + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(STRICT_STUBS); + private SpringTransactionHooks target; @Mock diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java similarity index 87% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java index eb2e416f18..22ad364a39 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java.spring.metaconfig.dirties; +package io.cucumber.spring.metaconfig.dirties; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesMetaConfiguration.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesMetaConfiguration.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesMetaConfiguration.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesMetaConfiguration.java index 1b313c1425..952595be9d 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesMetaConfiguration.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesMetaConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.metaconfig.dirties; +package io.cucumber.spring.metaconfig.dirties; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java new file mode 100644 index 0000000000..2794cb9a66 --- /dev/null +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java @@ -0,0 +1,11 @@ +package io.cucumber.spring.metaconfig.dirties; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(glue = {"cucumber.runtime.java.spring.metaconfig.dirties"}, + features = {"classpath:io/cucumber/spring/dirtyCukesWithMetaConfiguration.feature"}) +public class RunCukesTest { +} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/BellyMetaStepdefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java similarity index 79% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/BellyMetaStepdefs.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java index 74b7916e0c..a613865994 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/BellyMetaStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.spring.metaconfig.general; +package io.cucumber.spring.metaconfig.general; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertNotNull; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/MetaConfiguration.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/MetaConfiguration.java similarity index 86% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/MetaConfiguration.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/general/MetaConfiguration.java index f7e82f8c72..c66d492f50 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/MetaConfiguration.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/MetaConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.metaconfig.general; +package io.cucumber.spring.metaconfig.general; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java similarity index 52% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/RunCukesTest.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java index ddb3306432..3cabe6c830 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java @@ -1,13 +1,13 @@ -package cucumber.runtime.java.spring.metaconfig.general; +package io.cucumber.spring.metaconfig.general; -import cucumber.api.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions(glue = {"cucumber.runtime.java.spring.metaconfig.general", "cucumber.runtime.java.spring.commonglue", "cucumber.api.spring"}, - features = {"classpath:cucumber/runtime/java/spring/springBeanInjectionWithMetaConfiguration.feature"}) + features = {"classpath:io/cucumber/spring/springBeanInjectionWithMetaConfiguration.feature"}) public class RunCukesTest { } diff --git a/spring/src/test/java/cucumber/runtime/java/spring/threading/RunParallelCukesTest.java b/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java similarity index 82% rename from spring/src/test/java/cucumber/runtime/java/spring/threading/RunParallelCukesTest.java rename to spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java index a11673b61b..dd85677097 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/threading/RunParallelCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java.spring.threading; +package io.cucumber.spring.threading; import static java.util.concurrent.Executors.newFixedThreadPool; import static org.junit.Assert.assertEquals; -import cucumber.api.cli.Main; +import io.cucumber.core.api.cli.Main; import org.junit.Test; import java.util.concurrent.Callable; @@ -19,8 +19,8 @@ public class RunParallelCukesTest { public Byte call() throws Exception { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); String[] args = { - "--glue", "cucumber.runtime.java.spring.threading", - "classpath:cucumber/runtime/java/spring/threadingCukes.feature", + "--glue", "io.cucumber.spring.threading", + "classpath:io/cucumber/spring/threadingCukes.feature", "--strict" }; return Main.run(args, classLoader); diff --git a/spring/src/test/java/cucumber/runtime/java/spring/threading/ThreadingStepDefs.java b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java similarity index 97% rename from spring/src/test/java/cucumber/runtime/java/spring/threading/ThreadingStepDefs.java rename to spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java index ad38f9dd90..0680343519 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/threading/ThreadingStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.threading; +package io.cucumber.spring.threading; import static java.lang.Thread.currentThread; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java new file mode 100644 index 0000000000..98761610ad --- /dev/null +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java @@ -0,0 +1,12 @@ +package io.cucumber.spring.webappconfig; + +import io.cucumber.core.api.options.CucumberOptions; + +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(glue = {"cucumber.runtime.java.spring.webappconfig"}, + features = {"classpath:io/cucumber/spring/springWebContextInjection.feature"}) +public class RunCukesTest { +} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java similarity index 96% rename from spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java rename to spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java index 7a7b41ce5a..85d99ee084 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.webappconfig; +package io.cucumber.spring.webappconfig; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/spring/src/test/resources/applicationContext.xml b/spring/src/test/resources/applicationContext.xml index 48cde6cacb..4d40134113 100644 --- a/spring/src/test/resources/applicationContext.xml +++ b/spring/src/test/resources/applicationContext.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - + - + @@ -15,6 +15,6 @@ - + diff --git a/spring/src/test/resources/cucumber.xml b/spring/src/test/resources/cucumber.xml index bcdffd9788..80f004fbc6 100644 --- a/spring/src/test/resources/cucumber.xml +++ b/spring/src/test/resources/cucumber.xml @@ -4,7 +4,7 @@ xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - + diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukes.feature b/spring/src/test/resources/io/cucumber/spring/dirtyCukes.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukes.feature rename to spring/src/test/resources/io/cucumber/spring/dirtyCukes.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukesWithMetaConfiguration.feature b/spring/src/test/resources/io/cucumber/spring/dirtyCukesWithMetaConfiguration.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukesWithMetaConfiguration.feature rename to spring/src/test/resources/io/cucumber/spring/dirtyCukesWithMetaConfiguration.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjection.feature b/spring/src/test/resources/io/cucumber/spring/springBeanInjection.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjection.feature rename to spring/src/test/resources/io/cucumber/spring/springBeanInjection.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjectionWithMetaConfiguration.feature b/spring/src/test/resources/io/cucumber/spring/springBeanInjectionWithMetaConfiguration.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjectionWithMetaConfiguration.feature rename to spring/src/test/resources/io/cucumber/spring/springBeanInjectionWithMetaConfiguration.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/springWebContextInjection.feature b/spring/src/test/resources/io/cucumber/spring/springWebContextInjection.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/springWebContextInjection.feature rename to spring/src/test/resources/io/cucumber/spring/springWebContextInjection.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature b/spring/src/test/resources/io/cucumber/spring/stepdefInjection.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature rename to spring/src/test/resources/io/cucumber/spring/stepdefInjection.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/threadingCukes.feature b/spring/src/test/resources/io/cucumber/spring/threadingCukes.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/threadingCukes.feature rename to spring/src/test/resources/io/cucumber/spring/threadingCukes.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature b/spring/src/test/resources/io/cucumber/spring/transaction.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature rename to spring/src/test/resources/io/cucumber/spring/transaction.feature diff --git a/testng/README.md b/testng/README.md index d9b7d90819..498b7b556e 100644 --- a/testng/README.md +++ b/testng/README.md @@ -21,10 +21,10 @@ Add the `cucumber-testng` dependency to your pom. Create an empty class that extends the `AbstractTestNGCucumberTests`. ```java -package cucumber.runtime.testng; +package io.cucumber.runtime.testng; import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; +import io.cucumber.testng.api.AbstractTestNGCucumberTests; @CucumberOptions(plugin = "json:target/cucumber-report.json") public class RunCukesTest extends AbstractTestNGCucumberTests { diff --git a/testng/pom.xml b/testng/pom.xml index dce89a22fb..69addfb302 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-testng diff --git a/testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java b/testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java similarity index 97% rename from testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java rename to testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java index d261761410..8161135d36 100644 --- a/testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java +++ b/testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; diff --git a/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java b/testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java similarity index 85% rename from testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java rename to testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java index ff50fdb7e7..d77fff8db1 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java @@ -1,6 +1,6 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import gherkin.events.PickleEvent; /** diff --git a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapper.java b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java similarity index 55% rename from testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapper.java rename to testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java index cc1034af78..aa72c46a44 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java @@ -1,10 +1,10 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; /** * The only purpose of this interface is to be able to provide a custom *

    toString()
    , making TestNG reports look more descriptive. * - * @see AbstractTestNGCucumberTests#runScenario(cucumber.api.testng.PickleEventWrapper, cucumber.api.testng.CucumberFeatureWrapper) + * @see AbstractTestNGCucumberTests#runScenario(PickleEventWrapper, CucumberFeatureWrapper) */ public interface CucumberFeatureWrapper { diff --git a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java similarity index 83% rename from testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java rename to testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java index 52389757c5..53dc4b2330 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java @@ -1,6 +1,6 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.CucumberFeature; class CucumberFeatureWrapperImpl implements CucumberFeatureWrapper { private final CucumberFeature cucumberFeature; diff --git a/testng/src/main/java/cucumber/api/testng/PickleEventWrapper.java b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java similarity index 62% rename from testng/src/main/java/cucumber/api/testng/PickleEventWrapper.java rename to testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java index d0706db6a9..265a6dbb61 100644 --- a/testng/src/main/java/cucumber/api/testng/PickleEventWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import gherkin.events.PickleEvent; @@ -6,7 +6,7 @@ * The only purpose of this interface is to be able to provide a custom *
    toString()
    , making TestNG reports look more descriptive. * - * @see AbstractTestNGCucumberTests#runScenario(cucumber.api.testng.PickleEventWrapper, cucumber.api.testng.CucumberFeatureWrapper) + * @see AbstractTestNGCucumberTests#runScenario(PickleEventWrapper, CucumberFeatureWrapper) */ public interface PickleEventWrapper { diff --git a/testng/src/main/java/cucumber/api/testng/PickleEventWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java similarity index 93% rename from testng/src/main/java/cucumber/api/testng/PickleEventWrapperImpl.java rename to testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java index 4a3d0af63f..ccdebd4f7a 100644 --- a/testng/src/main/java/cucumber/api/testng/PickleEventWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import gherkin.events.PickleEvent; diff --git a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java b/testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java similarity index 89% rename from testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java rename to testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java index 8e92460856..1d1d869c83 100644 --- a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java @@ -1,10 +1,10 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestCaseFinished; -import cucumber.runner.EventBus; -import cucumber.runtime.CucumberException; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.exception.CucumberException; import org.testng.SkipException; class TestCaseResultListener { diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java similarity index 65% rename from testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java rename to testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index 3309314dea..2413b0cb49 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -1,29 +1,28 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; -import cucumber.runner.Runner; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.BackendModuleBackendSupplier; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.FeatureCompiler; -import cucumber.runtime.FeaturePathFeatureSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.formatter.Plugins; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.model.FeatureLoader; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.RuntimeOptionsFactory; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.options.RuntimeOptionsFactory; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.model.CucumberFeature; import gherkin.events.PickleEvent; +import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import java.util.ArrayList; import java.util.List; @@ -41,24 +40,23 @@ public class TestNGCucumberRunner { /** * Bootstrap the cucumber runtime * - * @param clazz Which has the cucumber.api.CucumberOptions and org.testng.annotations.Test annotations + * @param clazz Which has the io.cucumber.core.api.options.CucumberOptions and org.testng.annotations.Test annotations */ public TestNGCucumberRunner(Class clazz) { ClassLoader classLoader = clazz.getClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz); + RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz, resourceLoader); runtimeOptions = runtimeOptionsFactory.create(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); bus = new TimeServiceEventBus(TimeService.SYSTEM); - new Plugins(classLoader, new PluginFactory(), bus, runtimeOptions); + new Plugins(new PluginFactory(), bus, runtimeOptions); FeatureLoader featureLoader = new FeatureLoader(resourceLoader); - RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); - filters = new Filters(runtimeOptions, rerunFilters); + filters = new Filters(runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); - featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions); + featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); } public void runScenario(PickleEvent pickle) throws Throwable { @@ -103,12 +101,7 @@ public Object[][] provideScenarios() { } List getFeatures() { - - List features = featureSupplier.get(); bus.send(new TestRunStarted(bus.getTime())); - for (CucumberFeature feature : features) { - feature.sendTestSourceRead(bus); - } - return features; + return featureSupplier.get(); } } diff --git a/testng/src/test/java/cucumber/runtime/testng/RunCukesStrict.java b/testng/src/test/java/cucumber/runtime/testng/RunCukesStrict.java deleted file mode 100644 index 5e8daee59f..0000000000 --- a/testng/src/test/java/cucumber/runtime/testng/RunCukesStrict.java +++ /dev/null @@ -1,8 +0,0 @@ -package cucumber.runtime.testng; - -import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions(strict = true) -public class RunCukesStrict extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/cucumber/runtime/testng/RunCukesTest.java b/testng/src/test/java/cucumber/runtime/testng/RunCukesTest.java deleted file mode 100644 index 7b4b8ed402..0000000000 --- a/testng/src/test/java/cucumber/runtime/testng/RunCukesTest.java +++ /dev/null @@ -1,6 +0,0 @@ -package cucumber.runtime.testng; - -import cucumber.api.testng.AbstractTestNGCucumberTests; - -public class RunCukesTest extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/cucumber/runtime/testng/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/cucumber/runtime/testng/RunFeatureWithThreeScenariosTest.java deleted file mode 100644 index 11a2b9138c..0000000000 --- a/testng/src/test/java/cucumber/runtime/testng/RunFeatureWithThreeScenariosTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package cucumber.runtime.testng; - -import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions( - features = "classpath:cucumber/runtime/testng/three_scenarios.feature" -) -public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/cucumber/runtime/testng/RunScenarioWithUndefinedStepsStrict.java b/testng/src/test/java/cucumber/runtime/testng/RunScenarioWithUndefinedStepsStrict.java deleted file mode 100644 index 44b676cf12..0000000000 --- a/testng/src/test/java/cucumber/runtime/testng/RunScenarioWithUndefinedStepsStrict.java +++ /dev/null @@ -1,11 +0,0 @@ -package cucumber.runtime.testng; - -import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions( - features = "classpath:cucumber/runtime/testng/undefined_steps.feature", - strict = true -) -public class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java b/testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java similarity index 91% rename from testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java rename to testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java index 233807c3ed..49b3f2a749 100644 --- a/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java @@ -1,11 +1,11 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import java.util.Collections; import java.util.List; import java.util.Set; -import cucumber.runtime.testng.RunFeatureWithThreeScenariosTest; import org.testng.Assert; +import org.testng.ITestNGListener; import org.testng.TestNG; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -20,7 +20,7 @@ public final class AbstractTestNGCucumberTestsTest { public void setUp() { InvokedMethodListener icml = new InvokedMethodListener(); TestNG testNG = new TestNG(); - testNG.addListener(icml); + testNG.addListener((ITestNGListener)icml); testNG.setGroups("cucumber"); testNG.setTestClasses(new Class[]{RunFeatureWithThreeScenariosTest.class}); testNG.run(); diff --git a/testng/src/test/java/cucumber/api/testng/InvokedMethodListener.java b/testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java similarity index 97% rename from testng/src/test/java/cucumber/api/testng/InvokedMethodListener.java rename to testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java index 13ce80da52..0d7e684ea8 100644 --- a/testng/src/test/java/cucumber/api/testng/InvokedMethodListener.java +++ b/testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import java.util.*; diff --git a/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java b/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java new file mode 100644 index 0000000000..093d601b9f --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java @@ -0,0 +1,4 @@ +package io.cucumber.testng.api; + +public class RunCukesTest extends AbstractTestNGCucumberTests { +} diff --git a/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java new file mode 100644 index 0000000000..f35eadc230 --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java @@ -0,0 +1,10 @@ +package io.cucumber.testng.api; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.testng.api.AbstractTestNGCucumberTests; + +@CucumberOptions( + features = "classpath:io/cucumber/testng/api/three_scenarios.feature" +) +public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { +} diff --git a/testng/src/test/java/cucumber/runtime/stub/StubBackend.java b/testng/src/test/java/io/cucumber/testng/api/StubBackend.java similarity index 67% rename from testng/src/test/java/cucumber/runtime/stub/StubBackend.java rename to testng/src/test/java/io/cucumber/testng/api/StubBackend.java index f5948390df..a8b1a7b424 100644 --- a/testng/src/test/java/cucumber/runtime/stub/StubBackend.java +++ b/testng/src/test/java/io/cucumber/testng/api/StubBackend.java @@ -1,13 +1,12 @@ -package cucumber.runtime.stub; +package io.cucumber.testng.api; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.ResourceLoader; import gherkin.pickles.PickleStep; -import java.util.Collections; import java.util.List; import static java.util.Collections.singletonList; @@ -34,7 +33,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("STUB SNIPPET"); } } diff --git a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java b/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java similarity index 90% rename from testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java rename to testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java index d4d38b243d..c67ebc5e3f 100644 --- a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java @@ -1,15 +1,13 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; -import cucumber.api.PendingException; -import cucumber.api.Result; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.testng.SkipException; import org.testng.annotations.Test; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; @@ -88,7 +86,7 @@ public void should_not_be_skipped_for_pending_result_in_strict_mode() { resultListener.receiveResult(mockPendingResult()); assertFalse(resultListener.isPassed()); - assertTrue(resultListener.getError() instanceof PendingException); + assertTrue(resultListener.getError() instanceof TestPendingException); } @Test @@ -122,7 +120,7 @@ private Result mockAmbiguousResult() { } private Result mockPendingResult() { - return new Result(Result.Type.PENDING, 0L, new PendingException()); + return new Result(Result.Type.PENDING, 0L, new TestPendingException()); } } diff --git a/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java b/testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java similarity index 68% rename from testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java rename to testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java index b77df0059e..b2f77e6656 100644 --- a/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java @@ -1,10 +1,8 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; -import cucumber.runtime.CucumberException; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.testng.RunCukesStrict; -import cucumber.runtime.testng.RunCukesTest; -import cucumber.runtime.testng.RunScenarioWithUndefinedStepsStrict; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.model.CucumberFeature; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -47,21 +45,33 @@ public void parse_error_propagated_to_testng_test_execution() throws Exception { testNGCucumberRunner = new ParseErrorCucumberRunner(RunCukesTest.class); Object[][] scenarios = testNGCucumberRunner.provideScenarios(); // a CucumberException is caught try { - ((PickleEventWrapper)scenarios[0][0]).getPickleEvent(); + ((PickleEventWrapper) scenarios[0][0]).getPickleEvent(); Assert.fail("CucumberException not thrown"); } catch (CucumberException e) { Assert.assertEquals(e.getMessage(), "parse error"); } } -} -class ParseErrorCucumberRunner extends TestNGCucumberRunner { - public ParseErrorCucumberRunner(Class clazz) { - super(clazz); + + static class ParseErrorCucumberRunner extends TestNGCucumberRunner { + public ParseErrorCucumberRunner(Class clazz) { + super(clazz); + } + + @Override + List getFeatures() { + throw new CucumberException("parse error"); + } + } + + @CucumberOptions( + features = "classpath:io/cucumber/testng/api/undefined_steps.feature", + strict = true + ) + static class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberTests { } - @Override - List getFeatures() { - throw new CucumberException("parse error"); + @CucumberOptions(strict = true) + static class RunCukesStrict extends AbstractTestNGCucumberTests { } } diff --git a/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java b/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java new file mode 100644 index 0000000000..db488025b0 --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java @@ -0,0 +1,14 @@ +package io.cucumber.testng.api; + +import io.cucumber.core.backend.Pending; + +@Pending +public final class TestPendingException extends RuntimeException { + public TestPendingException() { + this("TODO: implement me"); + } + + public TestPendingException(String message) { + super(message); + } +} diff --git a/testng/src/test/resources/cucumber/runtime/testng/fa.feature b/testng/src/test/resources/io/cucumber/testng/api/fa.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/fa.feature rename to testng/src/test/resources/io/cucumber/testng/api/fa.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/fb.feature b/testng/src/test/resources/io/cucumber/testng/api/fb.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/fb.feature rename to testng/src/test/resources/io/cucumber/testng/api/fb.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/feature_with_same_steps_in_different_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/api/feature_with_same_steps_in_different_scenarios.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/feature_with_same_steps_in_different_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/api/feature_with_same_steps_in_different_scenarios.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/three_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/api/three_scenarios.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/three_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/api/three_scenarios.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/undefined_steps.feature b/testng/src/test/resources/io/cucumber/testng/api/undefined_steps.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/undefined_steps.feature rename to testng/src/test/resources/io/cucumber/testng/api/undefined_steps.feature diff --git a/weld/pom.xml b/weld/pom.xml index bde4be2fca..33cf728db8 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-weld diff --git a/weld/src/main/java/cucumber/runtime/java/weld/WeldFactory.java b/weld/src/main/java/io/cucumber/weld/WeldFactory.java similarity index 96% rename from weld/src/main/java/cucumber/runtime/java/weld/WeldFactory.java rename to weld/src/main/java/io/cucumber/weld/WeldFactory.java index 8d229ab56f..4510923eda 100644 --- a/weld/src/main/java/cucumber/runtime/java/weld/WeldFactory.java +++ b/weld/src/main/java/io/cucumber/weld/WeldFactory.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.weld; +package io.cucumber.weld; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import cucumber.api.java.ObjectFactory; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; diff --git a/weld/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory b/weld/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory new file mode 100644 index 0000000000..fb77476dd4 --- /dev/null +++ b/weld/src/main/resources/META-INF/services/cucumber.api.java.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.weld.WeldFactory diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/Belly.java b/weld/src/test/java/io/cucumber/weld/Belly.java similarity index 81% rename from openejb/src/test/java/cucumber/runtime/java/openejb/Belly.java rename to weld/src/test/java/io/cucumber/weld/Belly.java index 50d2e4e94c..42348f8f95 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/Belly.java +++ b/weld/src/test/java/io/cucumber/weld/Belly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.weld; public class Belly { private int cukes; diff --git a/weld/src/test/java/cucumber/runtime/java/weld/BellyStepdefs.java b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java similarity index 96% rename from weld/src/test/java/cucumber/runtime/java/weld/BellyStepdefs.java rename to weld/src/test/java/io/cucumber/weld/BellyStepdefs.java index 7f18e92c52..879ce2af89 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/BellyStepdefs.java +++ b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.weld; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/weld/src/test/java/io/cucumber/weld/RunCukesTest.java b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java new file mode 100644 index 0000000000..c926b94d96 --- /dev/null +++ b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java @@ -0,0 +1,8 @@ +package io.cucumber.weld; + +import io.cucumber.junit.api.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +public class RunCukesTest { +} diff --git a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java new file mode 100644 index 0000000000..3a5a437ad3 --- /dev/null +++ b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java @@ -0,0 +1,20 @@ +package io.cucumber.weld; + +import cucumber.api.java.Before; +import cucumber.api.java.en.Given; + +public class UnusedGlue { + public UnusedGlue() { + throw new IllegalStateException(); + } + + @Given("unused") + public void unused() { + throw new IllegalStateException(); + } + + @Before("@unused") + public void unusedHook() { + throw new IllegalStateException(); + } +} diff --git a/weld/src/test/java/cucumber/runtime/java/weld/WeldFactoryTest.java b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java similarity index 98% rename from weld/src/test/java/cucumber/runtime/java/weld/WeldFactoryTest.java rename to weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java index 5e04e5b100..7fec36cfad 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/WeldFactoryTest.java +++ b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.weld; import cucumber.api.java.ObjectFactory; import cucumber.api.junit.Cucumber; diff --git a/weld/src/test/resources/cucumber/runtime/java/weld/cukes.feature b/weld/src/test/resources/io/cucumber/weld/cukes.feature similarity index 100% rename from weld/src/test/resources/cucumber/runtime/java/weld/cukes.feature rename to weld/src/test/resources/io/cucumber/weld/cukes.feature