diff options
| -rw-r--r-- | src/main/java/simulator/VSMain.java | 56 | ||||
| -rw-r--r-- | src/test/java/simulator/VSMainTest.java | 51 |
2 files changed, 97 insertions, 10 deletions
diff --git a/src/main/java/simulator/VSMain.java b/src/main/java/simulator/VSMain.java index 3332e85..b3ef317 100644 --- a/src/main/java/simulator/VSMain.java +++ b/src/main/java/simulator/VSMain.java @@ -20,10 +20,47 @@ import prefs.VSPrefs; * @author Paul C. Buetow */ public class VSMain { + interface SplashScreenLauncher { + void show(); + } + + interface StartupDelay { + void pause() throws InterruptedException; + } + interface SimulatorFrameFactory { VSSimulatorFrame create(VSPrefs prefs, Component relativeTo); } + private static final SplashScreenLauncher DEFAULT_SPLASH_LAUNCHER = + new SplashScreenLauncher() { + public void show() { + VSSplashScreen splash = new VSSplashScreen(); + splash.showSplash(); + } + }; + + private static final StartupDelay DEFAULT_STARTUP_DELAY = + new StartupDelay() { + public void pause() throws InterruptedException { + Thread.sleep(3000); + } + }; + + private static final SimulatorFrameFactory DEFAULT_FRAME_FACTORY = + new SimulatorFrameFactory() { + public VSSimulatorFrame create(VSPrefs prefs, + Component relativeTo) { + return new VSSimulatorFrame(prefs, relativeTo); + } + }; + + static volatile SplashScreenLauncher splashScreenLauncher = + DEFAULT_SPLASH_LAUNCHER; + static volatile StartupDelay startupDelay = DEFAULT_STARTUP_DELAY; + static volatile SimulatorFrameFactory simulatorFrameFactory = + DEFAULT_FRAME_FACTORY; + /** The global preferences */ public static VSPrefs prefs; @@ -77,12 +114,7 @@ public class VSMain { Component relativeTo, String startupSimulationFile) { return launchSimulatorFrame(prefs, relativeTo, startupSimulationFile, - new SimulatorFrameFactory() { - public VSSimulatorFrame create(VSPrefs framePrefs, - Component frameRelativeTo) { - return new VSSimulatorFrame(framePrefs, frameRelativeTo); - } - }); + simulatorFrameFactory); } static VSSimulatorFrame launchSimulatorFrame(VSPrefs prefs, @@ -128,15 +160,19 @@ public class VSMain { } } + static void resetTestHooks() { + splashScreenLauncher = DEFAULT_SPLASH_LAUNCHER; + startupDelay = DEFAULT_STARTUP_DELAY; + simulatorFrameFactory = DEFAULT_FRAME_FACTORY; + } + /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - // Show splash screen - VSSplashScreen splash = new VSSplashScreen(); - splash.showSplash(); + splashScreenLauncher.show(); try { UIManager.setLookAndFeel( @@ -151,7 +187,7 @@ public class VSMain { // Wait for splash screen to finish before showing main window try { - Thread.sleep(3000); + startupDelay.pause(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } diff --git a/src/test/java/simulator/VSMainTest.java b/src/test/java/simulator/VSMainTest.java index 42fd3ab..d6cb141 100644 --- a/src/test/java/simulator/VSMainTest.java +++ b/src/test/java/simulator/VSMainTest.java @@ -10,14 +10,21 @@ import static org.mockito.Mockito.mock; import java.awt.Component; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import prefs.VSDefaultPrefs; import prefs.VSPrefs; public class VSMainTest { + @AfterEach + void resetHooks() { + VSMain.resetTestHooks(); + } + @Test void resolveStartupSimulationFileReturnsNullForMissingArgs() { assertNull(VSMain.resolveStartupSimulationFile(null)); @@ -82,4 +89,48 @@ public class VSMainTest { assertSame(frame, launchedFrame); assertEquals("saved-simulations/raft.dat", openedFilename.get()); } + + @Test + void mainRoutesStartupReplayThroughEdt() { + AtomicInteger splashCalls = new AtomicInteger(0); + AtomicInteger delayCalls = new AtomicInteger(0); + AtomicBoolean createdOnEdt = new AtomicBoolean(false); + AtomicBoolean openedOnEdt = new AtomicBoolean(false); + AtomicReference<String> openedFilename = new AtomicReference<String>(); + VSSimulatorFrame frame = mock(VSSimulatorFrame.class); + + VSMain.splashScreenLauncher = new VSMain.SplashScreenLauncher() { + public void show() { + splashCalls.incrementAndGet(); + } + }; + VSMain.startupDelay = new VSMain.StartupDelay() { + public void pause() { + delayCalls.incrementAndGet(); + } + }; + VSMain.simulatorFrameFactory = new VSMain.SimulatorFrameFactory() { + public VSSimulatorFrame create(VSPrefs framePrefs, + Component relativeTo) { + createdOnEdt.set(javax.swing.SwingUtilities + .isEventDispatchThread()); + return frame; + } + }; + + doAnswer(invocation -> { + openedOnEdt.set(javax.swing.SwingUtilities + .isEventDispatchThread()); + openedFilename.set(invocation.getArgument(0, String.class)); + return null; + }).when(frame).openAndStartSimulator("saved-simulations/raft.dat"); + + VSMain.main(new String[] {"saved-simulations/raft.dat"}); + + assertEquals(1, splashCalls.get()); + assertEquals(1, delayCalls.get()); + assertTrue(createdOnEdt.get()); + assertTrue(openedOnEdt.get()); + assertEquals("saved-simulations/raft.dat", openedFilename.get()); + } } |
