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

813 lines
32 KiB
Java

package jmri;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
import jmri.implementation.SignalSpeedMap;
import jmri.jmrix.internal.InternalSensorManager;
import jmri.jmrix.internal.InternalSystemConnectionMemo;
import jmri.util.JUnitUtil;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests for the Block class
*
* @author Bob Jacobsen Copyright (C) 2006
*/
public class BlockTest {
/**
* Normally, users create Block objects via a manager, but we test the
* direct create here. If it works, we can use it for testing.
*/
@Test
public void testDirectCreate() {
Block b = new Block("SystemName");
assertNotNull( b, "Block Created");
}
@Test
@SuppressWarnings({"unlikely-arg-type", "ObjectEqualsNull", "IncompatibleEquals"}) // String / StringBuffer seems to be unrelated to Block
public void testEquals() {
Block b1 = new Block("SystemName1");
Block b2 = new Block("SystemName2");
//multiple Block objects with same SystemName are really the same
Block b1a = new Block("SystemName1");
assertTrue(b1.equals(b1)); // identity
assertFalse(b1.equals(b2)); // blocks are named objects
assertTrue(b1a.equals(b1));
assertTrue(b1.equals(b1a)); // commutes
// check null
assertFalse(b1.equals(null));
// check another type
assertFalse(b1.equals(new StringBuffer("foo")));
assertFalse(b1.equals("foo"));
}
@Test
public void testBlockHashCode() {
Block b1 = new Block("SystemName1");
//multiple Block objects with same SystemName are really the same
Block b1a = new Block("SystemName1");
assertTrue(b1.hashCode() == b1a.hashCode());
b1a.setLength(120);
b1a.setCurvature(21);
assertTrue(b1.hashCode() == b1a.hashCode());
}
@Test
public void testSensorAdd() {
Block b = new Block("SystemName");
b.setSensor("IS12");
}
private int count;
@Test
public void testSensorInvoke() throws JmriException {
SensorManager sm = new InternalSensorManager(InstanceManager.getDefault(InternalSystemConnectionMemo.class));
count = 0;
Block b = new Block("SystemName") {
@Override
void handleSensorChange(java.beans.PropertyChangeEvent e) {
count++;
}
};
Sensor s = sm.provideSensor("IS12");
b.setNamedSensor(jmri.InstanceManager.getDefault(jmri.NamedBeanHandleManager.class).getNamedBeanHandle("IS12", s));
sm.provideSensor("IS12").setState(jmri.Sensor.ACTIVE);
assertEquals( 1, count, "count of detected changes");
}
@Test
public void testValueField() {
Block b = new Block("SystemName");
b.setValue("string");
assertEquals( "string", b.getValue(), "Returned Object matches");
}
@Test
public void testSensorSequence() throws JmriException {
SensorManager sm = new InternalSensorManager(InstanceManager.getDefault(InternalSystemConnectionMemo.class));
count = 0;
Block b = new Block("SystemName");
Sensor s = sm.provideSensor("IS12");
s.setState(Sensor.UNKNOWN);
assertEquals( Block.UNDETECTED, b.getState(), "Initial state"); // state until sensor is set
b.setSensor("IS12");
s.setState(Sensor.ACTIVE);
assertEquals( Block.OCCUPIED, s.getState(), "State with sensor active");
s.setState(Sensor.INACTIVE);
assertEquals( Block.UNOCCUPIED, s.getState(), "State with sensor inactive");
}
@Test
public void testCoding() {
assertTrue( Block.OCCUPIED != Block.UNOCCUPIED, "Block.OCCUPIED != Block.UNOCCUPIED");
assertTrue( Block.OCCUPIED != Block.UNDETECTED, "Block.OCCUPIED != Block.UNDETECTED");
assertTrue( Block.OCCUPIED != Block.UNKNOWN, "Block.OCCUPIED != Block.UNKNOWN");
assertTrue( Block.OCCUPIED != Block.INCONSISTENT, "Block.OCCUPIED != Block.INCONSISTENT");
assertTrue( Block.UNOCCUPIED != Block.UNDETECTED, "Block.UNOCCUPIED != Block.UNDETECTED");
assertTrue( Block.UNOCCUPIED != Block.UNKNOWN, "Block.UNOCCUPIED != Block.UNKNOWN");
assertTrue( Block.UNOCCUPIED != Block.INCONSISTENT, "Block.UNOCCUPIED != Block.INCONSISTENT");
assertTrue( Block.UNDETECTED != Block.UNKNOWN, "Block.UNDETECTED != Block.UNKNOWN");
assertTrue( Block.UNDETECTED != Block.INCONSISTENT, "Block.UNDETECTED != Block.INCONSISTENT");
assertTrue( Block.UNKNOWN != Block.INCONSISTENT, "Block.UNKNOWN != Block.INCONSISTENT");
}
// test going active with only one neighbor
@Test
public void testFirstGoActive() throws JmriException {
SensorManager sm = new InternalSensorManager(InstanceManager.getDefault(InternalSystemConnectionMemo.class));
Block b1 = new Block("SystemName1");
Block b2 = new Block("SystemName2");
Sensor s2 = sm.provideSensor("IS2");
b2.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS2", s2));
s2.setState(Sensor.ACTIVE);
b2.setValue("b2 contents");
Path p = new Path();
p.setBlock(b2);
b1.addPath(p);
// actual test
b1.goingActive();
assertEquals( "b2 contents", b1.getValue(), "Value transferred");
}
// Test going active with two neighbors, one active.
// b2 is between b1 and b3. b1 contains a train
@Test
public void testOneOfTwoGoesActive() throws JmriException {
SensorManager sm = new InternalSensorManager(InstanceManager.getDefault(InternalSystemConnectionMemo.class));
Block b1 = new Block("SystemName1");
Block b2 = new Block("SystemName2");
Block b3 = new Block("SystemName3");
Sensor s1 = sm.provideSensor("IS1");
b1.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS1", s1));
s1.setState(Sensor.ACTIVE);
b1.setValue("b1 contents");
Sensor s2 = sm.provideSensor("IS2");
b2.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS2", s2));
s2.setState(Sensor.INACTIVE);
Sensor s3 = sm.provideSensor("IS3");
b3.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS3", s3));
s3.setState(Sensor.INACTIVE);
Path p21 = new Path();
p21.setBlock(b1);
p21.setFromBlockDirection(Path.RIGHT);
p21.setToBlockDirection(Path.LEFT);
b2.addPath(p21);
Path p23 = new Path();
p23.setBlock(b3);
p23.setFromBlockDirection(Path.LEFT);
p23.setToBlockDirection(Path.RIGHT);
b2.addPath(p23);
// actual test
b2.goingActive();
assertEquals( Block.OCCUPIED, b2.getState(), "State");
assertEquals( "b1 contents", b2.getValue(), "Value transferred");
assertEquals( Path.RIGHT, b2.getDirection(), "Direction");
}
// Test going active with two neighbors, both active.
// b2 is between b1 and b3.
@Test
public void testTwoOfTwoGoesActive() throws JmriException {
SensorManager sm = new InternalSensorManager(InstanceManager.getDefault(InternalSystemConnectionMemo.class));
Block b1 = new Block("SystemName1");
Block b2 = new Block("SystemName2");
Block b3 = new Block("SystemName3");
Sensor s1 = sm.provideSensor("IS1");
b1.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS1", s1));
s1.setState(Sensor.ACTIVE);
b1.setValue("b1 contents");
b1.setDirection(Path.RIGHT);
Sensor s2 = sm.provideSensor("IS2");
b2.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS2", s2));
s2.setState(Sensor.INACTIVE);
Sensor s3 = sm.provideSensor("IS3");
b3.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS3", s3));
s3.setState(Sensor.ACTIVE);
b3.setValue("b3 contents");
b3.setDirection(Path.RIGHT);
Path p21 = new Path();
p21.setBlock(b1);
p21.setFromBlockDirection(Path.RIGHT);
p21.setToBlockDirection(Path.LEFT);
b2.addPath(p21);
Path p23 = new Path();
p23.setBlock(b3);
p23.setFromBlockDirection(Path.LEFT);
p23.setToBlockDirection(Path.RIGHT);
b2.addPath(p23);
// actual test
b2.goingActive();
assertEquals( Block.OCCUPIED, b2.getState(), "State");
assertEquals( "b1 contents", b2.getValue(), "Value transferred");
assertEquals( Path.RIGHT, b2.getDirection(), "Direction");
}
// Test going active with two neighbors, both active, where FROM is a combination direction.
// b2 is between b1 and b3.
@Test
public void testTwoOfTwoGoesActiveCombination() throws JmriException {
SensorManager sm = new InternalSensorManager(InstanceManager.getDefault(InternalSystemConnectionMemo.class));
Block b1 = new Block("SystemName1");
Block b2 = new Block("SystemName2");
Block b3 = new Block("SystemName3");
Sensor s1 = sm.provideSensor("IS1");
b1.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS1", s1));
s1.setState(Sensor.ACTIVE);
b1.setValue("b1 contents");
b1.setDirection(Path.NORTH_WEST); //combination direction
Sensor s2 = sm.provideSensor("IS2");
b2.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS2", s2));
s2.setState(Sensor.INACTIVE);
Sensor s3 = sm.provideSensor("IS3");
b3.setNamedSensor(InstanceManager.getDefault(NamedBeanHandleManager.class).getNamedBeanHandle("IS3", s3));
s3.setState(Sensor.ACTIVE);
b3.setValue("b3 contents");
b3.setDirection(Path.NORTH);
Path p21 = new Path();
p21.setBlock(b1);
p21.setFromBlockDirection(Path.NORTH);
p21.setToBlockDirection(Path.SOUTH);
b2.addPath(p21);
Path p23 = new Path();
p23.setBlock(b3);
p23.setFromBlockDirection(Path.EAST);
p23.setToBlockDirection(Path.NORTH);
b2.addPath(p23);
// actual test
b2.goingActive();
assertEquals( Block.OCCUPIED, b2.getState(), "State");
assertEquals( "b1 contents", b2.getValue(), "Value transferred");
assertEquals( Path.NORTH, b2.getDirection(), "Direction");
}
@Test
public void testReporterAdd() {
ReporterManager rm = jmri.InstanceManager.getDefault(ReporterManager.class);
Block b = new Block("SystemName");
b.setReporter(rm.provideReporter("IR22"));
}
@Test
public void testReporterInvokeAll() {
ReporterManager rm = jmri.InstanceManager.getDefault(ReporterManager.class);
count = 0;
Block b = new Block("SystemName") {
@Override
void handleReporterChange(java.beans.PropertyChangeEvent e) {
count++;
}
};
b.setReporter(rm.provideReporter("IR22"));
rm.provideReporter("IR22").setReport("report");
// For each report, there are two PropertyChangeEvents -
// "currentReport" and "lastReport"
assertEquals( 2, count, "count of detected changes");
}
@Test
public void testReporterInvokeCurrent() {
ReporterManager rm = InstanceManager.getDefault(ReporterManager.class);
count = 0;
Block b = new Block("SystemName") {
@Override
void handleReporterChange(java.beans.PropertyChangeEvent e) {
if (e.getPropertyName().equals("currentReport")) {
count++;
}
}
};
b.setReporter(rm.provideReporter("IR22"));
rm.provideReporter("IR22").setReport("report");
// Only detecting "currentReport" PropertyChangeEvent
assertEquals( 1, count, "count of detected changes");
rm.provideReporter("IR22").setReport(null);
// Current report should change
assertEquals( 2, count, "count of detected changes");
}
@Test
public void testReporterInvokeLast() {
ReporterManager rm = InstanceManager.getDefault(ReporterManager.class);
count = 0;
Block b = new Block("SystemName") {
@Override
void handleReporterChange(java.beans.PropertyChangeEvent e) {
if (e.getPropertyName().equals("lastReport")) {
count++;
}
}
};
b.setReporter(rm.provideReporter("IR22"));
rm.provideReporter("IR22").setReport("report");
// Only detecting "lastReport" PropertyChangeEvent
assertEquals( 1, count, "count of detected changes");
rm.provideReporter("IR22").setReport(null);
// Last report should not change
assertEquals( 1, count, "count of detected changes");
}
@Test
public void testGetLocoAddress(){
Block b = new Block("SystemName");
assertEquals( new DccLocoAddress(1234,LocoAddress.Protocol.DCC), b.getLocoAddress("1234 enter"),
"address");
}
@Test
public void testGetLocoDirection(){
Block b = new Block("SystemName");
assertEquals( jmri.PhysicalLocationReporter.Direction.ENTER, b.getDirection("1234 enter"),
"direction");
}
@Test
public void testAddRemoveListener() throws JmriException {
Block b = new Block("BlockSystemName");
b.setUserName("Start user id");
Listen listen = new Listen();
assertEquals( 0, b.getNumPropertyChangeListeners(), "no listener at start of test");
b.addPropertyChangeListener(listen);
assertEquals( 1, b.getNumPropertyChangeListeners(), "1 listener added");
b.setUserName("user id");
assertEquals( "UserName", listen.getPropertyName(0), "prop ev name");
assertEquals( "Start user id", listen.getOldValue(0), "old value");
assertEquals( "user id", listen.getNewValue(0), "new value");
b.removePropertyChangeListener(listen);
assertEquals( 0, b.getNumPropertyChangeListeners(), "listener removed");
b.setUserName("Changed user id");
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
}
/**
* Test Property Changes for Adding Sensors to a block.
*
* Add a Sensor with UNKNOWN state to Block.
* Prop change for Block state UNDETECTED to UNKNOWN
* Prop Change Block added Sensor
*
* Change the Block Sensor to new Sensor with INACTIVE state
* Prop change for Block state UNKNOWN to UNOCCUPIED
* Prop Change Block Sensor change
*
* Remove the Block Sensor
* Prop change for Block state UNOCCUPIED to UNDETECED
* Prop Change Block Sensor change
*
* @throws JmriException on test error.
*/
@Test
public void testAddSensorPropertyChange() throws JmriException {
SensorManager sm = InstanceManager.getDefault(SensorManager.class);
Sensor sensorUnknownState = sm.provide("ISunknownState");
sensorUnknownState.setKnownState(Sensor.UNKNOWN);
Sensor sensorInactiveState = sm.provide("ISInactiveState");
sensorInactiveState.setKnownState(Sensor.INACTIVE);
Block b = new Block("BlockSystemName");
assertEquals( Block.UNDETECTED, b.getState(), "Block starts state undetected");
assertNull( b.getSensor(), "Block starts no sensor");
Listen listen = new Listen();
b.addPropertyChangeListener(listen);
b.setSensor(null);
assertEquals( 0, listen.getNumPropChanges(), "no prop change null to null");
b.setSensor("");
assertEquals( 0, listen.getNumPropChanges(), "no prop change null to empty");
b.setSensor("ISunknownState");
assertEquals( 2, listen.getNumPropChanges(), "list size +2, state change, occ sense change");
assertEquals( "state", listen.getPropertyName(0), "prop ev name");
assertEquals(Block.UNDETECTED, (int)listen.getOldValue(0), "old value");
assertEquals( Block.UNKNOWN, (int)listen.getNewValue(0), "new value");
assertEquals( Block.OCC_SENSOR_CHANGE, listen.getPropertyName(1), "prop ev name");
assertNull( listen.getOldValue(1), "old value");
assertEquals( sensorUnknownState, listen.getNewValue(1), "new value");
b.setSensor("ISunknownState");
assertEquals( 2, listen.getNumPropChanges(), "same sensor, no prop change");
b.setSensor("ISInactiveState");
assertEquals( 4, listen.getNumPropChanges(), "list size +2, state change, occ sense change");
assertEquals( "state", listen.getPropertyName(2), "prop ev name");
assertEquals( Block.UNKNOWN, (int)listen.getOldValue(2), "old value");
assertEquals( Block.UNOCCUPIED, (int)listen.getNewValue(2), "new value");
assertEquals( Block.OCC_SENSOR_CHANGE, listen.getPropertyName(3), "prop ev name");
assertEquals( sensorUnknownState, listen.getOldValue(3), "old value");
assertEquals( sensorInactiveState, listen.getNewValue(3), "new value");
b.setSensor(null);
assertEquals( 6, listen.getNumPropChanges(), "list size +2, state change, occ sense change");
assertEquals( "state", listen.getPropertyName(4), "prop ev name");
assertEquals( Block.UNOCCUPIED, (int)listen.getOldValue(4), "old value");
assertEquals( Block.UNDETECTED, (int)listen.getNewValue(4), "setSensor sets status unoccupied to undetected");
assertEquals( Block.OCC_SENSOR_CHANGE, listen.getPropertyName(5), "prop ev name");
assertEquals( sensorInactiveState, listen.getOldValue(5), "old value");
assertNull( listen.getNewValue(5), "new value");
}
@Test
public void testAddReporterPropertyChange() throws JmriException {
ReporterManager rm = InstanceManager.getDefault(ReporterManager.class);
Reporter rep = rm.provide("IR123");
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
b.addPropertyChangeListener(listen);
b.setReporter(rep);
assertEquals( 1, listen.getNumPropChanges(), "list size 1, reporter change");
assertEquals( Block.BLOCK_REPORTER_CHANGE, listen.getPropertyName(0), "prop ev name");
assertNull( listen.getOldValue(0), "old value");
assertEquals( rep, listen.getNewValue(0), "new value");
b.setReporter(rep);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setReporter(null);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( Block.BLOCK_REPORTER_CHANGE, listen.getPropertyName(1), "prop ev name");
assertEquals( rep, listen.getOldValue(1), "old value");
assertNull( listen.getNewValue(1), "new value");
}
/**
* Testing of the Reporting Current Flag being set, NOT of the Reporter mechanism.
* @throws JmriException on test error.
*/
@Test
public void testSetReportingCurrentPropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
b.setReportingCurrent(false); // set initial test state
b.addPropertyChangeListener(listen);
b.setReportingCurrent(true);
assertEquals( 1, listen.getNumPropChanges(), "list size 1, property change");
assertEquals( Block.BLOCK_REPORTING_CURRENT, listen.getPropertyName(0), "prop ev name");
assertEquals( Boolean.FALSE, listen.getOldValue(0), "old value");
assertEquals( Boolean.TRUE, listen.getNewValue(0), "new value");
b.setReportingCurrent(true);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setReportingCurrent(false);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( Block.BLOCK_REPORTING_CURRENT, listen.getPropertyName(1), "prop ev name");
assertEquals( Boolean.TRUE, listen.getOldValue(1), "old value");
assertEquals( Boolean.FALSE, listen.getNewValue(1), "new value");
}
@Test
public void testSetStatePropertyChangeName() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
b.setState(Block.UNDETECTED); // set initial test state
b.addPropertyChangeListener(listen);
b.setState(Block.UNOCCUPIED);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertEquals( "state", listen.getPropertyName(0), "prop ev name");
assertEquals( Block.UNOCCUPIED, (int)listen.getNewValue(0), "new value");
}
@Test
public void testSetValuePropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
b.setValue(null); // set initial test state
b.addPropertyChangeListener(listen);
b.setValue("String Block Value");
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertEquals( "value", listen.getPropertyName(0), "prop ev name");
assertNull( listen.getOldValue(0), "old value");
assertEquals( "String Block Value", listen.getNewValue(0), "new value");
b.setValue("String Block Value");
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setValue("New Block Value");
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( "value", listen.getPropertyName(1), "prop ev name");
assertEquals( "String Block Value", listen.getOldValue(1), "old value");
assertEquals( "New Block Value", listen.getNewValue(1), "new value");
b.setValue(null);
assertEquals( 3, listen.getNumPropChanges(), "+1 property change");
assertEquals( "value", listen.getPropertyName(2), "prop ev name");
assertEquals( "New Block Value", listen.getOldValue(2), "old value");
assertNull( listen.getNewValue(2), "new value");
}
@Test
public void testSetDirectionPropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
b.setDirection(Path.NORTH); // set initial test state
b.addPropertyChangeListener(listen);
b.setDirection(Path.EAST);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertEquals( Path.EAST, b.getDirection(), "Direction set");
assertEquals( "direction", listen.getPropertyName(0), "prop ev name");
assertEquals( Path.NORTH, (int)listen.getOldValue(0), "old value");
assertEquals( Path.EAST, (int)listen.getNewValue(0), "new value");
b.setDirection(Path.EAST);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setDirection(Path.WEST);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( Path.WEST, b.getDirection(), "Direction set");
assertEquals( "direction", listen.getPropertyName(1), "prop ev name");
assertEquals( Path.EAST, (int)listen.getOldValue(1), "old value");
assertEquals( Path.WEST, (int)listen.getNewValue(1), "new value");
}
@Test
public void testSetGetPermissiveWorkingPropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
assertFalse( b.getPermissiveWorking(), "block not permissive to start");
b.addPropertyChangeListener(listen);
b.setPermissiveWorking(true);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertTrue( b.getPermissiveWorking(), "block permissive set");
assertEquals( Block.BLOCK_PERMISSIVE_CHANGE, listen.getPropertyName(0), "prop ev name");
assertEquals( Boolean.FALSE, listen.getOldValue(0), "old value");
assertEquals( Boolean.TRUE, listen.getNewValue(0), "new value");
b.setPermissiveWorking(true);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setPermissiveWorking(false);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertFalse( b.getPermissiveWorking(), "block not permissive when set");
assertEquals( Block.BLOCK_PERMISSIVE_CHANGE, listen.getPropertyName(1), "prop ev name");
assertEquals( Boolean.TRUE, listen.getOldValue(1), "old value");
assertEquals( Boolean.FALSE, listen.getNewValue(1), "new value");
}
@Test
public void testSetIsGhostPropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
assertFalse( b.getIsGhost(), "block not a ghost to start");
b.addPropertyChangeListener(listen);
b.setIsGhost(true);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertTrue( b.getIsGhost(), "block permissive set");
assertEquals( Block.GHOST_CHANGE, listen.getPropertyName(0), "prop ev name");
assertEquals( Boolean.FALSE, listen.getOldValue(0), "old value");
assertEquals( Boolean.TRUE, listen.getNewValue(0), "new value");
b.setIsGhost(true);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setIsGhost(false);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertFalse( b.getIsGhost(), "block not permissive when set");
assertEquals( Block.GHOST_CHANGE, listen.getPropertyName(1), "prop ev name");
assertEquals( Boolean.TRUE, listen.getOldValue(1), "old value");
assertEquals( Boolean.FALSE, listen.getNewValue(1), "new value");
}
@Test
public void testSetSpeedPropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
String speedA = InstanceManager.getDefault(SignalSpeedMap.class).getValidSpeedNames().firstElement();
String speedB = InstanceManager.getDefault(SignalSpeedMap.class).getValidSpeedNames().lastElement();
assertFalse( speedA.equals(speedB), "Sample speed text needs changing");
b.setBlockSpeed(speedA); // set initial test state
assertEquals( speedA, b.getBlockSpeed(), "block speedA set");
b.addPropertyChangeListener(listen);
b.setBlockSpeed(speedB);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertEquals( speedB, b.getBlockSpeed(), "block speedB set");
assertEquals( Block.BLOCK_SPEED_CHANGE, listen.getPropertyName(0), "prop ev name");
assertEquals( speedA, listen.getOldValue(0), "old value");
assertEquals( speedB, listen.getNewValue(0), "new value");
b.setBlockSpeed(speedB);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setBlockSpeed(speedA);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( speedA, b.getBlockSpeed(), "block speedA set");
assertEquals( Block.BLOCK_SPEED_CHANGE, listen.getPropertyName(1), "prop ev name");
assertEquals( speedB, listen.getOldValue(1), "old value");
assertEquals( speedA, listen.getNewValue(1), "new value");
}
@Test
public void testSetCurvaturePropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
assertEquals( Block.NONE, b.getCurvature(), "no initial curvature");
b.addPropertyChangeListener(listen);
b.setCurvature(Block.TIGHT);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertEquals( Block.BLOCK_CURVATURE_CHANGE, listen.getPropertyName(0), "prop ev name");
assertEquals( Block.NONE, (int)listen.getOldValue(0), "old value");
assertEquals( Block.TIGHT, (int)listen.getNewValue(0), "new value");
b.setCurvature(Block.TIGHT);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setCurvature(Block.GRADUAL);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( Block.BLOCK_CURVATURE_CHANGE, listen.getPropertyName(1), "prop ev name");
assertEquals( Block.TIGHT, (int)listen.getOldValue(1), "old value");
assertEquals( Block.GRADUAL, (int)listen.getNewValue(1), "new value");
}
@Test
public void testSetGetLengthPropertyChange() throws JmriException {
Block b = new Block("BlockSystemName");
Listen listen = new Listen();
assertEquals( 0.0f, b.getLengthMm(), 0, "no initial length mm");
assertEquals( 0.0f, b.getLengthCm(), 0, "no initial length cm");
assertEquals( 0.0f, b.getLengthIn(), 0, "no initial length in");
b.addPropertyChangeListener(listen);
b.setLength(47f);
assertEquals( 1, listen.getNumPropChanges(), "1 property change");
assertEquals( 47.0f, b.getLengthMm(), 0.01, "mm set to 47");
assertEquals( 4.7f, b.getLengthCm(), 0.01, "cm set to 4.7");
assertEquals( 1.850f, b.getLengthIn(), 0.01, "Inches set to ");
assertEquals( Block.BLOCK_LENGTH_CHANGE, listen.getPropertyName(0), "prop ev name");
assertEquals( 0.0f, (float)listen.getOldValue(0),0.01, "old value");
assertEquals( 47.0f, (float)listen.getNewValue(0),0.01, "new value");
b.setLength(47f);
assertEquals( 1, listen.getNumPropChanges(), "list size still 1");
b.setLength(20f);
assertEquals( 2, listen.getNumPropChanges(), "+1 property change");
assertEquals( 20.0f, b.getLengthMm(), 0.001, "mm set to 20");
assertEquals( 2.0f, b.getLengthCm(), 0.001, "cm set to 2.0");
assertEquals( 0.787f, b.getLengthIn(), 0.001, "Inches set to ");
assertEquals( Block.BLOCK_LENGTH_CHANGE, listen.getPropertyName(1), "prop ev name");
assertEquals( 47.0f, (float)listen.getOldValue(1),0.01, "old value");
assertEquals( 20.0f, (float)listen.getNewValue(1),0.01, "new value");
}
@Test
public void testDescribeState() {
Block t = new Block("testDescribeState");
assertEquals("Unknown", t.describeState(Block.UNKNOWN));
assertEquals("Inconsistent", t.describeState(Block.INCONSISTENT));
assertEquals("Occupied", t.describeState(Block.OCCUPIED));
assertEquals("UnOccupied", t.describeState(Block.UNOCCUPIED));
assertEquals("Undetected", t.describeState(Block.UNDETECTED));
assertEquals("Unexpected value: 777", t.describeState(777));
t.dispose();
}
/**
* Class to log Property Changes.
*/
private static class Listen implements PropertyChangeListener {
List<PropertyChangeEvent> propChangeNames = Collections.synchronizedList(new ArrayList<>());
@Override
public void propertyChange(PropertyChangeEvent e) {
propChangeNames.add(e);
}
public int getNumPropChanges(){
return propChangeNames.size();
}
public String getPropertyName(int index){
return propChangeNames.get(index).getPropertyName();
}
public Object getOldValue(int index){
return propChangeNames.get(index).getOldValue();
}
public Object getNewValue(int index){
return propChangeNames.get(index).getNewValue();
}
}
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
JUnitUtil.resetInstanceManager();
JUnitUtil.initInternalSensorManager();
JUnitUtil.initInternalTurnoutManager();
}
@AfterEach
public void tearDown() {
JUnitUtil.tearDown();
}
}