package rmblworx.tools.timey.gui; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.ToggleButton; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.loadui.testfx.categories.TestFX; import rmblworx.tools.timey.ITimey; import rmblworx.tools.timey.vo.TimeDescriptor; /* * Copyright 2014-2015 Christian Raue * MIT License http://opensource.org/licenses/mit-license.php */ /** * GUI-Tests für die Stoppuhr. * @author Christian Raue {@literal <christian.raue@gmail.com>} */ @Category(TestFX.class) public class StopwatchControllerTest extends FxmlGuiControllerTest { /** * Container für Elemente. */ private Scene scene; // GUI-Elemente private Label stopwatchTimeLabel; private Button stopwatchStartButton; private Button stopwatchStopButton; private ToggleButton stopwatchSplitTimeButton; private Button stopwatchResetButton; /** * {@inheritDoc} */ @Override protected final String getFxmlFilename() { return "Stopwatch.fxml"; } @Before public final void setUp() { scene = stage.getScene(); stopwatchTimeLabel = (Label) scene.lookup("#stopwatchTimeLabel"); stopwatchStartButton = (Button) scene.lookup("#stopwatchStartButton"); stopwatchStopButton = (Button) scene.lookup("#stopwatchStopButton"); stopwatchSplitTimeButton = (ToggleButton) scene.lookup("#stopwatchSplitTimeButton"); stopwatchResetButton = (Button) scene.lookup("#stopwatchResetButton"); } @Test public final void testInitializedFields() throws IllegalAccessException { super.testFxmlInitializedFields(); } /** * Testet den Zustand der Schaltflächen je nach Zustand der Stoppuhr. */ @Test public final void testStopwatchButtonStates() { final ITimey facade = getController().getGuiHelper().getFacade(); // Zustand der Schaltflächen testen assertTrue(stopwatchStartButton.isVisible()); assertFalse(stopwatchStartButton.isDisabled()); assertFalse(stopwatchStopButton.isVisible()); assertFalse(stopwatchStopButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertTrue(stopwatchSplitTimeButton.isDisabled()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); // Stoppuhr starten click(stopwatchStartButton); verify(facade, timeout(WAIT_FOR_EVENT)).startStopwatch(); // Zustand der Schaltflächen testen assertFalse(stopwatchStartButton.isVisible()); assertFalse(stopwatchStartButton.isDisabled()); assertTrue(stopwatchStopButton.isVisible()); assertFalse(stopwatchStopButton.isDisabled()); assertTrue(stopwatchStopButton.isFocused()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertFalse(stopwatchSplitTimeButton.isDisabled()); assertFalse(stopwatchSplitTimeButton.isSelected()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); // Zwischenzeit aktivieren click(stopwatchSplitTimeButton); verify(facade, timeout(WAIT_FOR_EVENT)).toggleTimeModeInStopwatch(); // Zustand der Schaltflächen testen assertFalse(stopwatchStartButton.isVisible()); assertFalse(stopwatchStartButton.isDisabled()); assertTrue(stopwatchStopButton.isVisible()); assertTrue(stopwatchStopButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertFalse(stopwatchSplitTimeButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isSelected()); assertTrue(stopwatchSplitTimeButton.isFocused()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); // Zwischenzeit deaktivieren click(stopwatchSplitTimeButton); verify(facade, timeout(WAIT_FOR_EVENT).times(2)).toggleTimeModeInStopwatch(); // zweiter Aufruf // Zustand der Schaltflächen testen assertFalse(stopwatchStartButton.isVisible()); assertFalse(stopwatchStartButton.isDisabled()); assertTrue(stopwatchStopButton.isVisible()); assertFalse(stopwatchStopButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertFalse(stopwatchSplitTimeButton.isDisabled()); assertFalse(stopwatchSplitTimeButton.isSelected()); assertTrue(stopwatchSplitTimeButton.isFocused()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); // Stoppuhr stoppen click(stopwatchStopButton); verify(facade, timeout(WAIT_FOR_EVENT)).stopStopwatch(); // Zustand der Schaltflächen testen assertTrue(stopwatchStartButton.isVisible()); assertFalse(stopwatchStartButton.isDisabled()); assertTrue(stopwatchStartButton.isFocused()); assertFalse(stopwatchStopButton.isVisible()); assertFalse(stopwatchStopButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertTrue(stopwatchSplitTimeButton.isDisabled()); assertFalse(stopwatchSplitTimeButton.isSelected()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); // Stoppuhr zurücksetzen click(stopwatchResetButton); verify(facade, timeout(WAIT_FOR_EVENT)).resetStopwatch(); // Zustand der Schaltflächen testen assertTrue(stopwatchStartButton.isVisible()); assertFalse(stopwatchStartButton.isDisabled()); assertTrue(stopwatchStartButton.isFocused()); assertFalse(stopwatchStopButton.isVisible()); assertFalse(stopwatchStopButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertTrue(stopwatchSplitTimeButton.isDisabled()); assertFalse(stopwatchSplitTimeButton.isSelected()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); } /** * Testet die Darstellung der Zeit mit und ohne Millisekunden-Anteil. */ @Test public final void testStopwatchTimeLabelMilliseconds() { final CheckBox stopwatchShowMillisecondsCheckbox = (CheckBox) scene.lookup("#stopwatchShowMillisecondsCheckbox"); // Ausgangszustand assertTrue(stopwatchShowMillisecondsCheckbox.isSelected()); assertEquals("00:00:00.000", stopwatchTimeLabel.getText()); // Millisekunden-Anteil ausblenden click(stopwatchShowMillisecondsCheckbox); assertEquals("00:00:00", stopwatchTimeLabel.getText()); // Millisekunden-Anteil wieder einblenden click(stopwatchShowMillisecondsCheckbox); assertEquals("00:00:00.000", stopwatchTimeLabel.getText()); } /** * Testet die Anzeige der gemessenen Zeit. */ @Test public final void testStopwatchStartStopTimeMeasured() { final ITimey facade = getController().getGuiHelper().getFacade(); // Stoppuhr starten when(facade.startStopwatch()).thenReturn(new TimeDescriptor(50)); click(stopwatchStartButton); // Stoppuhr stoppen click(stopwatchStopButton); // gemessene Zeit muss angezeigt sein waitForThreads(); assertEquals("00:00:00.050", stopwatchTimeLabel.getText()); // Stoppuhr wieder starten, um zweite (additive) Messung zu berücksichtigen when(facade.startStopwatch()).thenReturn(new TimeDescriptor(200)); click(stopwatchStartButton); // Stoppuhr wieder stoppen click(stopwatchStopButton); // gemessene Zeit muss angezeigt sein waitForThreads(); assertEquals("00:00:00.200", stopwatchTimeLabel.getText()); } /** * Testet die Funktionalität der Zurücksetzen-Schaltfläche. */ @Test public final void testStopwatchReset() { final ITimey facade = getController().getGuiHelper().getFacade(); // Stoppuhr zurücksetzen, ohne sie vorher gestartet zu haben click(stopwatchResetButton); verify(facade, timeout(WAIT_FOR_EVENT)).resetStopwatch(); // angezeigte Zeit muss zurückgesetzt sein assertEquals("00:00:00.000", stopwatchTimeLabel.getText()); // Stoppuhr starten when(facade.startStopwatch()).thenReturn(new TimeDescriptor(9876)); click(stopwatchStartButton); // gemessene Zeit muss angezeigt sein assertEquals("00:00:09.876", stopwatchTimeLabel.getText()); // Stoppuhr stoppen click(stopwatchStopButton); // Stoppuhr zurücksetzen click(stopwatchResetButton); // angezeigte Zeit muss zurückgesetzt sein waitForThreads(); assertEquals("00:00:00.000", stopwatchTimeLabel.getText()); } /** * Testet die Funktionalität der Zurücksetzen-Schaltfläche während die Stoppuhr läuft. */ @Test public final void testStopwatchResetWhileRunning() { final ITimey facade = getController().getGuiHelper().getFacade(); // Stoppuhr starten when(facade.startStopwatch()).thenReturn(new TimeDescriptor(50)); click(stopwatchStartButton); verify(facade, timeout(WAIT_FOR_EVENT)).startStopwatch(); // Stoppuhr zurücksetzen click(stopwatchResetButton); verify(facade, timeout(WAIT_FOR_EVENT)).resetStopwatch(); // gemessene Zeit muss angezeigt sein assertEquals("00:00:00.050", stopwatchTimeLabel.getText()); // Stoppuhr stoppen click(stopwatchStopButton); verify(facade, timeout(WAIT_FOR_EVENT)).stopStopwatch(); } /** * Testet die Funktionalität der Zurücksetzen-Schaltfläche während Zwischenzeit aktiv ist. */ @Test public final void testStopwatchResetWhileRunningWithSplitTime() { final ITimey facade = getController().getGuiHelper().getFacade(); // Stoppuhr starten click(stopwatchStartButton); verify(facade, timeout(WAIT_FOR_EVENT)).startStopwatch(); // Zwischenzeit aktivieren click(stopwatchSplitTimeButton); verify(facade, timeout(WAIT_FOR_EVENT)).toggleTimeModeInStopwatch(); // Stoppuhr zurücksetzen click(stopwatchResetButton); verify(facade, timeout(WAIT_FOR_EVENT)).resetStopwatch(); // Zustand der Schaltflächen testen assertTrue(stopwatchStopButton.isVisible()); assertFalse(stopwatchStopButton.isDisabled()); assertTrue(stopwatchSplitTimeButton.isVisible()); assertFalse(stopwatchSplitTimeButton.isDisabled()); assertFalse(stopwatchSplitTimeButton.isSelected()); assertTrue(stopwatchResetButton.isVisible()); assertFalse(stopwatchResetButton.isDisabled()); // Stoppuhr stoppen click(stopwatchStopButton); verify(facade, timeout(WAIT_FOR_EVENT)).stopStopwatch(); } }