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

195 lines
8.4 KiB
Java

package jmri.implementation;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.util.Calendar;
import java.util.GregorianCalendar;
import jmri.*;
import jmri.configurexml.JmriConfigureXmlException;
import jmri.util.JUnitUtil;
import jmri.util.ThreadingUtil;
import org.junit.jupiter.api.*;
/**
* Tests Logix in detail by loading a set of
* configurations from a file (to simplify setup),
* then changing inputs and checking
* outputs.
* <p>
* Because the load is slow, it's done once
* for this entire test class.
*
* @author Bob Jacobsen Copyright (C) 2018
*/
public class ActiveLogixTest {
private void setSensor(Sensor s, int state) {
try {
s.setState(state);
} catch (JmriException e) {
}
}
@Test
public void testTurnoutDrivesSensor() {
Turnout turnout = InstanceManager.getDefault(TurnoutManager.class).getTurnout("IT101");
assertNotNull(turnout);
Sensor sensor = InstanceManager.getDefault(SensorManager.class).getSensor("IS101");
assertNotNull(sensor);
ThreadingUtil.runOnLayout(()->{turnout.setCommandedState(Turnout.THROWN);});
JUnitUtil.waitFor(()->{return sensor.getState()==Sensor.ACTIVE;},"sensor ACTIVE");
ThreadingUtil.runOnLayout(()->{turnout.setCommandedState(Turnout.CLOSED);});
JUnitUtil.waitFor(()->{return sensor.getState()==Sensor.INACTIVE;},"sensor INACTIVE");
ThreadingUtil.runOnLayout(()->{turnout.setCommandedState(Turnout.THROWN);});
JUnitUtil.waitFor(()->{return sensor.getState()==Sensor.ACTIVE;},"sensor ACTIVE");
}
@Test
public void testSensorLogicDrivesTurnout() {
Turnout turnout = InstanceManager.getDefault(TurnoutManager.class).getTurnout("IT201");
assertNotNull(turnout);
Sensor sensor1 = InstanceManager.getDefault(SensorManager.class).getSensor("IS201");
assertNotNull(sensor1);
Sensor sensor2 = InstanceManager.getDefault(SensorManager.class).getSensor("IS202");
assertNotNull(sensor2);
Sensor sensor3 = InstanceManager.getDefault(SensorManager.class).getSensor("IS203");
assertNotNull(sensor3);
Sensor sensor4 = InstanceManager.getDefault(SensorManager.class).getSensor("IS204");
assertNotNull(sensor4);
Sensor sensor5 = InstanceManager.getDefault(SensorManager.class).getSensor("IS205");
assertNotNull(sensor5);
Sensor sensor6 = InstanceManager.getDefault(SensorManager.class).getSensor("IS206");
assertNotNull(sensor6);
// start all inactive
ThreadingUtil.runOnLayout(()->{setSensor(sensor1, Sensor.INACTIVE);});
ThreadingUtil.runOnLayout(()->{setSensor(sensor2, Sensor.INACTIVE);});
ThreadingUtil.runOnLayout(()->{setSensor(sensor3, Sensor.INACTIVE);});
ThreadingUtil.runOnLayout(()->{setSensor(sensor4, Sensor.INACTIVE);});
ThreadingUtil.runOnLayout(()->{setSensor(sensor5, Sensor.INACTIVE);});
ThreadingUtil.runOnLayout(()->{setSensor(sensor6, Sensor.INACTIVE);});
JUnitUtil.waitFor(()->{return turnout.getCommandedState()==Turnout.CLOSED;},"turnout CLOSED");
ThreadingUtil.runOnLayout(()->{setSensor(sensor1, Sensor.ACTIVE);});
ThreadingUtil.runOnLayout(()->{setSensor(sensor2, Sensor.ACTIVE);});
JUnitUtil.waitFor(()->{return turnout.getCommandedState()==Turnout.THROWN;},"turnout THROWN");
ThreadingUtil.runOnLayout(()->{setSensor(sensor2, Sensor.INACTIVE);});
JUnitUtil.waitFor(()->{return turnout.getCommandedState()==Turnout.CLOSED;},"turnout CLOSED");
}
@Test
public void testCheckFastClock() throws TimebaseRateException {
Turnout turnout1 = InstanceManager.getDefault(TurnoutManager.class).getTurnout("IT301");
assertNotNull(turnout1);
Turnout turnout2 = InstanceManager.getDefault(TurnoutManager.class).getTurnout("IT302");
assertNotNull(turnout2);
Sensor sensor = InstanceManager.getDefault(SensorManager.class).getSensor("IS301");
assertNotNull(sensor);
Timebase timebase = InstanceManager.getDefault(Timebase.class);
assertNotNull(timebase);
timebase.setRun(false);
Calendar cal = new GregorianCalendar();
cal.set(2018, 1, 12, 2, 00, 00); // 02:00:00
timebase.setTime(cal.getTime());
// turnout change sets time
ThreadingUtil.runOnLayout(()->{turnout1.setCommandedState(Turnout.THROWN);});
ThreadingUtil.runOnLayout(()->{turnout2.setCommandedState(Turnout.CLOSED);});
cal.set(2018, 1, 12, 4, 01, 00); // 04:01:00
JUnitUtil.waitFor(()->{return timebase.getTime().equals(cal.getTime());},"date 04:01:00");
JUnitUtil.waitFor(()->{return sensor.getState()==Sensor.ACTIVE;},"sensor ACTIVE");
// turnout change sets time
ThreadingUtil.runOnLayout(()->{turnout1.setCommandedState(Turnout.CLOSED);});
ThreadingUtil.runOnLayout(()->{turnout2.setCommandedState(Turnout.THROWN);});
cal.set(2018, 1, 12, 14, 02, 00); // 14:02:00
JUnitUtil.waitFor(()->{return sensor.getState()==Sensor.INACTIVE;},"sensor INACTIVE");
JUnitUtil.waitFor(()->{return timebase.getTime().equals(cal.getTime());},"date 14:02:00");
}
@Test
public void testMemoryAccess() {
Memory memory1 = InstanceManager.getDefault(MemoryManager.class).getMemory("IM401");
assertNotNull(memory1);
Memory memory2 = InstanceManager.getDefault(MemoryManager.class).getMemory("IM402");
assertNotNull(memory2);
Memory memory3 = InstanceManager.getDefault(MemoryManager.class).getMemory("IM403");
assertNotNull(memory3);
Memory memory4 = InstanceManager.getDefault(MemoryManager.class).getMemory("IM404");
assertNotNull(memory4);
// test the IM401 to IM402 conditional
ThreadingUtil.runOnLayout(()->{memory2.setValue("bbb");});
ThreadingUtil.runOnLayout(()->{memory1.setValue("aaa");});
JUnitUtil.waitFor(()->{return memory2.getValue().equals("aaa");},"Value aaa after aaa");
ThreadingUtil.runOnLayout(()->{memory2.setValue("bbb");});
ThreadingUtil.runOnLayout(()->{memory1.setValue("aatta");});
JUnitUtil.waitFor(()->{return memory2.getValue().equals("bbb");},"Value bbb after aatta");
ThreadingUtil.runOnLayout(()->{memory2.setValue("bbb");});
ThreadingUtil.runOnLayout(()->{memory1.setValue("aAa");});
JUnitUtil.waitFor(()->{return memory2.getValue().equals("aAa");},"Value aAa after aAa");
// test the IM401 to IM402 conditional
ThreadingUtil.runOnLayout(()->{memory4.setValue("No");});
ThreadingUtil.runOnLayout(()->{memory2.setValue("100");});
ThreadingUtil.runOnLayout(()->{memory3.setValue("200");});
JUnitUtil.waitFor(()->{return memory4.getValue().equals("No");},"No after 200");
ThreadingUtil.runOnLayout(()->{memory3.setValue("50");});
JUnitUtil.waitFor(()->{return memory4.getValue().equals("OK");},"OK after 50");
}
@Test
public void testLightDrivesLight() {
Light light1 = InstanceManager.getDefault(LightManager.class).getLight("IL501");
assertNotNull(light1);
Light light2 = InstanceManager.getDefault(LightManager.class).getLight("IL502");
assertNotNull(light2);
ThreadingUtil.runOnLayout(()->{light1.setState(Light.ON);});
JUnitUtil.waitFor(()->{return light2.getState()==Light.OFF;},"light Off");
ThreadingUtil.runOnLayout(()->{light1.setState(Light.OFF);});
JUnitUtil.waitFor(()->{return light2.getState()==Light.ON;},"light On");
ThreadingUtil.runOnLayout(()->{light1.setState(Light.ON);});
JUnitUtil.waitFor(()->{return light2.getState()==Light.OFF;},"light Off");
}
@BeforeAll
public static void setUp() throws JmriConfigureXmlException {
JUnitUtil.setUp();
JUnitUtil.resetInstanceManager();
JUnitUtil.initInternalTurnoutManager();
JUnitUtil.initInternalSensorManager();
// load and activate sample file
java.io.File f = new java.io.File("java/test/jmri/implementation/configurexml/load/ActiveLogixTestDefinitions.xml");
jmri.configurexml.ConfigXmlManager cm = new jmri.configurexml.ConfigXmlManager() {};
Assertions.assertTrue(cm.load(f));
InstanceManager.getDefault(jmri.LogixManager.class).activateAllLogixs();
}
@AfterAll
public static void tearDown() {
JUnitUtil.deregisterBlockManagerShutdownTask();
JUnitUtil.tearDown();
}
}