Files
JIMRI/java/test/jmri/jmrit/logixng/implementation/configurexml/DefaultDigitalBooleanActionManagerXmlTest.java
T
2026-06-17 14:00:51 +02:00

231 lines
9.7 KiB
Java

package jmri.jmrit.logixng.implementation.configurexml;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import jmri.ConfigureManager;
import jmri.InstanceManager;
import jmri.jmrit.logixng.DigitalBooleanActionManager;
import jmri.jmrit.logixng.actions.DigitalBooleanLogixAction;
import jmri.jmrit.logixng.actions.configurexml.DigitalBooleanLogixActionXml;
import jmri.jmrit.logixng.implementation.DefaultDigitalBooleanActionManager;
import jmri.util.JUnitAppender;
import jmri.util.JUnitUtil;
import org.jdom2.Element;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
/**
*
* @author Daniel Bergqvist Copyright (C) 2018
*/
public class DefaultDigitalBooleanActionManagerXmlTest {
@Test
public void testCTor() {
DefaultDigitalBooleanActionManagerXml b = new DefaultDigitalBooleanActionManagerXml();
assertNotNull( b, "exists");
}
@Test
public void testLoad() {
DefaultDigitalBooleanActionManagerXml b = new DefaultDigitalBooleanActionManagerXml();
Element e = new Element("logixngDigitalExpressions");
Element e2 = new Element("missing_class");
e2.setAttribute("class", "jmri.jmrit.logixng.this.class.does.not.exist.TestClassXml");
e2.addContent(new Element("maleSocket"));
e.addContent(e2);
b.loadActions(e);
JUnitAppender.assertErrorMessage("cannot load class jmri.jmrit.logixng.this.class.does.not.exist.TestClassXml");
/*
// Test loading the same class twice, in order to check field "xmlClasses"
e = new Element("logixngDigitalExpressions");
e2 = new Element("existing_class");
e2.setAttribute("class", "jmri.jmrit.logixng.actions.configurexml.DigitalBooleanOnChangeXml");
e.addContent(e2);
e2.addContent(new Element("systemName").addContent("IQDB1"));
e2.addContent(new Element("maleSocket"));
Element socketElement = new Element("socket");
e2.addContent(socketElement);
socketElement.addContent(new Element("socketName").addContent("A"));
socketElement.addContent(new Element("systemName").addContent("IQDA2"));
e2.setAttribute("trigger", "CHANGE_TO_TRUE");
b.loadActions(e);
e = new Element("logixngDigitalExpressions");
e2 = new Element("existing_class");
e2.setAttribute("class", "jmri.jmrit.logixng.actions.configurexml.DigitalBooleanOnChangeXml");
e.addContent(e2);
e2.addContent(new Element("systemName").addContent("IQDB2"));
socketElement = new Element("socket");
e2.addContent(socketElement);
socketElement.addContent(new Element("socketName").addContent("A"));
socketElement.addContent(new Element("systemName").addContent("IQDA2"));
e2.setAttribute("trigger", "CHANGE_TO_TRUE");
e2.addContent(new Element("maleSocket"));
b.loadActions(e);
// Test trying to load a class with private constructor
e = new Element("logixngDigitalExpressions");
e2 = new Element("existing_class");
e2.setAttribute("class", "jmri.jmrit.logixng.implementation.configurexml.DefaultDigitalBooleanActionManagerXmlTest$PrivateConstructorXml");
e2.addContent(new Element("maleSocket"));
e.addContent(e2);
b.loadActions(e);
JUnitAppender.assertErrorMessage("cannot create constructor");
// Test trying to load a class which throws an exception
e = new Element("logixngDigitalExpressions");
e2 = new Element("existing_class");
e2.setAttribute("class", "jmri.jmrit.logixng.logixemulator.implementation.configurexml.DefaultDigitalActionWithChangeManagerXmlTest$ThrowExceptionXml");
e.addContent(e2);
b.loadActions(e);
JUnitAppender.assertErrorMessage("cannot create constructor");
*/
// System.out.format("Class name: %s%n", PrivateConstructorXml.class.getName());
}
@Disabled("Cannot load xml configurator")
@Test
public void testStore() {
DefaultDigitalBooleanActionManagerXml b = new DefaultDigitalBooleanActionManagerXml();
// If parameter is null, nothing should happen
b.store(null);
// Test store a named bean that has no configurexml class
DigitalBooleanActionManager manager = InstanceManager.getDefault(DigitalBooleanActionManager.class);
manager.registerAction(new MyDigitalBooleanAction());
b.store(manager);
JUnitAppender.assertErrorMessage("Cannot load configuration adapter for jmri.jmrit.logixng.implementation.configurexml.DefaultDigitalBooleanActionManagerXmlTest$MyDigitalBooleanAction");
JUnitAppender.assertErrorMessage("Cannot store configuration for jmri.jmrit.logixng.implementation.configurexml.DefaultDigitalBooleanActionManagerXmlTest$MyDigitalBooleanAction");
}
@Test
public void testReplaceActionManagerWithoutConfigManager() {
// if old manager exists, remove it from configuration process
if (InstanceManager.getNullableDefault(jmri.jmrit.logixng.DigitalBooleanActionManager.class) != null) {
ConfigureManager cmOD = InstanceManager.getNullableDefault(jmri.ConfigureManager.class);
if (cmOD != null) {
cmOD.deregister(InstanceManager.getDefault(jmri.jmrit.logixng.DigitalBooleanActionManager.class));
}
}
// register new one with InstanceManager
DefaultDigitalBooleanActionManagerXmlTest.MyManager pManager = new DefaultDigitalBooleanActionManagerXmlTest.MyManager();
InstanceManager.store(pManager, DigitalBooleanActionManager.class);
// register new one for configuration
ConfigureManager cmOD = InstanceManager.getNullableDefault(jmri.ConfigureManager.class);
if (cmOD != null) {
cmOD.registerConfig(pManager, jmri.Manager.LOGIXNG_DIGITAL_BOOLEAN_ACTIONS);
}
assertInstanceOf( DefaultDigitalBooleanActionManagerXmlTest.MyManager.class,
InstanceManager.getDefault(DigitalBooleanActionManager.class),
"manager is a MyManager");
// Test replacing the manager
DefaultDigitalBooleanActionManagerXml b = new DefaultDigitalBooleanActionManagerXml();
b.replaceActionManager();
assertFalse( InstanceManager.getDefault(DigitalBooleanActionManager.class)
instanceof DefaultDigitalBooleanActionManagerXmlTest.MyManager,
"manager is not a MyManager");
}
// @Disabled("When debug is enabled, jmri.configurexml.ConfigXmlManager.registerConfig checks if the manager has a XML class, which our fake manager doesn't have")
@Test
public void testReplaceActionManagerWithConfigManager() {
JUnitUtil.initConfigureManager();
// if old manager exists, remove it from configuration process
if (InstanceManager.getNullableDefault(jmri.jmrit.logixng.DigitalBooleanActionManager.class) != null) {
ConfigureManager cmOD = InstanceManager.getNullableDefault(jmri.ConfigureManager.class);
if (cmOD != null) {
cmOD.deregister(InstanceManager.getDefault(jmri.jmrit.logixng.DigitalBooleanActionManager.class));
}
}
// register new one with InstanceManager
DefaultDigitalBooleanActionManagerXmlTest.MyManager pManager = new DefaultDigitalBooleanActionManagerXmlTest.MyManager();
InstanceManager.store(pManager, DigitalBooleanActionManager.class);
// register new one for configuration
ConfigureManager cmOD = InstanceManager.getNullableDefault(jmri.ConfigureManager.class);
if (cmOD != null) {
cmOD.registerConfig(pManager, jmri.Manager.LOGIXNG_DIGITAL_BOOLEAN_ACTIONS);
}
assertInstanceOf( DefaultDigitalBooleanActionManagerXmlTest.MyManager.class,
InstanceManager.getDefault(DigitalBooleanActionManager.class),
"manager is a MyManager");
// Test replacing the manager
DefaultDigitalBooleanActionManagerXml b = new DefaultDigitalBooleanActionManagerXml();
b.replaceActionManager();
assertFalse( InstanceManager.getDefault(DigitalBooleanActionManager.class)
instanceof DefaultDigitalBooleanActionManagerXmlTest.MyManager,
"manager is not a MyManager");
}
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
JUnitUtil.resetInstanceManager();
JUnitUtil.resetProfileManager();
JUnitUtil.initConfigureManager();
JUnitUtil.initLogixNGManager();
}
@AfterEach
public void tearDown() {
jmri.jmrit.logixng.util.LogixNG_Thread.stopAllLogixNGThreads();
JUnitUtil.deregisterBlockManagerShutdownTask();
JUnitUtil.tearDown();
}
private static class MyDigitalBooleanAction extends DigitalBooleanLogixAction {
MyDigitalBooleanAction() {
super("IQDB9999", null, DigitalBooleanLogixAction.When.Either);
}
}
// This class is loaded by reflection. The class cannot be private since
// Spotbugs will in that case flag it as "is never used locally"
static class PrivateConstructorXml extends DigitalBooleanLogixActionXml {
private PrivateConstructorXml() {
}
}
/*
// This class is loaded by reflection. The class cannot be private since
// Spotbugs will in that case flag it as "is never used locally"
class ThrowExceptionXml extends OnChangeActionXml {
@Override
public boolean load(Element shared, Element perNode) {
throw new JmriConfigureXmlException();
}
}
*/
static class MyManager extends DefaultDigitalBooleanActionManager {
}
}