Files
JIMRI/java/test/jmri/jmrix/openlcb/OlcbLightManagerTest.java
T
2026-06-17 14:00:51 +02:00

192 lines
6.6 KiB
Java

package jmri.jmrix.openlcb;
import java.beans.PropertyVetoException;
import jmri.InstanceManager;
import jmri.Light;
import jmri.util.JUnitUtil;
import org.junit.Assert;
import org.junit.jupiter.api.*;
import org.openlcb.*;
/**
* Tests for the jmri.jmrix.openlcb.OlcbLightManager class.
*
* @author Jeff Collell
*/
public class OlcbLightManagerTest extends jmri.managers.AbstractLightMgrTestBase {
private static OlcbSystemConnectionMemoScaffold memo;
private static Connection connection;
private static NodeID nodeID = new NodeID(new byte[]{1, 0, 0, 0, 0, 0});
private static java.util.ArrayList<Message> messages;
@Override
public String getSystemName(int i) {
throw new UnsupportedOperationException("olcb lights need 2 addresses");
}
@Override
public String getASystemNameWithNoPrefix() {
return "x0102030405060701;x0102030405060702";
}
public String getSystemName(int on, int off) {
return "MLx010203040506070" + on +";x010203040506070" + off;
}
@Test
public void testCtor() {
Assert.assertNotNull("exists", l);
}
@Override
@Test
public void testProvideName() {
// create
// olcb addresses are hex values requirng 16 digits.
Light t = l.provide("MLx010203040506070" + getNumToTest1() +";x010203040506070" + getNumToTest2());
// check
Assert.assertNotNull("real object returned ", t);
Assert.assertEquals("system name correct " + t.getSystemName(), t, l.getBySystemName(getSystemName(getNumToTest1(), getNumToTest2())));
}
@Override
@Test
public void testDefaultSystemName() {
// create
// olcb addresses are hex values requirng 16 digits.
Light t = l.provideLight("MLx010203040506070" + getNumToTest1() +";x010203040506070" + getNumToTest2());
// check
Assert.assertNotNull("real object returned ", t);
Assert.assertEquals("system name correct " + t.getSystemName(), t, l.getBySystemName(getSystemName(getNumToTest1(), getNumToTest2())));
}
@Override
@Test
public void testUpperLower() {
// olcb addresses are hex values requirng 16 digits.
Light t = l.provideLight("MLx010203040506070" + getNumToTest1() + ";x010203040506070" + getNumToTest2());
String name = t.getSystemName();
Assert.assertNull(l.getLight(name.toLowerCase()));
}
@Override
@Test
public void testSingleObject() {
// test that you always get the same representation
Light t1 = l.newLight(getSystemName(getNumToTest1(), getNumToTest2()), "mine");
Assert.assertNotNull("t1 real object returned ", t1);
Assert.assertEquals("same by user ", t1, l.getByUserName("mine"));
Assert.assertEquals("same by system ", t1, l.getBySystemName(getSystemName(getNumToTest1(), getNumToTest2())));
Light t2 = l.newLight(getSystemName(getNumToTest1(), getNumToTest2()), "mine");
Assert.assertNotNull("t2 real object returned ", t2);
// check
Assert.assertEquals("same new ", t1, t2);
}
@Override
@Test
public void testLightPutGet() {
// create
Light t = l.newLight(getSystemName(getNumToTest1(), getNumToTest2()), "mine");
// check
Assert.assertNotNull("real object returned ", t);
Assert.assertEquals("user name correct ", t, l.getByUserName("mine"));
Assert.assertEquals("system name correct ", t, l.getBySystemName(getSystemName(getNumToTest1(), getNumToTest2())));
}
@Override
@Test
public void testRename() {
// get light
Light t1 = l.newLight(getSystemName(getNumToTest1(), getNumToTest2()), "before");
Assert.assertNotNull("t1 real object ", t1);
t1.setUserName("after");
Light t2 = l.getByUserName("after");
Assert.assertEquals("same object", t1, t2);
Assert.assertNull("no old object", l.getByUserName("before"));
}
@Test
public void testDotted() {
// olcb addresses are hex values requirng 16 digits.
Light t = l.provideLight("ML01.02.03.04.05.06.07.0" + getNumToTest1() + ";01.02.03.04.05.06.07.0" + getNumToTest2());
String name = t.getSystemName();
Assert.assertNull(l.getLight(name.toLowerCase()));
}
@Override
@Test
public void testRegisterDuplicateSystemName() throws PropertyVetoException,
NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
String s1 = l.makeSystemName("x0102030405060701;x0102030405060702");
String s2 = l.makeSystemName("x0102030405060703;x0102030405060704");
testRegisterDuplicateSystemName(l, s1, s2);
}
@Override
@Test
@Disabled("Test requires further setup")
public void testCreate() {}
@Override
@BeforeEach
public void setUp() {
l = new OlcbLightManager(memo);
}
@AfterEach
public void tearDown() {
l.dispose();
l = null;
}
@BeforeAll
@SuppressWarnings("deprecation") // OlcbInterface(NodeID, Connection)
public static void preClassInit() {
// this test is run separately because it leaves a lot of threads behind
org.junit.Assume.assumeFalse("Ignoring intermittent test", Boolean.getBoolean("jmri.skipTestsRequiringSeparateRunning"));
JUnitUtil.setUp();
JUnitUtil.initInternalTurnoutManager();
nodeID = new NodeID(new byte[]{1, 0, 0, 0, 0, 0});
messages = new java.util.ArrayList<>();
connection = new AbstractConnection() {
@Override
public void put(Message msg, Connection sender) {
messages.add(msg);
}
};
memo = new OlcbSystemConnectionMemoScaffold(); // this self-registers as 'M'
memo.setProtocol(jmri.jmrix.can.ConfigurationManager.OPENLCB);
memo.setInterface(new OlcbInterface(nodeID, connection) {
@Override
public Connection getOutputConnection() {
return connection;
}
});
JUnitUtil.waitFor(()-> (!messages.isEmpty()),"Initialization Complete message");
}
@AfterAll
public static void postClassTearDown() {
org.junit.Assume.assumeFalse("Ignoring intermittent test", Boolean.getBoolean("jmri.skipTestsRequiringSeparateRunning"));
if(memo != null && memo.getInterface() !=null ) {
memo.getInterface().dispose();
memo.get(OlcbEventNameStore.class).deregisterShutdownTask();
InstanceManager.getDefault(jmri.IdTagManager.class).dispose();
}
memo = null;
connection = null;
nodeID = null;
JUnitUtil.tearDown();
}
}