package xapi.gwt.junit.gui;
import elemental.client.Browser;
import elemental.dom.Element;
import elemental.dom.Node;
import xapi.elemental.X_Elemental;
import xapi.gwt.junit.api.JUnitExecution;
import xapi.gwt.junit.impl.JUnit4Executor;
import javax.inject.Provider;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.function.BooleanSupplier;
/**
* Created by james on 18/10/15.
*/
public class JUnitGuiController extends JUnit4Executor {
private Object currentTest; // The current test instance.
private Provider<Element> stageProvider;
private final Runnable updater;
public JUnitGuiController(Runnable updater) {this.updater = updater;}
public Element getStage() {
if (execution instanceof JUnitGuiExecution) {
return ((JUnitGuiExecution)execution).getStage();
}
assert stageProvider != null : "Call .onTestState() before calling .getStage() in "+getClass()+" "+this;
return stageProvider.get();
}
/**
* Called whenever a test starts.
*
* @return false to skip the test.
*/
protected boolean onTestClassStart(Provider<Element> stageProvider, Object inst){
this.stageProvider = stageProvider;
currentTest = inst;
findAndSetField(JUnitGuiController.class::isAssignableFrom, this, inst, false);
return true;
}
@Override
protected JUnitExecution newExecution() {
final JUnitGuiExecution exe = new JUnitGuiExecution(stageProvider, updater);
return exe;
}
public void setFullscreen() {
setFullscreen(null);
}
public void setFullscreen(BooleanSupplier delayFinish) {
final Element stage = getStage();
final Element parent = stage.getParentElement();
final Node after = stage.getNextSibling();
X_Elemental.addClassName(stage, "fullscreen");
String oldWidth = stage.getStyle().getWidth();
String oldHeight = stage.getStyle().getHeight();
stage.getStyle().setWidth(Browser.getWindow().getInnerWidth()+"px");
stage.getStyle().setHeight(Browser.getWindow().getInnerHeight()+"px");
Browser.getDocument().getBody().appendChild(stage);
execution.onBeforeFinished(delayFinish);
execution.onFinished((method, error) ->{
if (after == null) {
parent.appendChild(stage);
} else {
parent.insertBefore(stage, after);
}
if (oldWidth == null) {
stage.getStyle().clearWidth();
} else {
stage.getStyle().setWidth(oldWidth);
}
if (oldHeight == null) {
stage.getStyle().clearHeight();
} else {
stage.getStyle().setHeight(oldHeight);
}
X_Elemental.removeClassName(stage, "fullscreen");
return null;
});
}
public void onTestClassFinish(Object inst, Map<Method, Throwable> fin) {
}
}