summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/simulator/VSMain.java56
-rw-r--r--src/test/java/simulator/VSMainTest.java51
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());
+ }
}