package jmri.managers; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import jmri.*; import jmri.implementation.AbstractVariableLight; import jmri.util.JUnitUtil; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; /** * Test the DefaultVariableLightManager. * * @author Daniel Bergqvist Copyright (C) 2020 */ public class DefaultVariableLightManagerTest { private VariableLight newVariableLight(String sysName, String userName) { return new MyVariableLight(sysName, userName); } @Test public void testDispose() { VariableLightManager l = InstanceManager.getDefault(VariableLightManager.class); l.dispose(); // all we're really doing here is making sure the method exists } @Test public void testRegister() { // create VariableLight t = newVariableLight("L11", "mine"); VariableLightManager l = InstanceManager.getDefault(VariableLightManager.class); UnsupportedOperationException ex = assertThrows(UnsupportedOperationException.class, () -> l.register(t)); assertNotNull(ex); ex = assertThrows(UnsupportedOperationException.class, () -> l.deregister(t)); assertNotNull(ex); } @Test public void testLights() { // Test that the VariableLightManager registers variable lights but not // lights that are not variable. // When this light is created, the VariableLightManager isn't created yet. Light light = new MyLight("IL1"); InstanceManager.getDefault(LightManager.class).register(light); VariableLight variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL1"); assertNull( variableLight, "light does not exists in VariableLightManager"); // Check that we can deregister light without problem InstanceManager.getDefault(LightManager.class).deregister(light); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL1"); assertNull( variableLight, "light does not exists in VariableLightManager"); // When this light is created, the VariableLightManager is created. Light light2 = new MyLight("IL2"); InstanceManager.getDefault(LightManager.class).register(light2); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL2"); assertNull( variableLight, "light does not exists in VariableLightManager"); // Check that we can deregister light without problem InstanceManager.getDefault(LightManager.class).deregister(light); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL2"); assertNull( variableLight, "light does not exists in VariableLightManager"); } @Test public void testVariableLights() { // Test that the VariableLightManager registers variable lights. // When this light is created, the VariableLightManager isn't created yet. Light variableLight = new MyVariableLight("IL101", "MyLight"); InstanceManager.getDefault(LightManager.class).register(variableLight); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL101"); assertNotNull( variableLight, "variable light exists in VariableLightManager"); // Check that we can deregister light and that it get deregstered from VariableLightManager as well InstanceManager.getDefault(LightManager.class).deregister(variableLight); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL101"); assertNull( variableLight, "light does not exists in VariableLightManager"); // When this light is created, the VariableLightManager is created. Light variableLight2 = new MyVariableLight("IL201", "MyLight"); InstanceManager.getDefault(LightManager.class).register(variableLight2); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL201"); assertNotNull( variableLight, "variable light exists in VariableLightManager"); // Check that we can deregister light and that it get deregstered from VariableLightManager as well InstanceManager.getDefault(LightManager.class).deregister(variableLight2); variableLight = InstanceManager.getDefault(VariableLightManager.class).getBySystemName("IL2901"); assertNull( variableLight, "light does not exists in VariableLightManager"); } @Test public void testVariableLights_UserName() { // Test that the VariableLightManager registers variable lights but not // lights that are not variable. Light light = new MyLight("IL1"); InstanceManager.getDefault(LightManager.class).register(light); VariableLight variableLight = InstanceManager.getDefault(VariableLightManager.class).getByUserName("A light"); assertNull( variableLight, "light does not exists in VariableLightManager"); // Check that we can deregister light without problem InstanceManager.getDefault(LightManager.class).deregister(light); variableLight = InstanceManager.getDefault(VariableLightManager.class).getByUserName("A light"); assertNull( variableLight, "light does not exists in VariableLightManager"); Light variableLight2 = new MyVariableLight("IL2", "A variable light 2 DVLMT"); InstanceManager.getDefault(LightManager.class).register(variableLight2); variableLight = InstanceManager.getDefault(VariableLightManager.class).getByUserName("A variable light 2 DVLMT"); assertNotNull( variableLight, "variableLight exists in VariableLightManager"); // Check that we can deregister variableLight and that it get deregstered from VariableLightManager as well InstanceManager.getDefault(LightManager.class).deregister(variableLight2); variableLight = InstanceManager.getDefault(VariableLightManager.class).getByUserName("A variable light 2 DVLMT"); assertNull( variableLight, "variableLight does not exists in VariableLightManager"); } @BeforeEach public void setUp() { JUnitUtil.setUp(); JUnitUtil.initInternalLightManager(); } @AfterEach public void tearDown() { // kill timebase created by variable light var timebase = InstanceManager.getNullableDefault(jmri.Timebase.class); if (timebase != null) { timebase.setRun(false); for (var listener : timebase.getMinuteChangeListeners()) { timebase.removeMinuteChangeListener(listener); } } JUnitUtil.tearDown(); } private static class MyLight extends jmri.implementation.AbstractLight { private MyLight(String systemName) { super(systemName); } } private static class MyVariableLight extends AbstractVariableLight { double _value = 0.0; private MyVariableLight(String sys, String userName) { super(sys, userName); } @Override public void setCommandedAnalogValue(double value) throws JmriException { _value = value; } @Override public double getCommandedAnalogValue() { return _value; } @Override public double getMin() { return Float.MIN_VALUE; } @Override public double getMax() { return Float.MAX_VALUE; } @Override public double getResolution() { return 0.1; } @Override public int getNumberOfSteps() { return 10; } @Override public AbsoluteOrRelative getAbsoluteOrRelative() { return AbsoluteOrRelative.ABSOLUTE; } @Override protected void sendIntensity(double intensity) { // Do nothing } @Override protected void sendOnOffCommand(int newState) { // Do nothing } } // private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ProxyVariableLightManagerTest.class); }