package cuke4duke.mojo; import cuke4duke.ant.CucumberTask; import cuke4duke.internal.Utils; import org.apache.maven.plugin.MojoExecutionException; import org.apache.tools.ant.types.Commandline; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @goal cucumber */ public class CucumberMojo extends AbstractJRubyMojo { /** * @parameter expression="${cucumber.features}" */ protected String features = "features"; /** * @parameter expression="${cucumber.installGems}" */ protected boolean installGems = false; /** * Set this to 'true' to skip running features. * * @parameter expression="${maven.test.skip}" */ private boolean skip; /** * Will cause the project build to look successful, rather than fail, even if there are Cucumber test failures. * This can be useful on a continuous integration server, if your only option to be able to collect output files, * is if the project builds successfully. * * @parameter expression="${cucumber.failOnError}" */ protected boolean failOnError = true; /** * @parameter */ protected List<String> gems; /** * @parameter */ protected List<String> cucumberArgs = Collections.<String>emptyList(); /** * Appends additional arguments on the command line. e.g. * <code>-Dcucumber.extraArgs="--format profile --out target/profile.txt"</code> * These arguments will be appended to the cucumberArgs you declare * in your POM. * * @parameter expression="${cucumber.extraArgs} */ protected String extraCucumberArgs; /** * Extra JVM arguments to pass when running JRuby. * * @parameter */ protected List<String> jvmArgs; public void execute() throws MojoExecutionException { if (installGems) { for (String gemSpec : gems) { installGem(gemSpec); } } if (skip) { getLog().info("Cucumber Features are skipped"); return; } CucumberTask cucumber = cucumber(allCucumberArgs()); try { cucumber.execute(); } catch (Exception e) { if (failOnError) { throw new MojoExecutionException("JRuby failed.", e); } } } public CucumberTask cucumber(String args) throws MojoExecutionException { CucumberTask cucumber = new CucumberTask(); cucumber.setProject(getProject()); for (String jvmArg : getJvmArgs()) { if (jvmArg != null) { Commandline.Argument arg = cucumber.createJvmarg(); arg.setValue(jvmArg); } } cucumber.setArgs(args); return cucumber; } String allCucumberArgs() { List<String> allCucumberArgs = new ArrayList<String>(); if (cucumberArgs != null) allCucumberArgs.addAll(cucumberArgs); if (extraCucumberArgs != null) allCucumberArgs.add(extraCucumberArgs); allCucumberArgs.add(features); return Utils.join(allCucumberArgs.toArray(), " "); } protected List<String> getJvmArgs() { return (jvmArgs != null) ? jvmArgs : Collections.<String>emptyList(); } }