package net.thucydides.core.reports.adaptors.specflow; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import java.util.List; /** * Split a list of output lines into normal scenarios and table-based scenarios */ public class ScenarioSplitter { private static final String TITLE_LEAD = "***** "; private final List<String> outputLines; public static ScenarioSplitter on(List<String> outputLines) { return new ScenarioSplitter(outputLines); } public ScenarioSplitter(List<String> outputLines) { this.outputLines = ImmutableList.copyOf(outputLines); } public List<SpecflowScenario> split() { List<SpecflowScenario> scenarios = Lists.newArrayList(); String currentTitle = null; SpecflowScenario currentScenario = null; for (List<String> blockLines : splitScenarios(outputLines)) { String blockTitle = blockLines.get(0); List<String> blockSteps = tail(blockLines); if (sameTitle(blockTitle, currentTitle)) { currentScenario.convertToTable(currentTitle); currentScenario.addRow(blockTitle, blockSteps); } else { currentScenario = new SpecflowScenario(removeParametersFrom(blockTitle)); scenarios.add(currentScenario); currentScenario.addSteps(blockSteps); } currentTitle = blockTitle; } return scenarios; } private boolean sameTitle(String blockTitle, String currentTitle) { String blockTitleWithoutParameters = removeParametersFrom(blockTitle); String currentTitleWithoutParameters = removeParametersFrom(currentTitle); return blockTitleWithoutParameters.equals(currentTitleWithoutParameters); } private String removeParametersFrom(String title) { if (title != null && title.indexOf("(") > -1) { return title.substring(0, title.indexOf("(") ); } else { return title; } } private List<List<String>> splitScenarios(List<String> outputLines) { List<List<String>> scenarios = Lists.newArrayList(); List<String> current = null; for (String line : outputLines) { if (isTitle(line)) { if (current != null) { scenarios.add(current); } current = Lists.newArrayList(); current.add(line); } else { current.add(line); } } scenarios.add(current); return scenarios; } // COMMON // private boolean isTitle(String line) { return line.trim().startsWith(TITLE_LEAD); } private List<String> tail(List<String> outlineLines) { return ImmutableList.copyOf(outlineLines.subList(1, outlineLines.size())); } }