Files
2026-06-17 14:00:51 +02:00

334 lines
19 KiB
Java

package jmri.jmrit.dispatcher;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import jmri.*;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.io.TempDir;
import org.netbeans.jemmy.operators.JFrameOperator;
import jmri.configurexml.JmriConfigureXmlException;
import jmri.implementation.SignalSpeedMap;
import jmri.jmrit.logix.WarrantPreferences;
import jmri.util.FileUtil;
import jmri.util.JUnitUtil;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
*
* @author Steve Gigiel 2018
*
* Tests the LoadAtStartUp function for Dispatcher In addition it tests auto
* running of a train.
*/
@jmri.util.junit.annotations.DisabledIfHeadless
public class LoadAtStartUpTest {
// Only one aat at a time
private AutoActiveTrain aat = null;
private static final double TOLERANCE = 0.0001;
private static void increaseWaitForStep() {
JUnitUtil.WAITFOR_DELAY_STEP = 20;
}
@Test
public void testShowAndClose() throws JmriConfigureXmlException, JmriException {
// Assume.assumeFalse("Ignoring intermittent test", Boolean.getBoolean("jmri.skipTestsRequiringSeparateRunning"));
jmri.configurexml.ConfigXmlManager cm = new jmri.configurexml.ConfigXmlManager() {
};
// more time for us less for the waitfor code...
LoadAtStartUpTest.increaseWaitForStep();
WarrantPreferences.getDefault().setShutdown(WarrantPreferences.Shutdown.NO_MERGE);
// load layout file
java.io.File f = new java.io.File("java/test/jmri/jmrit/dispatcher/DispatcherSMLLayout.xml");
Assertions.assertTrue(cm.load(f));
InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager.class).initializeLayoutBlockPaths();
// load dispatcher, with all the correct options
OptionsFile.setDefaultFileName("java/test/jmri/jmrit/dispatcher/TestTrainDispatcherOptions.xml");
DispatcherFrame d = InstanceManager.getDefault(DispatcherFrame.class);
JFrameOperator dw = new JFrameOperator(Bundle.getMessage("TitleDispatcher"));
// signal mast managerls -l
SignalMastManager smm = InstanceManager.getDefault(SignalMastManager.class);
checkAndSetSpeeds();
BlockManager bm = InstanceManager.getDefault(BlockManager.class);
for (Block b : bm.getNamedBeanSet()) {
b.setState(Block.UNOCCUPIED);
}
// place train on layout
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Platform"),Block.OCCUPIED);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("West Platform Switch"),Block.OCCUPIED); // set blocker
// and load. only one of 2 trains will load
d.loadAtStartup();
assertThat(d.getActiveTrainsList().size()).withFailMessage("Train Loaded").isEqualTo(1);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("West Platform Switch"),Block.UNOCCUPIED); // release blocker
// trains loads and runs, 4 allocated sections, the one we are in and 3 ahead.
JUnitUtil.waitFor(() -> {
return d.getAllocatedSectionsList().size() == 4;
}, "Allocate Sections ahead");
assertThat(d.getAllocatedSectionsList()).withFailMessage("Allocated sections 4").hasSize(4);
// get autoactivetrain object
ActiveTrain at = d.getActiveTrainsList().get(0);
aat = at.getAutoActiveTrain();
JUnitUtil.waitFor(() -> {
return "Clear".equals(smm.provideSignalMast("West End Div").getAspect());
}, "Signal West End Div now green");
// check signals and speed
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("1 West End Div Signal Green").isEqualTo("Clear");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("1 West To South Green").isEqualTo("Clear");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("1 South To East Signal Green").isEqualTo("Approach");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("1 East End Throat Signal Green").isEqualTo("Stop");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE ); }, "Exit South Platform Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("West Platform Switch"),Block.OCCUPIED);
JUnitUtil.waitFor(() -> {
return "Stop".equals(smm.provideSignalMast("West End Div").getAspect());
}, "Signal Just passed stop");
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("2 West End Div Signal Stop").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("2 West To South Green").isEqualTo("Clear");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("2 South To East Signal Green").isEqualTo("Approach");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("2 East End Throat Signal Green").isEqualTo("Stop");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE ); }, "West Platform Switch Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("West Block"),Block.OCCUPIED);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Platform"),Block.UNOCCUPIED);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("West Platform Switch"),Block.UNOCCUPIED);
JUnitUtil.waitFor(() -> {
return "Clear".equals(smm.provideSignalMast("South To East").getAspect());
}, "Signal South To East now Clear");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("3 West To South Green").isEqualTo("Clear");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("3 South To East Signal Green").isEqualTo("Clear");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("3 East End Throat Signal Approach").isEqualTo("Approach");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE ); }, "South To East Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Block"),Block.OCCUPIED);
JUnitUtil.waitFor(() -> {
return "Stop".equals(smm.provideSignalMast("West To South").getAspect());
}, "Signal Just passed West To South now stop");
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("4 West End Div Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("4 West To South Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("4 South To East Signal Green").isEqualTo("Clear");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("4 East End Throat Signal Green").isEqualTo("Approach");
String strSigSpeed = (String) smm.provideSignalMast("South To East").getSignalSystem().getProperty(smm.provideSignalMast("South To East").getAspect(), "speed");
assertThat(InstanceManager.getDefault(SignalSpeedMap.class).getSpeed(strSigSpeed)/100).isEqualTo(speedNormal);
//The signal head indicates 1.0f but train is limited to a max of 0.6f
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - 0.6f ) < TOLERANCE ); }, "West To South Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("West Block"),Block.UNOCCUPIED);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Block"),Block.OCCUPIED);
JUnitUtil.waitFor(() -> {
return "Stop".equals(smm.provideSignalMast("South To East").getAspect());
}, "Signal Just passed south to east now stop");
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("5 West End Div Signal Green").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("5 West To South Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("5 South To East Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("5 East End Throat Signal yellow").isEqualTo("Approach");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE ); }, "South To East Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Block"),Block.UNOCCUPIED);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Platform Switch"),Block.OCCUPIED);
JUnitUtil.waitFor(() -> {
return "Stop".equals(smm.provideSignalMast("East End Throat").getAspect());
}, "Signal Just passed east end throat now stop");
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("6 West End Div Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("6 West To South Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("6 South To East Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("6 East End Throat Signal Red").isEqualTo("Stop");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE ); }, "East Platform Switch Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Platform Switch"),Block.OCCUPIED);
// No change
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("7 West End Div Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("7 West To South Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("7 South To East Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("7 East End Throat Signal Red").isEqualTo("Stop");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE ); }, "East Platform Switch Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Platform"),Block.OCCUPIED);
// signals no change, speed changes
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("8 West End Div Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("8 West To South Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("8 South To East Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("8 East End Throat Signal Red").isEqualTo("Stop");
JUnitUtil.waitFor(() -> { return (Math.abs(aat.getTargetSpeed() - speedRestrictedSlow ) < TOLERANCE ); }, "Speed is correct");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Block"),Block.UNOCCUPIED);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Platform Switch"),Block.UNOCCUPIED);
// signals no change, speed changes to stop
assertThat(smm.provideSignalMast("West End Div").getAspect()).withFailMessage("9 West End Div Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("West To South").getAspect()).withFailMessage("9 West To South Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("South To East").getAspect()).withFailMessage("9 South To East Signal Red").isEqualTo("Stop");
assertThat(smm.provideSignalMast("East End Throat").getAspect()).withFailMessage("9 East End Throat Signal Red").isEqualTo("Stop");
// train slows to stop
JUnitUtil.waitFor(() -> {
return (Math.abs(aat.getTargetSpeed() ) < TOLERANCE );
}, "Signal Just passed east end throat now stop");
JUnitUtil.waitFor(2200);
// check for next train note dcc name is original transit name has changed
assertEquals( "1000 / SouthPlatFormReturnToSouthCC",
d.getActiveTrainsList().get(0).getActiveTrainName(), "Next Train Load");
JUnitUtil.waitFor(2000);
// its a new train.
at = d.getActiveTrainsList().get(0);
aat = at.getAutoActiveTrain();
JUnitUtil.waitFor(() -> {
return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE );
}, "Started to move");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Platform Switch"),Block.OCCUPIED);
JUnitUtil.waitFor(50);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Block"),Block.OCCUPIED);
JUnitUtil.waitFor(50);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Platform"),Block.UNOCCUPIED);
JUnitUtil.waitFor(() -> {
return (Math.abs(aat.getTargetSpeed() - speedRestricted ) < TOLERANCE );
}, "Continuing speed was "+ aat.getTargetSpeed() + " not " + speedRestricted);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("South Block"),Block.OCCUPIED);
JUnitUtil.waitFor(() -> {
return (Math.abs(aat.getTargetSpeed() - speedRestrictedSlow ) < TOLERANCE );
}, "Prepare to stop");
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Platform Switch"),Block.UNOCCUPIED);
JUnitUtil.waitFor(50);
JUnitUtil.setBeanStateAndWait(bm.provideBlock("East Block"),Block.UNOCCUPIED);
// train slows to stop
JUnitUtil.waitFor(() -> {
return (Math.abs(aat.getTargetSpeed() ) < TOLERANCE );
}, "Did not Stop " + at.getActiveTrainName() + " with throttle SpeedSetting " + aat.getTargetSpeed());
//terminates at end
// wait for cleanup to finish
JUnitUtil.waitFor(200);
assertThat((d.getActiveTrainsList().isEmpty())).withFailMessage("All trains terminated").isTrue();
JFrameOperator aw = new JFrameOperator("AutoTrains");
aw.requestClose();
aw.waitClosed();
dw.requestClose();
dw.waitClosed();
JFrameOperator le = new JFrameOperator("Test Layout");
JUnitUtil.dispose(le.getWindow());
le.waitClosed();
// cleanup window
JUnitUtil.dispose(d);
InstanceManager.getDefault(jmri.SignalMastManager.class).dispose();
InstanceManager.getDefault(jmri.SignalMastLogicManager.class).dispose();
}
private float speedStopping = 0.0f;
private float speedSlow = 0.0f;
private float speedRestrictedSlow = 0.0f;
private float speedRestricted = 0.0f;
private float speedMedium = 0.0f;
private float speedNormal = 0.0f;
private void checkAndSetSpeeds() {
// Check we have got the right signal map
speedStopping = InstanceManager.getDefault(SignalSpeedMap.class)
.getSpeed(InstanceManager.getDefault(DispatcherFrame.class).getStoppingSpeedName())/100.0f;
assertEquals(0.1f, speedStopping, TOLERANCE );
speedNormal = InstanceManager.getDefault(SignalSpeedMap.class)
.getSpeed("Normal")/100.0f;
assertEquals(1.0f, speedNormal, TOLERANCE );
speedMedium = InstanceManager.getDefault(SignalSpeedMap.class)
.getSpeed("Medium")/100.0f;
assertEquals(0.5f, speedMedium, TOLERANCE );
speedSlow = InstanceManager.getDefault(SignalSpeedMap.class)
.getSpeed("Slow")/100.0f;
assertEquals(0.31f, speedSlow, TOLERANCE );
speedRestricted = InstanceManager.getDefault(SignalSpeedMap.class)
.getSpeed("Restricted")/100.0f;
assertEquals(0.35f, speedRestricted, TOLERANCE );
speedRestrictedSlow = InstanceManager.getDefault(SignalSpeedMap.class)
.getSpeed("RestrictedSlow")/100.0f;
assertEquals(0.1f, speedRestrictedSlow, TOLERANCE);
assertEquals(SignalSpeedMap.PERCENT_THROTTLE, InstanceManager.getDefault(SignalSpeedMap.class)
.getInterpretation(), TOLERANCE);
}
// Where in user space the "signals" file tree should live
private File outBaseTrainInfo = null;
private File outBaseSignal = null;
// the file we create that we will delete
private Path outPathTrainInfo1 = null;
private Path outPathTrainInfo2 = null;
private Path outPathTrainInfo3 = null;
private Path outPathWarrentPreferences = null;
@BeforeEach
public void setUp(@TempDir File tempDir) throws IOException {
JUnitUtil.setUp();
JUnitUtil.resetProfileManager( new jmri.profile.NullProfile( tempDir));
JUnitUtil.initRosterConfigManager();
JUnitUtil.initDebugThrottleManager();
// set up users files in temp tst area
outBaseTrainInfo = new File(FileUtil.getUserFilesPath(), "dispatcher/traininfo");
outBaseSignal = new File(FileUtil.getUserFilesPath(), "signal");
FileUtil.createDirectory(outBaseTrainInfo);
{
Path inPath = new File(new File(FileUtil.getProgramPath(), "java/test/jmri/jmrit/dispatcher/traininfo"),
"TestTrainCW.xml").toPath();
outPathTrainInfo1 = new File(outBaseTrainInfo, "TestTrainCW.xml").toPath();
Files.copy(inPath, outPathTrainInfo1, StandardCopyOption.REPLACE_EXISTING);
}
{
Path inPath = new File(new File(FileUtil.getProgramPath(), "java/test/jmri/jmrit/dispatcher/traininfo"),
"TestTrainCW_Return.xml").toPath();
outPathTrainInfo3 = new File(outBaseTrainInfo, "TestTrainCW_Return.xml").toPath();
Files.copy(inPath, outPathTrainInfo3, StandardCopyOption.REPLACE_EXISTING);
}
{
Path inPath = new File(new File(FileUtil.getProgramPath(), "java/test/jmri/jmrit/dispatcher/traininfo"),
"TestTrain.xml").toPath();
outPathTrainInfo2 = new File(outBaseTrainInfo, "TestTrain.xml").toPath();
Files.copy(inPath, outPathTrainInfo2, StandardCopyOption.REPLACE_EXISTING);
}
FileUtil.createDirectory(outBaseSignal);
{
Path inPath = new File(new File(FileUtil.getProgramPath(), "java/test/jmri/jmrit/dispatcher/signal"),
"WarrantPreferences.xml").toPath();
outPathWarrentPreferences = new File(outBaseSignal, "WarrantPreferences.xml").toPath();
Files.copy(inPath, outPathWarrentPreferences, StandardCopyOption.REPLACE_EXISTING);
}
}
@AfterEach
public void tearDown() {
JUnitUtil.resetInstanceManager();
JUnitUtil.clearShutDownManager();
JUnitUtil.tearDown();
}
}