package org.easyb.plugin.ui;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import org.easyb.BehaviorStep;
import org.easyb.domain.Behavior;
import org.easyb.listener.ExecutionListener;
import org.easyb.result.Result;
import static org.easyb.util.BehaviorStepType.SPECIFICATION;
import static org.easyb.util.BehaviorStepType.STORY;
import org.easyb.plugin.ConsoleOutputListener;
import static org.easyb.plugin.Outcome.*;
import org.easyb.plugin.StepResult;
public class EasybPresenter<T extends ResultNode>
implements ExecutionListener, ConsoleOutputListener, ViewEventListener {
private EasybView<T> view;
private NodeBuilder<T> nodeBuilder;
private Stack<T> nodeStack;
private Map<String, T> nodeMap;
private boolean descendantFailed = false;
private String lastSpecRunName;
private SpecificationRunningParser specRunningParser = new SpecificationRunningParser();
public EasybPresenter(EasybView<T> view, NodeBuilder<T> nodeBuilder) {
this.view = view;
this.nodeBuilder = nodeBuilder;
nodeStack = new Stack<T>();
nodeMap = new HashMap<String, T>();
}
public void startBehavior(Behavior behavior) {
descendantFailed = false;
}
public void startStep(BehaviorStep behaviorStep) {
T node = buildNode(behaviorStep);
if (behaviorStep.getStepType() == STORY || behaviorStep.getStepType() == SPECIFICATION) {
view.addBehaviorResult(node);
} else {
view.addBehaviorResult(currentNode(), node);
}
nodeStack.push(node);
}
private T buildNode(BehaviorStep behaviorStep) {
T node = nodeBuilder.build(new StepResult(behaviorStep.getName(), behaviorStep.getStepType(), RUNNING));
nodeMap.put(behaviorStep.getName(), node);
return node;
}
public void describeStep(String s) {
}
public void gotResult(Result result) {
StepResult stepResult = currentNode().getResult();
if (descendantFailed) {
stepResult.setOutcome(FAILURE);
} else {
stepResult.setOutcome(outcomeForResult(result));
}
if (result.failed()) {
stepResult.setCause(result.cause);
descendantFailed = true;
}
view.refresh();
}
public void stopStep() {
StepResult stepResult = currentNode().getResult();
if (stepResult.getOutcome() == RUNNING) {
if (descendantFailed) {
stepResult.setOutcome(FAILURE);
} else {
stepResult.setOutcome(SUCCESS);
}
}
nodeStack.pop();
view.refresh();
}
public void stopBehavior(BehaviorStep behaviorStep, Behavior behavior) {
}
public void completeTesting() {
}
public void textAvailable(String text) {
view.writeConsole(text);
if (specRunningParser.isSpecificationRunningMessage(text)) {
captureSpecificationRunningMessage(text);
} else {
if (lastSpecRunName != null) {
ResultNode lastSpecRunNode = nodeMap.get(lastSpecRunName);
appendOutput(text, lastSpecRunNode);
}
}
}
private void appendOutput(String text, ResultNode lastSpecRunNode) {
lastSpecRunNode.setOutput(lastSpecRunNode.getOutput() + text);
}
private void captureSpecificationRunningMessage(String text) {
if (specRunningParser.isSpecificationRunningMessage(text)) {
lastSpecRunName = specRunningParser.parseSpecNameFrom(text);
}
}
public void resultSelected(ResultNode result) {
view.writeOutput(result.getOutput());
}
private T currentNode() {
return nodeStack.peek();
}
}