Skip to content

Commit

Permalink
Add default formatter when no formatter plugin is specified.
Browse files Browse the repository at this point in the history
  • Loading branch information
brasmusson committed Jan 14, 2015
1 parent c68d2ac commit 1e79082
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 9 deletions.
27 changes: 21 additions & 6 deletions core/src/main/java/cucumber/runtime/RuntimeOptions.java
Expand Up @@ -31,7 +31,8 @@ public class RuntimeOptions {
private final List<String> glue = new ArrayList<String>(); private final List<String> glue = new ArrayList<String>();
private final List<Object> filters = new ArrayList<Object>(); private final List<Object> filters = new ArrayList<Object>();
private final List<String> featurePaths = new ArrayList<String>(); private final List<String> featurePaths = new ArrayList<String>();
private final List<String> pluginNames = new ArrayList<String>(); private final List<String> pluginFormatterNames = new ArrayList<String>();
private final List<String> pluginStepDefinitionReporterNames = new ArrayList<String>();
private final PluginFactory pluginFactory; private final PluginFactory pluginFactory;
private final List<Object> plugins = new ArrayList<Object>(); private final List<Object> plugins = new ArrayList<Object>();
private boolean dryRun; private boolean dryRun;
Expand Down Expand Up @@ -81,8 +82,8 @@ public RuntimeOptions(Env env, PluginFactory pluginFactory, List<String> argv) {
parse(Shellwords.parse(cucumberOptionsFromEnv)); parse(Shellwords.parse(cucumberOptionsFromEnv));
} }


if (pluginNames.isEmpty()) { if (pluginFormatterNames.isEmpty()) {
pluginNames.add("progress"); pluginFormatterNames.add("progress");
} }
} }


Expand All @@ -109,10 +110,10 @@ private void parse(List<String> args) {
} else if (arg.equals("--tags") || arg.equals("-t")) { } else if (arg.equals("--tags") || arg.equals("-t")) {
parsedFilters.add(args.remove(0)); parsedFilters.add(args.remove(0));
} else if (arg.equals("--plugin") || arg.equals("-p")) { } else if (arg.equals("--plugin") || arg.equals("-p")) {
pluginNames.add(args.remove(0)); addPluginName(args.remove(0));
} else if (arg.equals("--format") || arg.equals("-f")) { } else if (arg.equals("--format") || arg.equals("-f")) {
System.err.println("WARNING: Cucumber-JVM's --format option is deprecated. Please use --plugin instead."); System.err.println("WARNING: Cucumber-JVM's --format option is deprecated. Please use --plugin instead.");
pluginNames.add(args.remove(0)); addPluginName(args.remove(0));
} else if (arg.equals("--no-dry-run") || arg.equals("--dry-run") || arg.equals("-d")) { } else if (arg.equals("--no-dry-run") || arg.equals("--dry-run") || arg.equals("-d")) {
dryRun = !arg.startsWith("--no-"); dryRun = !arg.startsWith("--no-");
} else if (arg.equals("--no-strict") || arg.equals("--strict") || arg.equals("-s")) { } else if (arg.equals("--no-strict") || arg.equals("--strict") || arg.equals("-s")) {
Expand Down Expand Up @@ -150,6 +151,16 @@ private void parse(List<String> args) {
} }
} }


private void addPluginName(String name) {
if (pluginFactory.isFormatterName(name)) {
pluginFormatterNames.add(name);
} else if (pluginFactory.isStepDefinitionResporterName(name)) {
pluginStepDefinitionReporterNames.add(name);
} else {
throw new CucumberException("Unrecognized plugin: " + name);
}
}

