package jmri.jmrit.display; import static org.junit.jupiter.api.Assertions.assertNotNull; import jmri.ConfigureManager; import jmri.InstanceManager; import jmri.NamedBeanHandleManager; import jmri.Sensor; import jmri.SignalMast; import jmri.Turnout; import jmri.util.JUnitUtil; import jmri.util.junit.annotations.DisabledIfHeadless; import org.junit.jupiter.api.*; /** * Test signal system via a specific layout file * * This is in jmri.jmrit.display instead of jmri.implementation because the * files it loads display the signals for debugging purposes; if their panels * were editted out, jmri.implementation would be a better location * * @author Bob Jacobsen Copyright 2016 * @since 4.3.2 */ public class SignalSystemTest { @Test @DisabledIfHeadless public void testLoadSimplePanelOBlocksDB1969() throws jmri.JmriException { // load file Assertions.assertTrue(InstanceManager.getDefault(ConfigureManager.class) .load(new java.io.File("java/test/jmri/jmrit/display/valid/SimplePanel_OBlocks-DB1969.xml"))); InstanceManager.getDefault(jmri.LogixManager.class).activateAllLogixs(); InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager.class).initializeLayoutBlockPaths(); // check aspects checkAspect("IF$vsm:DB-HV-1969:block_distant($0002)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0003)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0009)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0010)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0004)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0007)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0011)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0005)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0006)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0008)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:shunting_dwarf($0012)", "Sh0"); Turnout it201 = InstanceManager.turnoutManagerInstance().getTurnout("IT201"); assertNotNull(it201); it201.setCommandedState(Turnout.CLOSED); checkAspect("IF$vsm:DB-HV-1969:block_distant($0002)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0003)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0009)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0010)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0004)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0007)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0011)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0005)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0006)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0008)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:shunting_dwarf($0012)", "Sh0"); Sensor is101 = InstanceManager.sensorManagerInstance().getSensor("IS101"); assertNotNull(is101); is101.setState(Sensor.ACTIVE); checkAspect("IF$vsm:DB-HV-1969:block_distant($0002)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0003)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0009)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0010)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0004)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0007)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0011)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0005)", "Hp00"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0006)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0008)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:shunting_dwarf($0012)", "Sh0"); Sensor is102 = InstanceManager.sensorManagerInstance().getSensor("IS102"); assertNotNull(is102); is102.setState(Sensor.ACTIVE); checkAspect("IF$vsm:DB-HV-1969:block_distant($0002)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0003)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0009)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:block_distant($0010)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0004)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0007)", "Hp1+Vr1"); checkAspect("IF$vsm:DB-HV-1969:entry_distant($0011)", "Hp0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0005)", "Hp00"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0006)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:exit_distant($0008)", "Hp1+Vr0"); checkAspect("IF$vsm:DB-HV-1969:shunting_dwarf($0012)", "Sh0"); EditorFrameOperator efo = new EditorFrameOperator("DB1969 Control Panel Editor"); efo.closeFrameWithConfirmations(); EditorFrameOperator.clearEditorFrameOperatorThreads(); } @Test @DisabledIfHeadless public void testLoadAA1UPtest() throws jmri.JmriException { // load file InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager.class).setStabilisedSensor("IS_ROUTING_DONE"); Assertions.assertTrue(InstanceManager.getDefault(ConfigureManager.class) .load(new java.io.File("java/test/jmri/jmrit/display/valid/AA1UPtest.xml"))); InstanceManager.getDefault(jmri.LogixManager.class).activateAllLogixs(); InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager.class).initializeLayoutBlockPaths(); JUnitUtil.waitFor(() -> { return InstanceManager.sensorManagerInstance().provideSensor("IS_ROUTING_DONE").getKnownState() == jmri.Sensor.ACTIVE; }, "LayoutEditor stabilized sensor went ACTIVE"); // check aspects checkAspect("IF$vsm:BNSF-1996:SE-1A($0152)", "Stop"); // not on visual panel checkAspect("IF$vsm:UP-2008:SL-3A($0170)", "Advance Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0171)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0172)", "Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0173)", "Restricting"); checkAspect("IF$vsm:UP-2008:SL-3A($0174)", "Advance Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0176)", "Clear"); checkAspect("IF$vsm:UP-2008:SL-3A($0178)", "Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0179)", "Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0181)", "Clear"); checkAspect("IF$vsm:UP-2008:SL-3A($0183)", "Clear"); checkAspect("IF$vsm:UP-2008:SL-3A($0185)", "Advance Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0186)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0230)", "Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0231)", "Advance Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0232)", "Clear"); checkAspect("IF$vsm:UP-2008:SL-3A($0233)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0234)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0235)", "Restricting"); checkAspect("IF$vsm:UP-2008:SL-3A($0236)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0237)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0238)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0239)", "Clear"); checkAspect("IF$vsm:UP-2008:SL-3A($0240)", "Clear"); checkAspect("IF$vsm:UP-2008:SL-3A($0241)", "Restricting"); checkAspect("IF$vsm:UP-2008:SL-3A($0242)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0243)", "Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0244)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0245)", "Approach"); checkAspect("IF$vsm:UP-2008:SL-3A($0246)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0247)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3A($0248)", "Stop"); checkAspect("IF$vsm:UP-2008:SL-3L2($0249)", "Approach Restricting"); checkAspect("IF$vsm:UP-2008:SL-3L2($0250)", "Approach"); final int numErrorMessages = 19; // clean up messages from file for (int i=0; i < numErrorMessages; i++) { jmri.util.JUnitAppender.assertErrorMessageStartsWith("No facing block found for source mast IF$vsm:BNSF-1996:SL-"); } EditorFrameOperator efo = new EditorFrameOperator("AA1UPtest Layout"); efo.closeFrameWithConfirmations(); EditorFrameOperator.clearEditorFrameOperatorThreads(); } void checkAspect(String mastName, String aspect) { SignalMast mast = InstanceManager.getDefault(jmri.SignalMastManager.class).getSignalMast(mastName); assertNotNull(mast, "Mast " + mastName + " not found"); // wait present or error JUnitUtil.waitFor(() -> { return aspect.equals(mast.getAspect()); }, () -> "mast " + mastName + "currently showing \"" + mast.getAspect() + "\", expected aspect \"" + aspect + "\"," ); } @BeforeEach public void setUp() { JUnitUtil.setUp(); JUnitUtil.resetProfileManager(); JUnitUtil.initConfigureManager(); InstanceManager.store(new NamedBeanHandleManager(), NamedBeanHandleManager.class); JUnitUtil.initInternalTurnoutManager(); JUnitUtil.initInternalLightManager(); JUnitUtil.initInternalSensorManager(); JUnitUtil.initMemoryManager(); } @AfterEach public void tearDown() { JUnitUtil.deregisterBlockManagerShutdownTask(); JUnitUtil.tearDown(); } }