package jmri.jmrit.roster;
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.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.*;
import java.util.List;
import java.util.Set;
import javax.swing.JComboBox;
import jmri.InstanceManager;
import jmri.jmrit.roster.swing.RosterEntryComboBox;
import jmri.util.FileUtil;
import jmri.util.JUnitUtil;
import org.jdom2.JDOMException;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.io.TempDir;
/**
* Tests for the jmrit.roster.Roster class.
*
* This separates tests of the DefaultRoster functionality from tests of Roster
* objects individually. Roster itself doesn't (yet) do a good job of
* separating those, so this is somewhat arbitrary.
*
* @author Bob Jacobsen Copyright (C) 2001, 2002, 2012, 2025
*/
public class RosterTest {
@Test
public void testDirty() {
Roster r = new Roster();
assertFalse(r.isDirty(), "new object ");
r.addEntry(new RosterEntry());
assertTrue(r.isDirty(), "after add ");
}
@Test
public void testAdd() {
Roster r = new Roster();
assertEquals(0, r.numEntries(), "empty length ");
r.addEntry(new RosterEntry("file name Bob"));
assertEquals(1, r.numEntries(), "one item ");
}
@Test
public void testDontAddNullEntriesLater() {
// test as documentation...
Roster r = new Roster();
r.addEntry(new RosterEntry());
r.addEntry(new RosterEntry());
Exception ex = assertThrows(NullPointerException.class, () -> {
r.addEntry(null); } );
assertNotNull(ex,"Adding null entry should have caused NPE");
}
@Test
public void testDontAddNullEntriesFirst() {
// test as documentation...
Roster r = new Roster();
Exception ex = assertThrows(NullPointerException.class, () -> {
r.addEntry(null); } );
assertNotNull(ex,"Adding null entry should have caused NPE");
}
@Test
public void testAddrSearch() {
Roster r = new Roster();
RosterEntry e = new RosterEntry("file name Bob");
e.setRoadNumber("123");
r.addEntry(e);
assertFalse(r.checkEntry(0, null, "321", null, null, null, null, null, null), "search not OK ");
assertTrue(r.checkEntry(0, null, "123", null, null, null, null, null, null), "search OK ");
}
@Test
public void testGetByDccAddress() {
Roster r = new Roster();
RosterEntry e = new RosterEntry("file name Bob");
e.setDccAddress("456");
r.addEntry(e);
assertFalse(r.checkEntry(0, null, null, "123", null, null, null, null, null), "search not OK ");
assertTrue(r.checkEntry(0, null, null, "456", null, null, null, null, null), "search OK ");
List l;
l = r.matchingList(null, null, "123", null, null, null, null);
assertEquals(0, l.size(), "match 123");
l = r.matchingList(null, null, "456", null, null, null, null);
assertEquals(1, l.size(), "match 456");
l = r.getEntriesByDccAddress("123");
assertEquals(0, l.size(), "address 123");
l = r.getEntriesByDccAddress("456");
assertEquals(1, l.size(), "address 456");
}
@Test
public void testSearchList() {
Roster r = new Roster();
RosterEntry e;
e = new RosterEntry("file name Bob");
e.setRoadNumber("123");
e.setRoadName("SP");
r.addEntry(e);
e = new RosterEntry("file name Bill");
e.setRoadNumber("123");
e.setRoadName("ATSF");
e.setDecoderModel("81");
e.setDecoderFamily("33");
r.addEntry(e);
e = new RosterEntry("file name Ben");
e.setRoadNumber("123");
e.setRoadName("UP");
r.addEntry(e);
List l;
l = r.matchingList(null, "321", null, null, null, null, null);
assertEquals(0, l.size(), "search for 0 ");
l = r.matchingList("UP", null, null, null, null, null, null);
assertEquals(1, l.size(), "search for 1 ");
assertEquals("UP", l.get(0).getRoadName(), "search for 1 ");
assertEquals("123", l.get(0).getRoadNumber(), "search for 1 ");
l = r.matchingList(null, "123", null, null, null, null, null);
assertEquals(3, l.size(), "search for 3 ");
assertEquals("SP", l.get(2).getRoadName(), "search for 3 ");
assertEquals("123", l.get(2).getRoadNumber(), "search for 3 ");
assertEquals("UP", l.get(0).getRoadName(), "search for 3 ");
assertEquals("123", l.get(0).getRoadNumber(), "search for 3 ");
}
@Test
public void testGetEntriesMatchingList() throws IOException {
// create a test roster with 3 entries
Roster r = jmri.util.RosterTestUtil.createTestRoster(new File(Roster.getDefault().getRosterLocation()), "rosterTest.xml");
assertNotNull(r, "exists");
List l;
// 5 param (LNCV)
l = r.getEntriesMatchingCriteria( "3", null,null, "123", null);
assertEquals(1, l.size(), "match 6 param");
// 8 param
l = r.getEntriesMatchingCriteria("UP", null, null, "100",
null, null,
"UP123", null);
assertEquals(0, l.size(), "match 8 param");
l = r.getEntriesMatchingCriteria("UP", null, null, null,
null, null,
"UP123", null);
assertEquals(1, l.size(), "match 8 param");
// 11 param
l = r.getEntriesMatchingCriteria(null, "123", null, null,
null, null, "UP123",
null, "23", "100", "123");
assertEquals(1, l.size(), "match 11 param - multi");
l = r.getEntriesMatchingCriteria(null, "123", null, null,
null, null, null,
null, null, null, null);
assertEquals(3, l.size(), "match 11 param - only roadNum");
}
@Test
public void testComboBox() {
Roster r = new Roster();
RosterEntry e1;
RosterEntry e2;
RosterEntry e3;
e1 = new RosterEntry("file name Bob");
e1.setRoadNumber("123");
e1.setRoadName("SP");
e1.setId("entry 1");
r.addEntry(e1);
e2 = new RosterEntry("file name Bill");
e2.setRoadNumber("123");
e2.setRoadName("ATSF");
e2.setDecoderModel("81");
e2.setDecoderFamily("33");
e2.setId("entry 2");
r.addEntry(e2);
e3 = new RosterEntry("file name Ben");
e3.setRoadNumber("123");
e3.setRoadName("UP");
e3.setId("entry 3");
r.addEntry(e3);
JComboBox