private boolean haveLineFilters(List<String> parsedFeaturePaths) { private boolean haveLineFilters(List<String> parsedFeaturePaths) {
for (String pathName : parsedFeaturePaths) { for (String pathName : parsedFeaturePaths) {
if (pathName.startsWith("@") || PathWithLines.hasLineFilters(pathName)) { if (pathName.startsWith("@") || PathWithLines.hasLineFilters(pathName)) {
Expand Down Expand Up @@ -203,12 +214,16 @@ public List<CucumberFeature> cucumberFeatures(ResourceLoader resourceLoader) {


List<Object> getPlugins() { List<Object> getPlugins() {
if (!pluginNamesInstantiated) { if (!pluginNamesInstantiated) {
for (String pluginName : pluginNames) { for (String pluginName : pluginFormatterNames) {
Object plugin = pluginFactory.create(pluginName); Object plugin = pluginFactory.create(pluginName);
plugins.add(plugin); plugins.add(plugin);
setMonochromeOnColorAwarePlugins(plugin); setMonochromeOnColorAwarePlugins(plugin);
setStrictOnStrictAwarePlugins(plugin); setStrictOnStrictAwarePlugins(plugin);
} }
for (String pluginName : pluginStepDefinitionReporterNames) {
Object plugin = pluginFactory.create(pluginName);
plugins.add(plugin);
}
pluginNamesInstantiated = true; pluginNamesInstantiated = true;
} }
return plugins; return plugins;
Expand Down
@@ -1,6 +1,7 @@
package cucumber.runtime; package cucumber.runtime;


import cucumber.api.CucumberOptions; import cucumber.api.CucumberOptions;
import cucumber.runtime.formatter.PluginFactory;
import cucumber.runtime.io.MultiLoader; import cucumber.runtime.io.MultiLoader;


import java.util.ArrayList; import java.util.ArrayList;
Expand Down Expand Up @@ -85,7 +86,9 @@ private void addPlugins(CucumberOptions options, List<String> args) {
for (String plugin : plugins) { for (String plugin : plugins) {
args.add("--plugin"); args.add("--plugin");
args.add(plugin); args.add(plugin);
pluginSpecified = true; if (PluginFactory.isFormatterName(plugin)) {
pluginSpecified = true;
}
} }
} }


Expand Down
34 changes: 32 additions & 2 deletions core/src/main/java/cucumber/runtime/formatter/PluginFactory.java
@@ -1,8 +1,11 @@
package cucumber.runtime.formatter; package cucumber.runtime.formatter;


import cucumber.api.StepDefinitionReporter;
import cucumber.runtime.CucumberException; import cucumber.runtime.CucumberException;
import cucumber.runtime.io.URLOutputStream; import cucumber.runtime.io.URLOutputStream;
import cucumber.runtime.io.UTF8OutputStreamWriter; import cucumber.runtime.io.UTF8OutputStreamWriter;
import gherkin.formatter.Formatter;
import gherkin.formatter.Reporter;


import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
Expand Down Expand Up @@ -150,7 +153,7 @@ private <T> Constructor<T> findConstructor(Class<T> pluginClass, Class<?> ctorAr
} }
} }


private <T> Class<T> pluginClass(String pluginName) { private static <T> Class<T> pluginClass(String pluginName) {
Class<T> pluginClass = (Class<T>) PLUGIN_CLASSES.get(pluginName); Class<T> pluginClass = (Class<T>) PLUGIN_CLASSES.get(pluginName);
if (pluginClass == null) { if (pluginClass == null) {
pluginClass = loadClass(pluginName); pluginClass = loadClass(pluginName);
Expand All @@ -159,7 +162,7 @@ private <T> Class<T> pluginClass(String pluginName) {
} }


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T> Class<T> loadClass(String className) { private static <T> Class<T> loadClass(String className) {
try { try {
return (Class<T>) Thread.currentThread().getContextClassLoader().loadClass(className); return (Class<T>) Thread.currentThread().getContextClassLoader().loadClass(className);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
Expand All @@ -181,4 +184,31 @@ private Appendable defaultOutOrFailIfAlreadyUsed(String formatterString) {
defaultOut = null; defaultOut = null;
} }
} }

public static boolean isFormatterName(String name) {
Class pluginClass = getPluginClass(name);
if (Formatter.class.isAssignableFrom(pluginClass) || Reporter.class.isAssignableFrom(pluginClass)) {
return true;
}
return false;
}

public static boolean isStepDefinitionResporterName(String name) {
Class pluginClass = getPluginClass(name);
if (StepDefinitionReporter.class.isAssignableFrom(pluginClass)) {
return true;
}
return false;
}

private static Class getPluginClass(String name) {
Matcher pluginWithFile = PLUGIN_WITH_FILE_PATTERN.matcher(name);
String pluginName;
if (pluginWithFile.matches()) {
pluginName = pluginWithFile.group(1);
} else {
pluginName = name;
}
return pluginClass(pluginName);
}
} }
20 changes: 20 additions & 0 deletions core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java
Expand Up @@ -94,6 +94,21 @@ public void finds_path_for_class_in_toplevel_package() {
assertEquals("", packageName("TopLevelClass")); assertEquals("", packageName("TopLevelClass"));
} }


@Test
public void create_null_formatter_when_no_formatter_plugin_is_defined() {
RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithNoFormatterPlugin.class);
RuntimeOptions runtimeOptions = runtimeOptionsFactory.create();

List<Object> plugins = runtimeOptions.getPlugins();
boolean found = false;
for (Object plugin : plugins) {
if ("cucumber.runtime.formatter.NullFormatter".equals(plugin.getClass().getName())) {
found = true;
}
}
assertTrue("NullFormatter not found among plugins", found);
}

@Test @Test
public void inherit_plugin_from_baseclass() { public void inherit_plugin_from_baseclass() {
RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithFormatter.class); RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithFormatter.class);
Expand Down Expand Up @@ -165,4 +180,9 @@ static class SubClassWithMonoChromeTrue extends BaseClassWithMonoChromeFalse {
static class BaseClassWithMonoChromeFalse { static class BaseClassWithMonoChromeFalse {
// empty // empty
} }

@CucumberOptions(plugin = "cucumber.runtime.formatter.AnyStepDefinitionReporter")
static class ClassWithNoFormatterPlugin {
// empty
}
} }
19 changes: 19 additions & 0 deletions core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java
Expand Up @@ -80,6 +80,24 @@ public void creates_html_formatter() {
assertEquals("cucumber.runtime.formatter.HTMLFormatter", options.getPlugins().get(0).getClass().getName()); assertEquals("cucumber.runtime.formatter.HTMLFormatter", options.getPlugins().get(0).getClass().getName());
} }


@Test
public void creates_progress_formatter_as_default() {
RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere"));
assertEquals("cucumber.runtime.formatter.ProgressFormatter", options.getPlugins().get(0).getClass().getName());
}

@Test
public void creates_progress_formatter_when_non_formatter_plugin_is_specified() {
RuntimeOptions options = new RuntimeOptions(asList("--plugin", "cucumber.runtime.formatter.AnyStepDefinitionReporter", "--glue", "somewhere"));
boolean found = false;
for (Object plugin : options.getPlugins()) {
if (plugin.getClass().getName() == "cucumber.runtime.formatter.ProgressFormatter") {
found = true;
}
}
assertTrue("ProgressFormatter not found among the plugins", found);
}

@Test @Test
public void assigns_strict() { public void assigns_strict() {
RuntimeOptions options = new RuntimeOptions(asList("--strict", "--glue", "somewhere")); RuntimeOptions options = new RuntimeOptions(asList("--strict", "--glue", "somewhere"));
Expand Down Expand Up @@ -309,3 +327,4 @@ private void mockResource(ResourceLoader resourceLoader, String featurePath, Str
when(resourceLoader.resources(featurePath, ".feature")).thenReturn(asList(resource1)); when(resourceLoader.resources(featurePath, ".feature")).thenReturn(asList(resource1));
} }
} }

@@ -0,0 +1,17 @@
package cucumber.runtime.formatter;

import cucumber.api.StepDefinitionReporter;
import cucumber.runtime.StepDefinition;

public class AnyStepDefinitionReporter implements StepDefinitionReporter {

public AnyStepDefinitionReporter() {
// TODO Auto-generated constructor stub
}

@Override
public void stepDefinition(StepDefinition stepDefinition) {
// TODO Auto-generated method stub
}

}

0 comments on commit 1e79082

Please sign in to comment.