package net.thucydides.core.reports.adaptors.specflow; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import net.thucydides.core.model.TestResult; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.List; public class ScenarioStep { private static final String SUCCESS_LEAD = "-> done: "; private static final String PENDING_LEAD = "-> No matching step definition"; private static final String FAILURE_LEAD = "-> error: "; private static final String SKIPPED_LEAD = "-> skipped"; private static final String NEW_LINE = System.getProperty("line.separator"); private final String title; private final TestResult result; private final Optional<? extends Throwable> exception; private final Optional<BigDecimal> duration; public ScenarioStep(List<String> resultLines) { title = resultLines.get(0).trim(); duration = parseDuration(tail(resultLines)); result = parseResult(tail(resultLines)); exception = parseException(tail(resultLines)); } private Optional<BigDecimal> parseDuration(List<String> resultLines) { String resultLine = resultLines.get(0); if (containsDurationValue(resultLine)){ String durationText = resultLine.substring(resultLine.lastIndexOf("(") + 1); durationText = durationText.substring(0,durationText.lastIndexOf("s)")); BigDecimal durationValue = new BigDecimal(durationText).multiply(new BigDecimal("1000")) .round(new MathContext(0, RoundingMode.HALF_UP)); return Optional.of(durationValue); } return Optional.absent(); } private boolean containsDurationValue(String resultLine) { return ((resultLine.lastIndexOf("(") > 0) && (resultLine.lastIndexOf("s)") > 0)); } private TestResult parseResult(List<String> resultLines) { String firstLine = resultLines.get(0).trim(); if (firstLine.startsWith(SUCCESS_LEAD)) { return TestResult.SUCCESS; } else if (firstLine.startsWith(PENDING_LEAD)) { return TestResult.PENDING; } else if (firstLine.startsWith(FAILURE_LEAD)) { return TestResult.FAILURE; } else if (firstLine.startsWith(SKIPPED_LEAD)) { return TestResult.SKIPPED; } return TestResult.UNDEFINED; } private Optional<? extends Throwable> parseException(List<String> resultLines) { String firstLine = resultLines.get(0).trim(); if (firstLine.startsWith(FAILURE_LEAD)) { StringBuilder errorMessage = new StringBuilder(firstLine.substring(FAILURE_LEAD.length())); for(int i = 1; i < resultLines.size(); i++) { errorMessage.append(NEW_LINE); errorMessage.append(resultLines.get(i)); } return Optional.of(new AssertionError(errorMessage.toString())); } else { return Optional.absent(); } } public Optional<BigDecimal> getDuration() { return duration; } public TestResult getResult() { return result; } public String getTitle() { return title; } public Optional<? extends Throwable> getException() { return exception; } private List<String> tail(List<String> lines) { return ImmutableList.copyOf(lines.subList(1, lines.size())); } }