AbstractStepResult.java
package org.jbehave.core.steps;
import java.lang.reflect.Method;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.jbehave.core.failures.PendingStepFound;
import org.jbehave.core.failures.UUIDExceptionWrapper;
import org.jbehave.core.model.OutcomesTable.OutcomesFailed;
import org.jbehave.core.reporters.StoryReporter;
import org.jbehave.core.steps.StepCreator.PendingStep;
/**
* Represents the possible step results:
* <ul>
* <li>Failed</li>
* <li>NotPerformed</li>
* <li>Pending</li>
* <li>Successful</li>
* <li>Ignorable</li>
* <li>Skipped</li>
* </ul>
*/
public abstract class AbstractStepResult implements StepResult {
public static class Failed extends AbstractStepResult {
public Failed(String step, UUIDExceptionWrapper throwable) {
super(step, Type.FAILED, throwable);
}
public Failed(Method method, UUIDExceptionWrapper throwable) {
super(asString(method), Type.FAILED, throwable);
}
@Override
public void describeTo(StoryReporter reporter) {
if (throwable.getCause() instanceof OutcomesFailed) {
reporter.failedOutcomes(parametrisedStep(), ((OutcomesFailed) throwable.getCause()).outcomesTable());
} else {
reporter.failed(parametrisedStep(), throwable);
}
}
}
public static class NotPerformed extends AbstractStepResult {
public NotPerformed(String step) {
super(Type.NOT_PERFORMED, step);
}
@Override
public void describeTo(StoryReporter reporter) {
reporter.notPerformed(parametrisedStep());
}
}
public static class Pending extends AbstractStepResult {
private PendingStep pendingStep;
public Pending(PendingStep step) {
this(step, new PendingStepFound(step.stepAsString()));
pendingStep = step;
}
public Pending(PendingStep step, PendingStepFound e) {
super(step.getStepAsString(), Type.PENDING, e);
pendingStep = step;
}
@Override
public void describeTo(StoryReporter reporter) {
reporter.pending(parametrisedStep());
reporter.pending(pendingStep);
}
}
public static class Successful extends AbstractStepResult {
public Successful(String step) {
super(Type.SUCCESSFUL, step);
}
public Successful(Method method) {
super(Type.SUCCESSFUL, asString(method));
}
@Override
public void describeTo(StoryReporter reporter) {
reporter.successful(parametrisedStep());
}
}
public static class Ignorable extends AbstractStepResult {
public Ignorable(String step) {
super(Type.IGNORABLE, step);
}
@Override
public void describeTo(StoryReporter reporter) {
reporter.ignorable(step);
}
}
public static class Comment extends AbstractStepResult {
public Comment(String step) {
super(Type.COMMENT, step);
}
@Override
public void describeTo(StoryReporter reporter) {
reporter.comment(step);
}
}
public static class Skipped extends AbstractStepResult {
public Skipped() {
super(Type.SKIPPED, "");
}
@Override
public void describeTo(StoryReporter reporter) {
// do not report
}
}
protected final String step;
protected final Type type;
protected final UUIDExceptionWrapper throwable;
private Timing timing = new Timing();
private String parametrisedStep;
public AbstractStepResult(Type type, String step) {
this(step, type, null);
}
public AbstractStepResult(String step, Type type, UUIDExceptionWrapper throwable) {
this.step = step;
this.type = type;
this.throwable = throwable;
}
@Override
public String parametrisedStep() {
return parametrisedStep != null ? parametrisedStep : step;
}
@Override
public StepResult withParameterValues(String parametrisedStep) {
this.parametrisedStep = parametrisedStep;
return this;
}
public Timing getTiming() {
return timing;
}
@Override
public StepResult setTimings(Timer timer) {
this.timing = new Timing(timer);
return this;
}
@Override
public UUIDExceptionWrapper getFailure() {
return throwable;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append(parametrisedStep()).append(
getTiming()).toString();
}
public static StepResult successful(String step) {
return new Successful(step);
}
public static StepResult successful(Method method) {
return new Successful(method);
}
public static StepResult ignorable(String step) {
return new Ignorable(step);
}
public static StepResult comment(String step) {
return new Comment(step);
}
public static StepResult pending(PendingStep step) {
return new Pending(step);
}
public static StepResult pending(PendingStep step, PendingStepFound e) {
return new Pending(step, e);
}
public static StepResult notPerformed(String step) {
return new NotPerformed(step);
}
public static StepResult failed(String step, UUIDExceptionWrapper e) {
return new Failed(step, e);
}
public static StepResult failed(Method method, UUIDExceptionWrapper e) {
return new Failed(method, e);
}
public static StepResult skipped() {
return new Skipped();
}
private static String asString(Method method) {
if (method == null) {
return "";
}
StringBuilder sb = new StringBuilder()
.append(method.getDeclaringClass().getName()).append(".")
.append(method.getName()).append("(");
Class<?>[] types = method.getParameterTypes();
for (int i = 0; i < types.length; i++) {
Class<?> type = types[i];
sb.append(type.getName());
if (i + 1 < types.length) {
sb.append(",");
}
}
return sb.append(")").toString();
}
}