package xapi.gwt.junit.gui;
import elemental.client.Browser;
import elemental.dom.Element;
import xapi.elemental.X_Elemental;
import xapi.gwt.junit.api.JUnitExecution;
import xapi.gwt.junit.impl.JUnit4Executor;
import xapi.util.api.ProvidesValue;
import xapi.util.impl.LazyProvider;
import javax.inject.Provider;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
/**
* Created by james on 18/10/15.
*/
public class JUnitGuiExecution extends JUnitExecution<JUnitGuiController> {
private ProvidesValue<Element> stageProvider;
private final Provider<Element> originalProvider;
private Element stageRoot;
public JUnitGuiExecution(Provider<Element> stageProvider, Runnable update) {
this.originalProvider = stageProvider;
this.stageProvider = new LazyProvider<>(stageProvider);
Element[] running = new Element[1];
onStartMethod(
m -> {
final String id = m.getName() + m.getDeclaringClass().hashCode();
stageRoot = Browser.getDocument().getElementById(id);
running[0] = X_Elemental.newDiv();
running[0].setInnerHTML("Running...");
stageRoot.setInnerHTML("");
stageRoot.appendChild(running[0]);
return null;
}
);
onFinished(
(m, t) -> {
final String id = m.getName() + m.getDeclaringClass().hashCode();
final Element stage = Browser.getDocument().getElementById(id);
if (running[0].getParentElement() == stage) {
stage.removeChild(running[0]);
running[0] = null;
}
final Element result = X_Elemental.newDiv();
if (t == JUnit4Executor.SUCCESS) {
result.setInnerHTML("<div style='color:green'>" + m.getName() + " passes!</div>");
} else {
result.setInnerHTML(
JUnit4Executor.debug("<div style='color:red'>" + m.getName() + " fails!</div>", t)
);
}
stage.appendChild(result);
if (update != null) {
update.run();
}
return null;
}
);
}
@Override
public Iterable<Callable<Boolean>> startMethod(Method method) {
stageProvider = new LazyProvider<>(originalProvider);
return super.startMethod(method);
}
public Element getStage() {
final Element stage = stageProvider.get();
if (stage.getParentElement() == null) {
stageRoot.appendChild(stage);
}
return stage;
}
}