package rmblworx.tools.timey.gui;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import java.io.IOException;
import java.util.ResourceBundle;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import org.loadui.testfx.utils.FXTestUtils;
import rmblworx.tools.timey.ITimey;
/*
* Copyright 2014-2015 Christian Raue
* MIT License http://opensource.org/licenses/mit-license.php
*/
/**
* Basisklasse für FXML-basierte GUI-Tests.
* @author Christian Raue {@literal <christian.raue@gmail.com>}
*/
public abstract class FxmlGuiTest extends JavaFxGuiTest {
/**
* Max. Zeit (in ms), die auf das Eintreten eines Ereignisses gewartet werden soll.
*/
protected static final int WAIT_FOR_EVENT = 5000;
/**
* Mit der GUI verbundener Controller.
*/
private Controller controller;
/**
* @return Name der FXML-Datei zum Laden der GUI
*/
protected abstract String getFxmlFilename();
/**
* Lädt die GUI aus der FXML-Datei.
* @return Elternknoten der GUI-Elemente
*/
@Override
protected final Parent getRootNode() {
final GuiHelper guiHelper = new GuiHelper();
guiHelper.setFacade(setUpFacade());
guiHelper.getThreadHelper().setTrackThreads(true); // Threads für Tests erfassen
final ResourceBundle i18n = guiHelper.getResourceBundle(TEST_LOCALE);
try {
final FXMLLoader loader = new FXMLLoader(getClass().getResource(getFxmlFilename()), i18n);
final Parent root = (Parent) loader.load();
controller = loader.getController();
controller.setGuiHelper(guiHelper);
controllerLoaded();
return WRAP_IN_CONTAINER ? wrapInContainer(root) : root;
} catch (final IOException e) {
e.printStackTrace();
return null;
}
}
/**
* Die Standardimplementierung liefert eine gemockte Fassade.
* Kann überschrieben werden, um z. B. für Integrationstests die echte Fassade zu nutzen.
* @return für Tests zu verwendende Fassade
*/
protected ITimey setUpFacade() {
return mock(ITimey.class);
}
/**
* Wird aufgerufen sobald der Controller geladen wurde.
*/
protected void controllerLoaded() {
}
/**
* @return mit der GUI verbundener Controller
*/
protected final Controller getController() {
return controller;
}
/**
* {@inheritDoc}
*/
@Override
protected final Object getComponentWithFxmlFields() {
return controller;
}
/**
* Wartet auf Beendigung aller erfassten Threads. Im Fall einer Exception schlägt der Test fehl.
*/
protected final void waitForThreads() {
try {
controller.getGuiHelper().getThreadHelper().waitForThreads();
} catch (final InterruptedException e) {
fail(e.getLocalizedMessage());
}
// zusätzlich auf Abarbeitung aller JavaFX-Ereignisse warten, die evtl. durch die Threads ausgelöst wurden
FXTestUtils.awaitEvents();
}
}