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

187 lines
6.2 KiB
Java

package jmri.jmrix;
import java.beans.PropertyChangeListener;
import jmri.JmriException;
import jmri.PowerManager;
import org.junit.Assert;
import org.junit.jupiter.api.*;
/**
* Abstract base class for PowerManager tests in specific jmrix. packages.
*
* This is not itself a test class, e.g. should not be added to a suite.
* Instead, this forms the base for test classes, including providing some
* common tests.
*
* @author Bob Jacobsen Copyright 2007
* @author Bob Jacobsen Copyright (C) 2017
*/
public abstract class AbstractPowerManagerTestBase {
// required setup routine, must set p to an appropriate value.
abstract public void setUp();
// service routines to simulate receiving on, off from interface
protected abstract void hearOn();
protected abstract void hearOff();
protected abstract void hearIdle();
protected abstract void sendOnReply(); // get a reply to On command from layout
protected abstract void sendOffReply(); // get a reply to Off command from layout
protected abstract void sendIdleReply();
protected abstract int numListeners();
protected abstract int outboundSize();
protected abstract boolean outboundOnOK(int index);
protected abstract boolean outboundOffOK(int index);
protected abstract boolean outboundIdleOK(int index);
protected PowerManager p = null; // holds objects under test
protected boolean listenerResult = false;
protected class Listen implements PropertyChangeListener {
@Override
public void propertyChange(java.beans.PropertyChangeEvent e) {
listenerResult = true;
}
}
// test creation - real work is in the setup() routine
@Test
public void testCreate() {
Assert.assertNotNull("Power Manager Created",p);
}
// test setting power on, off, then getting reply from system
@Test
public void testSetPowerOn() throws JmriException {
int initialSent = outboundSize();
p.setPower(PowerManager.ON);
// check one message sent, correct form, unknown state
Assert.assertEquals("messages sent", initialSent + 1, outboundSize());
Assert.assertTrue("message type OK", outboundOnOK(initialSent));
Assert.assertEquals("state before reply ", PowerManager.UNKNOWN, p.getPower());
// arrange for reply
sendOnReply();
Assert.assertEquals("state after reply ", PowerManager.ON, p.getPower());
}
@Test
public void testSetPowerOff() throws JmriException {
int startingMessages = outboundSize();
p.setPower(PowerManager.OFF);
// check one message sent, correct form
Assert.assertEquals("messages sent", startingMessages + 1, outboundSize());
Assert.assertTrue("message type OK", outboundOffOK(startingMessages));
Assert.assertEquals("state before reply ", PowerManager.UNKNOWN, p.getPower());
// arrange for reply
sendOffReply();
Assert.assertEquals("state after reply ", PowerManager.OFF, p.getPower());
}
@Test
public void testSetPowerIdle() throws JmriException {
if (p.implementsIdle()) {
Assert.assertTrue("LocoNet implements IDLE", p.implementsIdle());
int initialSent = outboundSize();
p.setPower(PowerManager.IDLE);
// check one message sent, correct form, unknown state
Assert.assertEquals("messages sent", initialSent + 1, outboundSize());
Assert.assertTrue("message type IDLE O.K.", outboundIdleOK(initialSent));
Assert.assertEquals("state before reply ", PowerManager.UNKNOWN, p.getPower());
// arrange for reply
sendIdleReply();
Assert.assertEquals("state after reply ", PowerManager.IDLE, p.getPower());
}
}
@Test
public void testStateOn() throws JmriException {
hearOn();
Assert.assertEquals("power state", PowerManager.ON, p.getPower());
}
@Test
public void testStateOff() throws JmriException {
hearOff();
Assert.assertEquals("power state", PowerManager.OFF, p.getPower());
}
@Test
public void testStateIdle() throws JmriException {
if (p.implementsIdle()) {
hearIdle();
Assert.assertEquals("power state", PowerManager.IDLE, p.getPower());
}
}
@Test
public void testAddListener() throws JmriException {
p.addPropertyChangeListener(new Listen());
listenerResult = false;
p.setPower(PowerManager.ON);
sendOnReply();
Assert.assertTrue("listener invoked by GPOFF", listenerResult);
listenerResult = false;
p.setPower(PowerManager.OFF);
sendOffReply();
Assert.assertTrue("listener invoked by GPON", listenerResult);
}
@Test
public void testRemoveListener() {
Listen ln = new Listen();
p.addPropertyChangeListener(ln);
p.removePropertyChangeListener(ln);
listenerResult = false;
hearOn();
Assert.assertFalse("listener should not have heard message after removeListener",
listenerResult);
}
@Test
public void testDispose1() throws JmriException {
p.setPower(PowerManager.ON); // in case registration is deferred
int startingListeners = numListeners();
p.dispose();
Assert.assertEquals("controller listeners remaining", startingListeners -1 , numListeners());
}
@Test
public void testDispose2() throws JmriException {
p.addPropertyChangeListener(new Listen());
p.setPower(PowerManager.ON);
sendOnReply();
int initialOutboundSize = outboundSize();
p.dispose();
try {
p.setPower(PowerManager.OFF);
} catch (JmriException e) {
// this is OK branch, check message not sent
Assert.assertEquals("messages sent", initialOutboundSize, outboundSize()); // just the first
return;
}
Assert.fail("Should have thrown exception after dispose()");
}
@Test
public void testImplementsIdle() {
// assumes that Idle is not implemented; override this test for cases
// where idle is implemented.
Assert.assertFalse(p.implementsIdle());
}
}