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

553 lines
23 KiB
Java

package jmri.jmrit.roster;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import jmri.InstanceManager;
import jmri.util.*;
import org.jdom2.JDOMException;
import org.junit.jupiter.api.*;
/**
* Tests for the jmrit.roster.RosterEntry class.
*
* @author Bob Jacobsen Copyright (C) 2001, 2002, 2018, 2025
*/
public class RosterEntryTest {
@Test
public void testCreate() {
RosterEntry r = new RosterEntry("file here");
Assertions.assertEquals("file here", r.getFileName(), "file name ");
Assertions.assertEquals("3", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("", r.getRoadName(), "road name ");
Assertions.assertEquals("", r.getRoadNumber(), "road number ");
Assertions.assertEquals("", r.getMfg(), "manufacturer ");
Assertions.assertEquals("", r.getDecoderModel(), "model ");
Assertions.assertEquals("", r.getDecoderFamily(), "family ");
Assertions.assertEquals("", r.getProgrammingModes(), "programmingModes ");
}
@Test
public void testPartialLoad() {
// create Element
org.jdom2.Element e = new org.jdom2.Element("locomotive")
.setAttribute("id", "our id 1")
.setAttribute("fileName", "file here")
.setAttribute("roadNumber", "431")
.setAttribute("roadName", "SP")
.setAttribute("mfg", "Athearn")
.setAttribute("dccAddress", "1234")
.addContent(
new org.jdom2.Element("locoaddress").addContent(
new org.jdom2.Element("dcclocoaddress")
.setAttribute("number", "1234")
.setAttribute("longaddress", "yes")
)
); // end create element
RosterEntry r = new RosterEntry(e);
// check
Assertions.assertEquals("file here", r.getFileName(), "file name ");
Assertions.assertEquals("1234", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("SP", r.getRoadName(), "road name ");
Assertions.assertEquals("431", r.getRoadNumber(), "road number ");
Assertions.assertEquals("Athearn", r.getMfg(), "manufacturer ");
Assertions.assertEquals("", r.getDecoderModel(), "model ");
Assertions.assertEquals("", r.getDecoderFamily(), "family ");
Assertions.assertEquals("", r.getProgrammingModes(), "programmingModes ");
}
@Test
public void testEmptyLoad() {
// create Element
org.jdom2.Element e = new org.jdom2.Element("locomotive")
.setAttribute("id", "our id 2")
.setAttribute("fileName", "file here"); // end create element
RosterEntry r = new RosterEntry(e) {
@Override
protected void warnShortLong(String s) {
}
};
// check
Assertions.assertEquals("file here", r.getFileName(), "file name ");
Assertions.assertEquals("3", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("", r.getRoadName(), "road name ");
Assertions.assertEquals("", r.getRoadNumber(), "road number ");
Assertions.assertEquals("", r.getMfg(), "manufacturer ");
Assertions.assertEquals("", r.getDecoderModel(), "model ");
Assertions.assertEquals("", r.getDecoderFamily(), "family ");
Assertions.assertEquals("", r.getProgrammingModes(), "programmingModes ");
}
@Test
public void testFullLoad() {
// create Element
org.jdom2.Element e = new org.jdom2.Element("locomotive")
.setAttribute("id", "our id 3")
.setAttribute("fileName", "file here")
.setAttribute("roadNumber", "431")
.setAttribute("roadName", "SP")
.setAttribute("mfg", "Athearn")
.setAttribute("dccAddress", "1234")
.setAttribute("decoderModes", "AMODE")
.addContent(new org.jdom2.Element("decoder")
.setAttribute("family", "91")
.setAttribute("model", "33")
); // end create element
RosterEntry r = new RosterEntry(e) {
@Override
protected void warnShortLong(String s) {
}
};
// check
Assertions.assertEquals("file here", r.getFileName(), "file name ");
Assertions.assertEquals("1234", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("SP", r.getRoadName(), "road name ");
Assertions.assertEquals("431", r.getRoadNumber(), "road number ");
Assertions.assertEquals("Athearn", r.getMfg(), "manufacturer ");
Assertions.assertEquals("33", r.getDecoderModel(), "model ");
Assertions.assertEquals("91", r.getDecoderFamily(), "family ");
Assertions.assertEquals("AMODE", r.getProgrammingModes(), "programmingModes ");
}
@Test
public void testFromSchemaFile() throws JDOMException, IOException {
// Create a RosterEntry from a test xml file
// This one references the Schema version
RosterEntry r = RosterEntry.fromFile(new File("java/test/jmri/jmrit/roster/ACL1012-Schema.xml"));
// check for various values
Assertions.assertEquals("ACL1012-Schema.xml", r.getFileName(), "file name ");
Assertions.assertEquals("1012", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("Atlantic Coast Line", r.getRoadName(), "road name ");
Assertions.assertEquals("1012", r.getRoadNumber(), "road number ");
Assertions.assertEquals("Synch Diesel Sound 1812 - N Scale Atlas Short Board Dropin", r.getDecoderModel(), "model ");
Assertions.assertEquals("Brilliance Sound Decoders", r.getDecoderFamily(), "family ");
}
@Test
public void testFromDtdFile() throws JDOMException, IOException {
// Create a RosterEntry from a test xml file
// This one references the DTD to make sure that still works
// post migration
RosterEntry r = RosterEntry.fromFile(new File("java/test/jmri/jmrit/roster/ACL1012-DTD.xml"));
// check for various values
Assertions.assertEquals("ACL1012-DTD.xml", r.getFileName(), "file name ");
Assertions.assertEquals("1012", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("Atlantic Coast Line", r.getRoadName(), "road name ");
Assertions.assertEquals("1012", r.getRoadNumber(), "road number ");
Assertions.assertEquals("Synch Diesel Sound 1812 - N Scale Atlas Short Board Dropin", r.getDecoderModel(), "model ");
Assertions.assertEquals("Brilliance Sound Decoders", r.getDecoderFamily(), "family ");
Assertions.assertEquals("", r.getProgrammingModes(), "programmingModes ");
}
@Test
public void testFromExistingEntry() throws JDOMException, IOException {
RosterEntry re = new RosterEntry(RosterEntry.fromFile(
new File("java/test/jmri/jmrit/roster/ACL1012-Schema.xml")),"New pID");
Assertions.assertNotNull(re);
Assertions.assertEquals( "New pID", re.getId());
Assertions.assertNull( re.getFileName(), "no file name");
Assertions.assertEquals( "1012", re.getDccAddress(), "DCC Address");
Assertions.assertEquals( "Atlantic Coast Line", re.getRoadName(), "road name");
Assertions.assertEquals( "1012", re.getRoadNumber(), "road number");
Assertions.assertEquals( "Synch Diesel Sound 1812 - N Scale Atlas Short Board Dropin", re.getDecoderModel());
Assertions.assertEquals( "Brilliance Sound Decoders", re.getDecoderFamily(), "family");
}
@Test
public void testStoreFunctionLabel() {
RosterEntry r = new RosterEntry("file here");
r.setFunctionLabel(3, "tree");
Assertions.assertEquals("tree", r.getFunctionLabel(3));
Assertions.assertNull(r.getFunctionLabel(4));
}
@Test
public void testModifyDateUnparseable() {
RosterEntry r = new RosterEntry("file here");
r.setId("test Id");
r.setDateUpdated("unparseable date");
jmri.util.JUnitAppender.assertWarnMessage("Unable to parse \"unparseable date\" as a date in roster entry \"test Id\".");
}
@Test
public void testDateFormatHistoric() {
RosterEntry r = new RosterEntry("file here");
r.setId("test Id");
TimeZone tz = TimeZone.getDefault();
try {
TimeZone.setDefault(TimeZone.getTimeZone("GMT-7"));
r.setDateUpdated("03-Oct-2015 11:19:12"); // this is in local time
} finally {
TimeZone.setDefault(tz);
}
Assertions.assertTrue(JUnitAppender.verifyNoBacklog());
Assertions.assertEquals("2015-10-03T18:19:12.000+00:00", r.getDateUpdated());
}
@Test
public void testDateFormatISO() {
RosterEntry r = new RosterEntry("file here");
r.setId("test Id");
r.setDateUpdated("2018-03-05T02:34:55Z");
Assertions.assertTrue(JUnitAppender.verifyNoBacklog());
Assertions.assertEquals("2018-03-05T02:34:55.000+00:00", r.getDateUpdated());
}
@Test
public void testDateFormatPreviousJackson() {
RosterEntry r = new RosterEntry("file here");
r.setId("test Id");
r.setDateUpdated("2018-03-05T02:34:55.000+0000");
Assertions.assertTrue(JUnitAppender.verifyNoBacklog());
Assertions.assertEquals("2018-03-05T02:34:55.000+00:00", r.getDateUpdated());
}
@Test
public void testDateFormatTraditional() throws java.text.ParseException {
RosterEntry r = new RosterEntry("file here");
r.setId("test Id");
TimeZone tz = TimeZone.getDefault();
try {
TimeZone.setDefault(TimeZone.getTimeZone("GMT-7"));
r.setDateUpdated("Mar 2, 2016 9:57:04 AM"); // this is in local time
} finally {
TimeZone.setDefault(tz);
}
Assertions.assertTrue(JUnitAppender.verifyNoBacklog());
// convert that same local time in ISO format and compare
Assertions.assertEquals("2016-03-02T16:57:04.000+00:00", r.getDateUpdated());
}
@Test
public void testStoreFunctionLockable() {
RosterEntry r = new RosterEntry("file here");
r.setFunctionLabel(3, "tree");
r.setFunctionLockable(3, true);
r.setFunctionLabel(4, "fort");
r.setFunctionLockable(4, false);
Assertions.assertEquals("tree", r.getFunctionLabel(3));
Assertions.assertTrue(r.getFunctionLockable(3));
Assertions.assertEquals("fort", r.getFunctionLabel(4));
Assertions.assertFalse(r.getFunctionLockable(4));
Assertions.assertNull(r.getFunctionLabel(5));
}
@Test
public void testSetAndGet() {
RosterEntry r = new RosterEntry("file here");
r.setId("New One");
r.setDccAddress("6");
r.setRoadName("SNCF");
r.setRoadNumber("3601");
r.setMfg("Lima");
r.setDeveloperID("23");
r.setManufacturerID("100");
r.setProgrammingModes("A,B");
r.setComment("notes");
r.setDecoderFamily("fam1");
r.setDecoderModel("model A");
Assertions.assertEquals("file here", r.getFileName(), "file name ");
Assertions.assertEquals("New One", r.getId(), "ID ");
Assertions.assertEquals("6", r.getDccAddress(), "DCC Address ");
Assertions.assertEquals("SNCF", r.getRoadName(), "road name ");
Assertions.assertEquals("3601", r.getRoadNumber(), "road number ");
Assertions.assertEquals("Lima", r.getMfg(), "manufacturer ");
Assertions.assertEquals("23", r.getDeveloperID(), "developerID ");
Assertions.assertEquals("100", r.getManufacturerID(), "manufacturer ID ");
Assertions.assertEquals("A,B", r.getProgrammingModes(), "programming modes ");
Assertions.assertEquals("notes", r.getComment(), "comment ");
Assertions.assertEquals("fam1", r.getDecoderFamily(), "family ");
Assertions.assertEquals("model A", r.getDecoderModel(), "model ");
}
@Test
public void testXmlLoadStore() {
// create Element
org.jdom2.Element e = new org.jdom2.Element("locomotive")
.setAttribute("id", "our id 4")
.setAttribute("fileName", "file here")
.setAttribute("roadNumber", "431")
.setAttribute("roadName", "SP")
.setAttribute("mfg", "Athearn")
.setAttribute("dccAddress", "1234")
.addContent(new org.jdom2.Element("decoder")
.setAttribute("family", "91")
.setAttribute("model", "33")
.setAttribute("comment", "decoder comment")
); // end create element
RosterEntry r = new RosterEntry(e) {
@Override
protected void warnShortLong(String s) {
}
};
org.jdom2.Element o = r.store();
// check
Assertions.assertEquals(e.toString(), o.toString(), "XML Element ");
Assertions.assertEquals("91", o.getChild("decoder").getAttribute("family").getValue(), "family ");
Assertions.assertEquals("33", o.getChild("decoder").getAttribute("model").getValue(), "model ");
Assertions.assertEquals("decoder comment", o.getChild("decoder").getAttribute("comment").getValue(), "comment");
Assertions.assertEquals("28", o.getChild("decoder").getAttribute("maxFnNum").getValue(), "default maxFnNum ");
}
@Test
public void testXmlFunctionLabelsLoadStore() {
// create Element
org.jdom2.Element e = new org.jdom2.Element("locomotive")
.setAttribute("id", "our id 4")
.setAttribute("fileName", "file here")
.setAttribute("roadNumber", "431")
.setAttribute("roadName", "SP")
.setAttribute("mfg", "Athearn")
.setAttribute("dccAddress", "1234")
.setAttribute("decoderModes", "BMODE")
.addContent(new org.jdom2.Element("decoder")
.setAttribute("family", "91")
.setAttribute("model", "33")
)
.addContent(new org.jdom2.Element("functionlabels")
.addContent(new org.jdom2.Element("functionlabel")
.setAttribute("num", "2")
.setAttribute("lockable", "true")
.addContent("label 2")
)
.addContent(new org.jdom2.Element("functionlabel")
.setAttribute("num", "3")
.setAttribute("lockable", "false")
.addContent("label 3")
)
); // end create element
RosterEntry r = new RosterEntry(e) {
@Override
protected void warnShortLong(String s) {
}
};
// check loaded
Assertions.assertNull(r.getFunctionLabel(1));
Assertions.assertEquals("label 2", r.getFunctionLabel(2));
Assertions.assertTrue(r.getFunctionLockable(2), "lockable 2");
Assertions.assertEquals("label 3", r.getFunctionLabel(3));
Assertions.assertFalse(r.getFunctionLockable(3), "lockable 2");
Assertions.assertNull(r.getFunctionLabel(4));
org.jdom2.Element o = r.store();
// check stored element
Assertions.assertEquals("2", o.getChild("functionlabels").getChild("functionlabel").getAttribute("num").getValue(), "num 2");
Assertions.assertEquals("true", o.getChild("functionlabels").getChild("functionlabel").getAttribute("lockable").getValue(), "lockable 2");
Assertions.assertEquals("label 2", o.getChild("functionlabels").getChild("functionlabel").getText(), "label 2");
}
@Test
public void testEnsureFilenameExistsNew() {
RosterEntry r = new RosterEntry();
Assertions.assertNull(r.getFileName(), "initial filename ");
r.setId("test Roster Entry 123456789ABC");
Assertions.assertEquals("test Roster Entry 123456789ABC", r.getId(), "initial ID ");
File f = new File(Roster.getDefault().getRosterFilesLocation() + "test_Roster_Entry_123456789ABC.xml");
if (f.exists()) {
Assertions.assertTrue(f.delete());
}
r.ensureFilenameExists();
Assertions.assertEquals("test_Roster_Entry_123456789ABC.xml", r.getFileName(), "final filename ");
if (f.exists()) {
Assertions.assertTrue(f.delete()); // clean up afterwards
}
}
@Test
public void testEnsureFilenameExistsOld() throws IOException {
FileUtil.createDirectory(Roster.getDefault().getRosterFilesLocation());
RosterEntry r = new RosterEntry();
Assertions.assertNull(r.getFileName(), "initial filename ");
r.setId("test Roster Entry 123456789ABC");
Assertions.assertEquals("test Roster Entry 123456789ABC", r.getId(), "initial ID ");
File f1 = new File(Roster.getDefault().getRosterFilesLocation() + "test_Roster_Entry_123456789ABC.xml");
if (!f1.exists()) {
try ( FileOutputStream f = new FileOutputStream(f1)) { // create a dummy
f.write(0);
}
}
File f2 = new File(Roster.getDefault().getRosterFilesLocation() + "test_Roster_Entry_123456789ABC0.xml");
if (!f2.exists()) {
try ( FileOutputStream f = new FileOutputStream(f2)) { // create a dummy
f.write(0);
}
}
r.ensureFilenameExists();
Assertions.assertEquals("test_Roster_Entry_123456789ABC1.xml", r.getFileName(), "final filename ");
if (f1.exists()) {
Assertions.assertTrue(f1.delete()); // clean up afterwards
}
if (f2.exists()) {
Assertions.assertTrue(f2.delete());
}
}
@Test
public void testNoAttribute() {
RosterEntry r = new RosterEntry();
Assertions.assertNull(r.getAttribute("foo"));
}
@Test
public void testOneAttribute() {
RosterEntry r = new RosterEntry();
r.putAttribute("foo", "bar");
Assertions.assertEquals("bar", r.getAttribute("foo"));
}
@Test
public void testReplaceAttribute() {
RosterEntry r = new RosterEntry();
r.putAttribute("foo", "bar");
r.putAttribute("foo", "a nicer bar");
Assertions.assertEquals("a nicer bar", r.getAttribute("foo"));
}
@Test
public void testNullAttributeValue() {
RosterEntry r = new RosterEntry();
r.putAttribute("foo", "bar");
r.putAttribute("foo", null);
Assertions.assertNull(r.getAttribute("foo"));
}
@Test
public void testAttributeList() {
RosterEntry r = new RosterEntry();
r.putAttribute("key 2", "value 2");
r.putAttribute("key 3", "value 3");
r.putAttribute("key 1", "value 1");
java.util.Set<String> l = r.getAttributes();
Assertions.assertEquals(3, l.size(), "number returned");
java.util.Iterator<String> i = l.iterator();
Assertions.assertEquals("key 1", i.next(), "1st item");
Assertions.assertEquals("key 2", i.next(), "2nd item");
Assertions.assertEquals("key 3", i.next(), "3rd item");
Assertions.assertFalse(i.hasNext());
}
@Test
public void testXmlAttributesLoadStore() {
// create Element
org.jdom2.Element e = new org.jdom2.Element("locomotive")
.setAttribute("id", "our id 4")
.setAttribute("fileName", "file here")
.setAttribute("roadNumber", "431")
.setAttribute("roadName", "SP")
.setAttribute("mfg", "Athearn")
.setAttribute("dccAddress", "1234")
.addContent(new org.jdom2.Element("decoder")
.setAttribute("family", "91")
.setAttribute("model", "33")
)
.addContent(new org.jdom2.Element("attributepairs")
.addContent(new org.jdom2.Element("keyvaluepair")
.addContent(new org.jdom2.Element("key")
.addContent("key 1")
)
.addContent(new org.jdom2.Element("value")
.addContent("value 1")
)
)
.addContent(new org.jdom2.Element("keyvaluepair")
.addContent(new org.jdom2.Element("key")
.addContent("key 2")
)
.addContent(new org.jdom2.Element("value")
.addContent("value 2")
)
)
); // end create element
RosterEntry r = new RosterEntry(e) {
@Override
protected void warnShortLong(String s) {
}
};
Assertions.assertEquals("value 1", r.getAttribute("key 1"));
Assertions.assertEquals("value 2", r.getAttribute("key 2"));
Assertions.assertNull(r.getAttribute("key 4"));
}
@Test
public void testStoreAttribute() {
RosterEntry r = new RosterEntry("dummy filename");
r.putAttribute("foo", "bar");
org.jdom2.Element e = r.store();
Assertions.assertNotNull(e);
Assertions.assertNotNull(e.getChild("attributepairs"));
Assertions.assertNotNull(e.getChild("attributepairs")
.getChild("keyvaluepair"));
Assertions.assertNotNull(e.getChild("attributepairs")
.getChild("keyvaluepair")
.getChild("key"));
Assertions.assertNotNull(e.getChild("attributepairs")
.getChild("keyvaluepair")
.getChild("value"));
Assertions.assertEquals("foo", e.getChild("attributepairs")
.getChild("keyvaluepair")
.getChild("key").getText());
Assertions.assertNotNull(e.getChild("attributepairs")
.getChild("keyvaluepair")
.getChild("value").getText(), "bar");
}
@Test
public void testToString() {
Assertions.assertEquals("[RosterEntry: id 3 file here SP 431 Athearn 14 35 91 ]",
RosterEntryImplementations.id3().toString());
}
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
jmri.util.JUnitUtil.resetProfileManager();
InstanceManager.setDefault(RosterConfigManager.class, new RosterConfigManager());
}
@AfterEach
public void tearDown() {
JUnitUtil.tearDown();
}
}