Files
JIMRI/java/test/jmri/jmrix/roco/z21/Z21XNetTurnoutTest.java
2026-06-17 14:00:51 +02:00

241 lines
8.5 KiB
Java

package jmri.jmrix.roco.z21;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import jmri.Turnout;
import jmri.jmrix.lenz.XNetInterfaceScaffold;
import jmri.jmrix.lenz.XNetReply;
import jmri.jmrix.lenz.XNetTurnout;
import jmri.util.JUnitUtil;
import org.junit.jupiter.api.*;
/**
* Tests for the {@link jmri.jmrix.roco.z21.Z21XNetTurnout} class.
*
* @author Bob Jacobsen
* @author Paul Bender Copyright (C) 2016
*/
public class Z21XNetTurnoutTest extends jmri.jmrix.lenz.XNetTurnoutTest {
@Override
public void checkClosedMsgSent() {
assertEquals( "53 00 14 88 CF",
lnis.outbound.elementAt(lnis.outbound.size() - 1).toString(),
"closed message");
}
@Override
public void checkThrownMsgSent() {
assertEquals( "53 00 14 89 CE",
lnis.outbound.elementAt(lnis.outbound.size() - 1).toString(),
"thrown message");
}
@Override
protected void checkClosedOffSent() {
assertEquals( "53 00 14 80 C7",
lnis.outbound.elementAt(lnis.outbound.size() - 1).toString(),
"thrown message");
}
@Override
protected void checkThrownOffSent() {
assertEquals( "53 00 14 81 C6",
lnis.outbound.elementAt(lnis.outbound.size() - 1).toString(),
"thrown message");
}
// Test the Z21XNetTurnout message sequence.
@Test
@Override
public void testXNetTurnoutMsgSequence() {
t.setFeedbackMode(jmri.Turnout.DIRECT);
// prepare an interface
// set closed
assertDoesNotThrow( () -> t.setCommandedState( Turnout.CLOSED),
"TO exception: ");
assertEquals(Turnout.CLOSED, t.getCommandedState());
assertEquals( "53 00 14 88 CF",
lnis.outbound.elementAt(lnis.outbound.size() - 1).toString(),
"on message sent");
((Z21XNetTurnout)t).message(lnis.outbound.elementAt(lnis.outbound.size()-1));
// notify that the command station received the reply
XNetReply m = new XNetReply();
m.setElement(0, 0x43);
m.setElement(1, 0x00);
m.setElement(2, 0x14);
m.setElement(3, 0x00); // set CLOSED
m.setElement(4, 0x56);
int n = lnis.outbound.size();
((jmri.jmrix.roco.z21.Z21XNetTurnout) t).message(m);
JUnitUtil.waitFor( () -> n != lnis.outbound.size(), "Wait for outbound size to change");
assertEquals( "53 00 14 80 C7",
lnis.outbound.elementAt(n).toString(),
"off message sent");
((Z21XNetTurnout)t).message(lnis.outbound.elementAt(lnis.outbound.size()-1));
// the turnout will not set its state until it sees a reply message.
m = new XNetReply();
m.setElement(0, 0x43);
m.setElement(1, 0x00);
m.setElement(2, 0x14);
m.setElement(3, 0x00);
m.setElement(4, 0x56);
((jmri.jmrix.roco.z21.Z21XNetTurnout) t).message(m);
// no wait here. The last reply should cause the turnout to
// set it's state, but it will not cause another reply.
assertEquals(Turnout.CLOSED, t.getKnownState());
}
// Test that property change events are properly sent from the parent
// to the propertyChange listener (this handles events for one sensor
// and twosensor feedback).
@Test
@Override
public void testXNetTurnoutPropertyChange() {
// prepare an interface
JUnitUtil.resetInstanceManager();
JUnitUtil.initInternalSensorManager();
t = new Z21XNetTurnout("X", 21, lnis);
// set thrown
assertDoesNotThrow( () -> t.setCommandedState( Turnout.THROWN),
"TO exception: ");
assertEquals(Turnout.THROWN, t.getCommandedState());
t.setFeedbackMode( Turnout.ONESENSOR);
jmri.Sensor s = jmri.InstanceManager.sensorManagerInstance().provideSensor("IS1");
assertDoesNotThrow( () -> {
s.setState(jmri.Sensor.INACTIVE);
t.provideFirstFeedbackSensor("IS1");
}, "TO exception: ");
assertDoesNotThrow( () -> s.setState(jmri.Sensor.ACTIVE),
"SO exception: ");
// check to see if the turnout state changes.
assertEquals(Turnout.THROWN, t.getKnownState());
}
@Test
@Override
public void testDirectFeedback() {
t.setFeedbackMode(Turnout.DIRECT);
assertEquals( Turnout.DIRECT, t.getFeedbackMode(),
"Feedback Mode after set");
listenStatus = Turnout.UNKNOWN;
t.addPropertyChangeListener(new Listen());
// Check that state changes appropriately
t.setCommandedState(Turnout.THROWN);
checkThrownMsgSent();
((jmri.jmrix.lenz.XNetTurnout) t).message(lnis.outbound.elementAt(lnis.outbound.size()-1));
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkThrownOffSent();
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkThrownOffSent();
JUnitUtil.waitFor(() -> listenStatus != Turnout.UNKNOWN, "Turnout state changed");
assertEquals(Turnout.THROWN,t.getState());
assertEquals( Turnout.THROWN, listenStatus,
"listener notified of change for DIRECT feedback");
listenStatus = Turnout.UNKNOWN;
t.setCommandedState(Turnout.CLOSED);
checkClosedMsgSent();
((jmri.jmrix.lenz.XNetTurnout) t).message(lnis.outbound.elementAt(lnis.outbound.size()-1));
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkClosedOffSent();
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkClosedOffSent();
JUnitUtil.waitFor(() -> listenStatus != Turnout.UNKNOWN, "Turnout state changed");
assertEquals(Turnout.CLOSED,t.getState());
assertEquals( Turnout.CLOSED, listenStatus,
"listener notified of change for DIRECT feedback");
}
@Override
@Test
public void testMonitoringFeedback() {
assertEquals( Turnout.MONITORING, t.getFeedbackMode(),
"Feedback Mode after set");
listenStatus = Turnout.UNKNOWN;
t.addPropertyChangeListener(new Listen());
// Check that state changes appropriately
t.setCommandedState(Turnout.THROWN);
checkThrownMsgSent();
((jmri.jmrix.lenz.XNetTurnout) t).message(lnis.outbound.elementAt(lnis.outbound.size()-1));
((XNetTurnout) t).message(new XNetReply("42 05 02 46"));
checkThrownOffSent();
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkThrownOffSent();
((XNetTurnout) t).message(new XNetReply("01 04 05"));
JUnitUtil.waitFor(() -> listenStatus != Turnout.UNKNOWN, "Turnout state changed");
assertEquals(Turnout.THROWN,t.getState());
assertEquals( Turnout.THROWN, listenStatus,
"listener notified of change for DIRECT feedback");
listenStatus = Turnout.UNKNOWN;
t.setCommandedState(Turnout.CLOSED);
checkClosedMsgSent();
((jmri.jmrix.lenz.XNetTurnout) t).message(lnis.outbound.elementAt(lnis.outbound.size()-1));
((XNetTurnout) t).message(new XNetReply("42 05 01 46"));
checkClosedOffSent();
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkClosedOffSent();
((XNetTurnout) t).message(new XNetReply("01 04 05"));
checkClosedOffSent();
JUnitUtil.waitFor(() -> listenStatus != Turnout.UNKNOWN, "Turnout state changed");
assertEquals(Turnout.CLOSED,t.getState());
assertEquals( Turnout.CLOSED, listenStatus,
"listener notified of change for DIRECT feedback");
}
@Test
@Override
public void testDispose() {
t.setCommandedState( Turnout.CLOSED);
// in case registration with TrafficController is deferred to after first use
t.dispose();
assertEquals( 1, numListeners(), "controller listeners remaining");
}
@BeforeEach
@Override
public void setUp() {
JUnitUtil.setUp();
// prepare an interface
lnis = new XNetInterfaceScaffold(new RocoZ21CommandStation());
t = new Z21XNetTurnout("X", 21, lnis);
jmri.InstanceManager.store(new jmri.NamedBeanHandleManager(), jmri.NamedBeanHandleManager.class);
}
@AfterEach
@Override
public void tearDown() {
lnis.terminateThreads();
lnis = null;
JUnitUtil.tearDown();
}
// private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Z21XNetTurnoutTest.class);
}