package rmblworx.tools.timey.gui;
import static org.junit.Assert.assertNotNull;
import java.lang.reflect.Field;
import java.util.Locale;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
import javafx.scene.Parent;
import javafx.scene.layout.BorderPane;
import org.loadui.testfx.GuiTest;
/*
* Copyright 2014-2015 Christian Raue
* MIT License http://opensource.org/licenses/mit-license.php
*/
/**
* Basisklasse für JavaFX-basierte GUI-Tests mit {@link https://github.com/TestFX/TestFX}.
* @author Christian Raue {@literal <christian.raue@gmail.com>}
*/
public abstract class JavaFxGuiTest extends GuiTest {
/**
* Sprache für GUI-Tests.
*/
public static final Locale TEST_LOCALE = Locale.GERMAN;
/**
* Ob der Elternknoten von einem Container umhüllt werden soll.
*/
protected static final boolean WRAP_IN_CONTAINER = true;
static {
// Standardsprache für alle GUI-Tests setzen (wichtig z. B. als Fallback auf Travis)
Locale.setDefault(TEST_LOCALE);
}
/**
* Testet die Verfügbarkeit aller per FXML initialisierten Felder.
* Muss explizit durch einen Test in ableitender Klasse aufgerufen werden, um in Integrationstests nicht erneut ausgeführt zu werden.
* @throws IllegalAccessException Fehler bei Zugriff auf das Feld.
*/
@SuppressWarnings("unchecked")
public final void testFxmlInitializedFields() throws IllegalAccessException {
final Object object = getComponentWithFxmlFields();
final Class<Object> klass = (Class<Object>) object.getClass();
for (final Field field : klass.getDeclaredFields()) {
if (field.getDeclaredAnnotationsByType(FXML.class).length > 0) {
field.setAccessible(true);
assertNotNull(String.format("Feld '%s' in Objekt '%s' ist nicht initialisiert.", field.getName(), klass.getName()),
field.get(object));
}
}
}
/**
* @return Objekt mit FXML-Feldern (üblicherweise ein {@link Controller} oder eine eigenständige JavaFX-Komponente).
*/
protected abstract Object getComponentWithFxmlFields();
/**
* Legt einen Container um den Knoten, um die in ihm enthaltenen Steuerelemente während der Ausführung von Tests nicht am
* Bildschirmrand zu platzieren.
* Dient als Workaround für <a href="https://github.com/TestFX/TestFX/issues/136">TestFX/TestFX #136 auf GitHub</a>.
* @param root zu umhüllender Elternknoten
* @return Container als neuer Elternknoten
*/
protected final Parent wrapInContainer(final Parent root) {
final BorderPane container = new BorderPane();
container.setCenter(root);
container.setPadding(new Insets(150, 0, 0, 200));
return container;
}
}