cucumber.runtime.model.CucumberScenarioOutline Maven / Gradle / Ivy
package cucumber.runtime.model;
import cucumber.runtime.CucumberException;
import cucumber.runtime.Runtime;
import gherkin.formatter.Formatter;
import gherkin.formatter.Reporter;
import gherkin.formatter.model.DataTableRow;
import gherkin.formatter.model.DocString;
import gherkin.formatter.model.Examples;
import gherkin.formatter.model.ExamplesTableRow;
import gherkin.formatter.model.Row;
import gherkin.formatter.model.Scenario;
import gherkin.formatter.model.ScenarioOutline;
import gherkin.formatter.model.Step;
import gherkin.formatter.model.Tag;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CucumberScenarioOutline extends CucumberTagStatement {
private final List cucumberExamplesList = new ArrayList();
private final CucumberBackground cucumberBackground;
public CucumberScenarioOutline(CucumberFeature cucumberFeature, CucumberBackground cucumberBackground, ScenarioOutline scenarioOutline) {
super(cucumberFeature, scenarioOutline);
this.cucumberBackground = cucumberBackground;
}
public void examples(Examples examples) {
cucumberExamplesList.add(new CucumberExamples(this, examples));
}
public List getCucumberExamplesList() {
return cucumberExamplesList;
}
@Override
public void run(Formatter formatter, Reporter reporter, Runtime runtime) {
formatOutlineScenario(formatter);
for (CucumberExamples cucumberExamples : cucumberExamplesList) {
cucumberExamples.format(formatter);
List exampleScenarios = cucumberExamples.createExampleScenarios();
for (CucumberScenario exampleScenario : exampleScenarios) {
exampleScenario.run(formatter, reporter, runtime);
}
}
}
public void formatOutlineScenario(Formatter formatter) {
format(formatter);
}
CucumberScenario createExampleScenario(ExamplesTableRow header, ExamplesTableRow example, List examplesTags) {
// Make sure we replace the tokens in the name of the scenario
String exampleScenarioName = replaceTokens(new HashSet(), header.getCells(), example.getCells(), getGherkinModel().getName());
Scenario exampleScenario = new Scenario(example.getComments(), examplesTags, getGherkinModel().getKeyword(), exampleScenarioName, "", example.getLine(), example.getId());
CucumberScenario cucumberScenario = new CucumberScenario(cucumberFeature, cucumberBackground, exampleScenario, example);
for (Step step : getSteps()) {
cucumberScenario.step(createExampleStep(step, header, example));
}
return cucumberScenario;
}
static ExampleStep createExampleStep(Step step, ExamplesTableRow header, ExamplesTableRow example) {
Set matchedColumns = new HashSet();
List headerCells = header.getCells();
List exampleCells = example.getCells();
// Create a step with replaced tokens
String name = replaceTokens(matchedColumns, headerCells, exampleCells, step.getName());
if (name.isEmpty()) {
throw new CucumberException("Step generated from scenario outline '" + step.getName() + "' is empty");
}
return new ExampleStep(
step.getComments(),
step.getKeyword(),
name,
step.getLine(),
rowsWithTokensReplaced(step.getRows(), headerCells, exampleCells, matchedColumns),
docStringWithTokensReplaced(step.getDocString(), headerCells, exampleCells, matchedColumns),
matchedColumns);
}
private static List rowsWithTokensReplaced(List rows, List headerCells, List exampleCells, Set matchedColumns) {
if (rows != null) {
List newRows = new ArrayList(rows.size());
for (Row row : rows) {
List newCells = new ArrayList(row.getCells().size());
for (String cell : row.getCells()) {
newCells.add(replaceTokens(matchedColumns, headerCells, exampleCells, cell));
}
newRows.add(new DataTableRow(row.getComments(), newCells, row.getLine()));
}
return newRows;
} else {
return null;
}
}
private static DocString docStringWithTokensReplaced(DocString docString, List headerCells, List exampleCells, Set matchedColumns) {
if (docString != null) {
String docStringValue = replaceTokens(matchedColumns, headerCells, exampleCells, docString.getValue());
return new DocString(docString.getContentType(), docStringValue, docString.getLine());
} else {
return null;
}
}
private static String replaceTokens(Set matchedColumns, List headerCells, List exampleCells, String text) {
for (int col = 0; col < headerCells.size(); col++) {
String headerCell = headerCells.get(col);
String value = exampleCells.get(col);
String token = "<" + headerCell + ">";
if (text.contains(token)) {
text = text.replace(token, value);
matchedColumns.add(col);
}
}
return text;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy