402 lines
18 KiB
Java
402 lines
18 KiB
Java
package jmri.jmrit.decoderdefn;
|
|
|
|
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.assertTrue;
|
|
|
|
import javax.swing.JLabel;
|
|
|
|
import jmri.jmrit.symbolicprog.CvTableModel;
|
|
import jmri.jmrit.symbolicprog.VariableTableModel;
|
|
import jmri.progdebugger.ProgDebugger;
|
|
import jmri.util.JUnitUtil;
|
|
import jmri.util.junit.annotations.ToDo;
|
|
|
|
import org.jdom2.DocType;
|
|
import org.jdom2.Document;
|
|
import org.jdom2.Element;
|
|
import org.junit.jupiter.api.*;
|
|
|
|
/**
|
|
* DecoderFileTest.java
|
|
*
|
|
* @author Bob Jacobsen, Copyright (C) 2001, 2002, 2025
|
|
*/
|
|
public class DecoderFileTest {
|
|
|
|
private ProgDebugger p = new ProgDebugger();
|
|
|
|
@Test
|
|
public void testSingleVersionNumber() {
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "23", "24",
|
|
"family", "filename", 16, 3, null);
|
|
d.setOneVersion(18);
|
|
assertTrue(d.isVersion(18), "single 18 OK");
|
|
assertFalse(d.isVersion(19), "single 19 not OK");
|
|
}
|
|
|
|
@Test
|
|
public void testRangeVersionNumber() {
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "24", "25",
|
|
"family", "filename", 16, 3, null);
|
|
d.setVersionRange(18, 22);
|
|
assertFalse(d.isVersion(17), "single 17 not OK");
|
|
assertTrue(d.isVersion(18), "single 18 OK");
|
|
assertTrue(d.isVersion(19), "single 19 OK");
|
|
assertTrue(d.isVersion(20), "single 20 OK");
|
|
assertTrue(d.isVersion(21), "single 21 OK");
|
|
assertTrue(d.isVersion(22), "single 22 OK");
|
|
assertFalse(d.isVersion(23), "single 23 not OK");
|
|
}
|
|
|
|
@Test
|
|
public void testCtorRange() {
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "18", "22",
|
|
"family", "filename", 16, 3, null);
|
|
assertFalse(d.isVersion(17), "single 17 not OK");
|
|
assertTrue(d.isVersion(18), "single 18 OK");
|
|
assertTrue(d.isVersion(19), "single 19 OK");
|
|
assertTrue(d.isVersion(20), "single 20 OK");
|
|
assertTrue(d.isVersion(21), "single 21 OK");
|
|
assertTrue(d.isVersion(22), "single 22 OK");
|
|
assertFalse(d.isVersion(23), "single 23 not OK");
|
|
}
|
|
|
|
@Test
|
|
public void testCtorLow() {
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "18", null,
|
|
"family", "filename", 16, 3, null);
|
|
assertFalse(d.isVersion(17), "single 17 not OK");
|
|
assertTrue(d.isVersion(18), "single 18 OK");
|
|
assertFalse(d.isVersion(19), "single 19 not OK");
|
|
}
|
|
|
|
@Test
|
|
public void testCtorHigh() {
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", null, "18",
|
|
"family", "filename", 16, 3, null);
|
|
assertFalse(d.isVersion(17), "single 17 not OK");
|
|
assertTrue(d.isVersion(18), "single 18 OK");
|
|
assertFalse(d.isVersion(19), "single 19 not OK");
|
|
}
|
|
|
|
@Test
|
|
public void testSeveralSingleVersionNumber() {
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "23", "24",
|
|
"family", "filename", 16, 3, null);
|
|
d.setOneVersion(18);
|
|
assertTrue(d.isVersion(18), "single 18 OK");
|
|
assertFalse(d.isVersion(19), "single 19 not OK");
|
|
d.setOneVersion(19);
|
|
assertTrue(d.isVersion(19), "single 19 OK");
|
|
assertFalse(d.isVersion(21), "single 21 not OK");
|
|
d.setOneVersion(21);
|
|
assertTrue(d.isVersion(21), "single 21 OK");
|
|
}
|
|
|
|
@Test
|
|
public void testMfgName() {
|
|
setupDecoder();
|
|
assertEquals("Digitrax", DecoderFile.getMfgName(decoder), "mfg name ");
|
|
}
|
|
|
|
@Test
|
|
public void testModes() {
|
|
setupDecoder();
|
|
assertEquals("AMODE", DecoderFile.getProgrammingModes(decoder), "programming mode ");
|
|
}
|
|
|
|
@Test
|
|
public void testLoadTable() {
|
|
setupDecoder();
|
|
|
|
// this test should probably be done in terms of a test class instead of the real one...
|
|
JLabel progStatus = new JLabel(" OK ");
|
|
CvTableModel cvModel = new CvTableModel(progStatus, p);
|
|
VariableTableModel variableModel = new VariableTableModel(progStatus,
|
|
new String[]{"Name", "Value"}, cvModel);
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "23", "24",
|
|
"family", "filename", 16, 16, null);
|
|
|
|
d.loadVariableModel(decoder, variableModel);
|
|
assertEquals(3, variableModel.getRowCount(), "read rows ");
|
|
assertEquals("Address", variableModel.getLabel(0), "first row name ");
|
|
assertEquals("Normal direction of motion", variableModel.getLabel(2), "third row name ");
|
|
}
|
|
|
|
@Test
|
|
public void testIncludeCheck() {
|
|
Element e;
|
|
// test some examples
|
|
e = new Element("Test");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "", ""), "1 in null");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "1,2");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "", ""), "1 in 1,2");
|
|
assertTrue(DecoderFile.isIncluded(e, "2", "model", "family", "", ""), "2 in 1,2");
|
|
assertFalse(DecoderFile.isIncluded(e, "3", "model", "family", "", ""), "3 in 1,2");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "105,205");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 in 105,205");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "205,105");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 in 205,105");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "1050,205");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 not in 1050,205");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "50,1050");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 not in 50,1050");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "827004,827008,827104,827108,827106,828043,828045,828047");
|
|
assertTrue(DecoderFile.isIncluded(e, "827004", "model", "family", "", ""), "827004");
|
|
assertFalse(DecoderFile.isIncluded(e, "827005", "model", "family", "", ""), "Not 827005");
|
|
assertTrue(DecoderFile.isIncluded(e, "827108", "model", "family", "", ""), "827108");
|
|
}
|
|
|
|
@Test
|
|
public void testIncludeCheckRippleDown() {
|
|
Element e;
|
|
|
|
// with nothing in element
|
|
e = new Element("Test");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "1,2", ""), "1 in 1,2");
|
|
assertTrue(DecoderFile.isIncluded(e, "2", "model", "family", "1,2", ""), "2 in 1,2");
|
|
assertFalse(DecoderFile.isIncluded(e, "3", "model", "family", "1,2", ""), "3 in 1,2");
|
|
|
|
// with irrelevant element
|
|
(e = new Element("Test")).setAttribute("include", "4,5");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "1,2", ""), "1 in 1,2");
|
|
assertTrue(DecoderFile.isIncluded(e, "2", "model", "family", "1,2", ""), "2 in 1,2");
|
|
assertFalse(DecoderFile.isIncluded(e, "3", "model", "family", "1,2", ""), "3 in 1,2");
|
|
|
|
(e = new Element("Test")).setAttribute("include", "105,205");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 in 105,205");
|
|
|
|
e = new Element("Test");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "205,105", ""), "105 in 205,105");
|
|
(e = new Element("Test")).setAttribute("include", "1205,1105");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "205,105", ""), "105 in 205,105");
|
|
|
|
e = new Element("Test");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "1050,205", ""), "105 not in 1050,205");
|
|
(e = new Element("Test")).setAttribute("include", "222,333");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "1050,205", ""), "105 not in 1050,205");
|
|
|
|
e = new Element("Test");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "50,1050", ""), "105 not in 50,1050");
|
|
|
|
e = new Element("Test");
|
|
assertTrue(DecoderFile.isIncluded(e, "827004", "model", "family", "827004,827008,827104,827108,827106,828043,828045,828047", ""), "827004");
|
|
assertFalse(DecoderFile.isIncluded(e, "827005", "model", "family", "827004,827008,827104,827108,827106,828043,828045,828047", ""), "Not 827005");
|
|
assertTrue(DecoderFile.isIncluded(e, "827108", "model", "family", "827004,827008,827104,827108,827106,828043,828045,828047", ""), "827108");
|
|
}
|
|
|
|
@Test
|
|
public void testIncludeCheckModel() {
|
|
Element e;
|
|
|
|
// with nothing in element
|
|
e = new Element("Test");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "model", ""), "1 in model");
|
|
assertTrue(DecoderFile.isIncluded(e, "2", "model", "family", "1,2,model", ""), "2 in 1,2,model");
|
|
assertFalse(DecoderFile.isIncluded(e, "3", "model", "family", "1,2", ""), "3 in 1,2");
|
|
|
|
// with irrelevant element
|
|
(e = new Element("Test")).setAttribute("include", "4,5");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "model", ""), "1 in model");
|
|
assertTrue(DecoderFile.isIncluded(e, "2", "model", "family", "1,2,model", ""), "2 in 1,2,model");
|
|
assertFalse(DecoderFile.isIncluded(e, "3", "model", "family", "1,2", ""), "3 in 1,2");
|
|
}
|
|
|
|
@Test
|
|
public void testExcludeCheck() {
|
|
Element e;
|
|
// test some examples
|
|
e = new Element("Test");
|
|
assertTrue(DecoderFile.isIncluded(e, "1", "model", "family", "", ""), "1 in null");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "1,2");
|
|
assertFalse(DecoderFile.isIncluded(e, "1", "model", "family", "", ""), "1 in 1,2");
|
|
assertFalse(DecoderFile.isIncluded(e, "2", "model", "family", "", ""), "2 in 1,2");
|
|
assertTrue(DecoderFile.isIncluded(e, "3", "model", "family", "", ""), "3 in 1,2");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "105,205");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 in 105,205");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "205,105");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 in 205,105");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "1050,205");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 not in 1050,205");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "50,1050");
|
|
assertTrue(DecoderFile.isIncluded(e, "105", "model", "family", "", ""), "105 not in 50,1050");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "827004,827008,827104,827108,827106,828043,828045,828047");
|
|
assertFalse(DecoderFile.isIncluded(e, "827004", "model", "family", "", ""), "827004");
|
|
assertTrue(DecoderFile.isIncluded(e, "827005", "model", "family", "", ""), "Not 827005");
|
|
assertFalse(DecoderFile.isIncluded(e, "827108", "model", "family", "", ""), "827108");
|
|
}
|
|
|
|
@Test
|
|
public void testExcludeCheckRippleDown() {
|
|
Element e;
|
|
|
|
e = new Element("Test");
|
|
assertFalse(DecoderFile.isIncluded(e, "1", "model", "family", "", "model"), "1 in model");
|
|
assertFalse(DecoderFile.isIncluded(e, "2", "model", "family", "", "1,2,model"), "2 in 1,2,model");
|
|
assertFalse(DecoderFile.isIncluded(e, "3", "model", "family", "", "1,2,model"), "3 in 1,2,model");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "4,5");
|
|
assertFalse(DecoderFile.isIncluded(e, "1", "model", "family", "", "1,2"), "1 in 1,2");
|
|
assertFalse(DecoderFile.isIncluded(e, "2", "model", "family", "", "1,2"), "2 in 1,2");
|
|
assertTrue(DecoderFile.isIncluded(e, "3", "model", "family", "", "1,2"), "3 in 1,2");
|
|
|
|
e = new Element("Test");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "", "105,205"), "105 in 105,205");
|
|
(e = new Element("Test")).setAttribute("exclude", "305,405");
|
|
assertFalse(DecoderFile.isIncluded(e, "105", "model", "family", "", "105,205"), "105 in 105,205");
|
|
}
|
|
|
|
@Test
|
|
public void testExcludeCheckModel() {
|
|
Element e;
|
|
|
|
e = new Element("Test");
|
|
assertFalse(DecoderFile.isIncluded(e, "1", "model", "family", "", "1,2"), "1 in model");
|
|
assertFalse(DecoderFile.isIncluded(e, "2", "model", "family", "", "1,2"), "2 in 1,2,model");
|
|
assertTrue(DecoderFile.isIncluded(e, "3", "model", "family", "", "1,2"), "3 in 1,2");
|
|
|
|
(e = new Element("Test")).setAttribute("exclude", "4,5");
|
|
assertFalse(DecoderFile.isIncluded(e, "1", "model", "family", "", "1,2"), "1 in model");
|
|
assertFalse(DecoderFile.isIncluded(e, "2", "model", "family", "", "1,2"), "2 in 1,2,model");
|
|
assertTrue(DecoderFile.isIncluded(e, "3", "model", "family", "", "1,2"), "3 in 1,2");
|
|
}
|
|
|
|
@Test
|
|
public void testMinOut() {
|
|
setupDecoder();
|
|
|
|
// this test should probably be done in terms of a test class instead of the real one...
|
|
JLabel progStatus = new JLabel(" OK ");
|
|
CvTableModel cvModel = new CvTableModel(progStatus, p);
|
|
VariableTableModel variableModel = new VariableTableModel(progStatus,
|
|
new String[]{"Name", "Value"}, cvModel);
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "23", "24",
|
|
"family", "filename", 16, 3, null);
|
|
|
|
d.loadVariableModel(decoder, variableModel);
|
|
assertEquals(2, variableModel.getRowCount(), "read rows ");
|
|
}
|
|
|
|
@Test
|
|
public void testMinFn() {
|
|
setupDecoder();
|
|
|
|
// this test should probably be done in terms of a test class instead of the real one...
|
|
JLabel progStatus = new JLabel(" OK ");
|
|
CvTableModel cvModel = new CvTableModel(progStatus, p);
|
|
VariableTableModel variableModel = new VariableTableModel(progStatus,
|
|
new String[]{"Name", "Value"}, cvModel);
|
|
DecoderFile d = new DecoderFile("mfg", "mfgID", "model", "23", "24",
|
|
"family", "filename", "sv2id", "sv2man", "sv2Prod",
|
|
3, 16, null, "repl", "replFam",
|
|
"AMODE");
|
|
|
|
d.loadVariableModel(decoder, variableModel);
|
|
assertEquals(2, variableModel.getRowCount(), "read rows ");
|
|
}
|
|
|
|
// variables for the test XML structures
|
|
private Element root = null;
|
|
public Element decoder = null; // used in jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrameTest
|
|
public Element model = null; // used in jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrameTest
|
|
private Element mode = null;
|
|
private Document doc = null;
|
|
|
|
// provide a test document in the above variables
|
|
@ToDo("Break out into separate class for use by this test and jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrameTest")
|
|
public void setupDecoder() {
|
|
// create a JDOM tree with just some elements
|
|
root = new Element("decoder-config");
|
|
doc = new Document(root);
|
|
doc.setDocType(new DocType("decoder-config", "decoder-config.dtd"));
|
|
|
|
// add some elements
|
|
root.addContent(decoder = new Element("decoder")
|
|
.addContent(new Element("family")
|
|
.setAttribute("family", "DH142 etc")
|
|
.setAttribute("mfg", "Digitrax")
|
|
.setAttribute("defnVersion", "242")
|
|
.setAttribute("comment", "DH142 decoder: FX, transponding")
|
|
.addContent(model = new Element("model")
|
|
.setAttribute("model", "33")
|
|
.setAttribute("maxFnNum", "31")
|
|
.setAttribute("productID", "567")
|
|
)
|
|
)
|
|
.addContent(new Element("programming")
|
|
.setAttribute("direct", "byteOnly")
|
|
.setAttribute("paged", "yes")
|
|
.setAttribute("register", "yes")
|
|
.setAttribute("ops", "yes")
|
|
.addContent(mode = new Element("mode").setText("AMODE"))
|
|
)
|
|
.addContent(new Element("variables")
|
|
.addContent(new Element("variable")
|
|
.setAttribute("label", "Address")
|
|
.setAttribute("CV", "1")
|
|
.setAttribute("minFn", "4")
|
|
.setAttribute("mask", "VVVVVVVV")
|
|
.setAttribute("readOnly", "no")
|
|
.addContent(new Element("decVal")
|
|
.setAttribute("max", "127")
|
|
)
|
|
)
|
|
.addContent(new Element("variable")
|
|
.setAttribute("label", "Acceleration rate")
|
|
.setAttribute("CV", "3")
|
|
.setAttribute("minOut", "2")
|
|
.setAttribute("mask", "VVVVVVVV")
|
|
.setAttribute("readOnly", "no")
|
|
.addContent(new Element("decVal")
|
|
.setAttribute("max", "127")
|
|
)
|
|
)
|
|
.addContent(new Element("variable")
|
|
.setAttribute("label", "Normal direction of motion")
|
|
.setAttribute("CV", "29")
|
|
.setAttribute("minFn", "2")
|
|
.setAttribute("minOut", "5")
|
|
.setAttribute("mask", "XXXXXXXV")
|
|
.setAttribute("readOnly", "no")
|
|
.addContent(new Element("enumVal")
|
|
.addContent(new Element("enumChoice")
|
|
.setAttribute("choice", "forward")
|
|
)
|
|
.addContent(new Element("enumChoice")
|
|
.setAttribute("choice", "reverse")
|
|
)
|
|
)
|
|
)
|
|
)
|
|
); // end of adding contents
|
|
assertNotNull(model);
|
|
assertNotNull(mode);
|
|
}
|
|
|
|
@BeforeEach
|
|
public void setUp() {
|
|
JUnitUtil.setUp();
|
|
}
|
|
|
|
@AfterEach
|
|
public void tearDown() {
|
|
JUnitUtil.tearDown();
|
|
}
|
|
|
|
// private static final Logger log = LoggerFactory.getLogger(DecoderFileTest.class);
|
|
}
|