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

301 lines
11 KiB
Java

package jmri.jmrit.roster.swing;
import jmri.*;
import jmri.jmrit.roster.*;
import jmri.progdebugger.ProgDebugger.ProgDebuggerConfigurator;
import jmri.util.*;
import org.junit.jupiter.api.*;
/**
* Test simple functioning of RosterFrame
*
* @author Paul Bender Copyright (C) 2015, 2016
*/
@jmri.util.junit.annotations.DisabledIfHeadless
@Timeout(20) // This test class was periodically stalling and causing the CI run to time out. Limit its duration.
public class RosterFrameTest {
private RosterFrame frame = null;
@Test
public void testCtor() {
Assertions.assertNotNull( frame, "exists");
}
@Test
public void testIdentifyEnabled() {
ThreadingUtil.runOnGUI( () -> frame.setVisible(true) );
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
Assertions.assertTrue( operator.isIdentifyButtonEnabled(), "Identify Button Enabled");
}
@Test
public void testIdentify3NotPresent() {
ThreadingUtil.runOnGUI( () -> {
frame.pack();
frame.setVisible(true);
});
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
// set some CV values
var globalProgrammer = InstanceManager.getDefault(GlobalProgrammerManager.class).getGlobalProgrammer();
Assertions.assertNotNull(globalProgrammer);
ProgDebuggerConfigurator prog = (ProgDebuggerConfigurator) globalProgrammer.getConfigurator();
Assertions.assertNotNull(prog);
prog.resetCv(1, 3);
prog.resetCv(29, 0);
operator.pushIdentifyButton();
// and wait for message that will come at end because nothing is found
JUnitUtil.waitFor(() -> {
return JUnitAppender.checkForMessage("Read address 3, but no such loco in roster") != null;
}, "error message at end");
}
@Test
public void testIdentify3Present() {
// add entry to Roster
Roster roster = Roster.getDefault();
RosterEntry re1 = new RosterEntry();
re1.setId("1st entry");
re1.setDccAddress("3");
roster.addEntry(re1);
RosterEntry re2 = new RosterEntry();
re2.setId("2nd entry");
re2.setDccAddress("4");
roster.addEntry(re2);
RosterEntry re3 = new RosterEntry();
re3.setId("3rd entry");
re3.setDccAddress("5");
roster.addEntry(re3);
ThreadingUtil.runOnGUI( () -> {
frame.pack();
frame.setVisible(true);
});
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
// set some CV values
var globalProgrammer = InstanceManager.getDefault(GlobalProgrammerManager.class).getGlobalProgrammer();
Assertions.assertNotNull(globalProgrammer);
ProgDebuggerConfigurator prog = (ProgDebuggerConfigurator) globalProgrammer.getConfigurator();
Assertions.assertNotNull(prog);
prog.resetCv(1, 3);
prog.resetCv(29, 0);
operator.pushIdentifyButton();
JUnitUtil.waitFor(() -> {
return frame.getSelectedRosterEntries().length == 1;
}, "selection complete");
RosterEntry[] selected = frame.getSelectedRosterEntries();
Assertions.assertEquals( 1, selected.length, "selected ");
Assertions.assertEquals( re1, selected[0], "selected ");
}
@Test
public void testIdentify3WithDecoderTypeMismatch() {
// match on address if unique, even if decoder type not right
// add entry to Roster
Roster roster = Roster.getDefault();
RosterEntry re1 = new RosterEntry();
re1.setId("1st entry is 3; mismatched types accepted");
re1.setDccAddress("3");
re1.setDecoderModel("Four Function Dual Mode"); // CV8 = 127 Atlas, CV7 = 46
re1.setDecoderFamily("Four Function Dual Mode");
roster.addEntry(re1);
RosterEntry re2 = new RosterEntry();
re2.setId("2nd entry");
re2.setDccAddress("4");
roster.addEntry(re2);
RosterEntry re3 = new RosterEntry();
re3.setId("3rd entry");
re3.setDccAddress("5");
roster.addEntry(re3);
ThreadingUtil.runOnGUI( () -> {
frame.pack();
frame.setVisible(true);
});
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
// set some CV values
var globalProgrammer = InstanceManager.getDefault(GlobalProgrammerManager.class).getGlobalProgrammer();
Assertions.assertNotNull(globalProgrammer);
ProgDebuggerConfigurator prog = (ProgDebuggerConfigurator) globalProgrammer.getConfigurator();
Assertions.assertNotNull(prog);
prog.resetCv(1, 3);
prog.resetCv(29, 0);
prog.resetCv(7, 45); // Dual Mode (not Four Function Dual Mode)
prog.resetCv(8, 127); // Atlas
operator.pushIdentifyButton();
// and wait for message that will come at end:
//JUnitUtil.waitFor(() ->{
// return JUnitAppender.checkForMessage("Read address 3, but no such loco in roster") != null;
// }, "error message at end");
JUnitUtil.waitFor(() -> {
return frame.getSelectedRosterEntries().length == 1;
}, "selection complete");
RosterEntry[] selected = frame.getSelectedRosterEntries();
Assertions.assertEquals( re1, selected[0], "selected ");
Assertions.assertTrue( frame.checkIfEntrySelected(), "entry selected ");
}
@Test
@Disabled("RosterFrame doesn't do multiple selection properly yet")
public void testIdentify3Multiple() {
// this is a test of what happens when multiples are selectable
// add entry to Roster
Roster roster = Roster.getDefault();
RosterEntry re1 = new RosterEntry();
re1.setId("1st entry is 3");
re1.setDccAddress("3");
roster.addEntry(re1);
RosterEntry re2 = new RosterEntry();
re2.setId("2nd entry is not 3");
re2.setDccAddress("4");
roster.addEntry(re2);
RosterEntry re3 = new RosterEntry();
re3.setId("3rd entry is 3");
re3.setDccAddress("3");
roster.addEntry(re3);
ThreadingUtil.runOnGUI( () -> {
frame.pack();
frame.setVisible(true);
});
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
// set some CV values
jmri.progdebugger.ProgDebugger prog = (jmri.progdebugger.ProgDebugger) InstanceManager.getDefault(GlobalProgrammerManager.class).getGlobalProgrammer();
Assertions.assertNotNull(prog);
prog.resetCv(1, 3);
prog.resetCv(29, 0);
operator.pushIdentifyButton();
// right now, nothing is ever selected, because multiple selection
// is not working. See @Ignore above
JUnitUtil.waitFor(() -> {
return frame.getSelectedRosterEntries().length == 2;
}, "selection complete");
RosterEntry[] selected = frame.getSelectedRosterEntries();
Assertions.assertEquals( re1, selected[0], "selected ");
Assertions.assertEquals( re3, selected[1], "selected ");
Assertions.assertTrue( frame.checkIfEntrySelected(), "entry selected");
}
@Test
public void testIdentify3ViaDecoderId() {
// add entry to Roster
Roster roster = Roster.getDefault();
RosterEntry re1 = new RosterEntry();
re1.setId("1st entry is 3 Four Function Dual Mode");
re1.setDccAddress("3");
re1.setDecoderModel("Four Function Dual Mode"); // CV8 = 127 Atlas, CV7 = 46
re1.setDecoderFamily("Four Function Dual Mode");
roster.addEntry(re1);
RosterEntry re2 = new RosterEntry();
re2.setId("2nd entry in not 3");
re2.setDccAddress("4");
roster.addEntry(re2);
RosterEntry re3 = new RosterEntry();
re3.setId("3rd entry is 3 Dual Mode");
re3.setDccAddress("3");
re3.setDecoderModel("Dual Mode"); // CV8 = 127 Atlas, CV7 = 45
re3.setDecoderFamily("Dual Mode");
roster.addEntry(re3);
ThreadingUtil.runOnGUI( () -> {
frame.pack();
frame.setVisible(true);
});
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
// set some CV values
var globalProgrammer = InstanceManager.getDefault(GlobalProgrammerManager.class).getGlobalProgrammer();
Assertions.assertNotNull(globalProgrammer);
ProgDebuggerConfigurator prog = (ProgDebuggerConfigurator) globalProgrammer.getConfigurator();
Assertions.assertNotNull(prog);
prog.resetCv(1, 3);
prog.resetCv(29, 0);
prog.resetCv(7, 45); // Dual Mode (not Four Function Dual Mode)
prog.resetCv(8, 127); // Atlas
operator.pushIdentifyButton();
JUnitUtil.waitFor(() -> {
return frame.getSelectedRosterEntries().length == 1;
}, "selection complete");
RosterEntry[] selected = frame.getSelectedRosterEntries();
Assertions.assertEquals( 1, selected.length, "selected "); // failed here with 0
Assertions.assertEquals( re3, selected[0], "selected "); // 2nd address=3 selected by decoder match
Assertions.assertTrue( frame.checkIfEntrySelected(), "entry selected");
}
@Test
public void testCheckIfEntrySelected() {
ThreadingUtil.runOnGUI( () -> frame.setVisible(true) );
RosterFrameScaffold operator = new RosterFrameScaffold(frame.getTitle());
Thread t = new Thread(() -> {
jmri.util.swing.JemmyUtil.confirmJOptionPane(operator, "Message", "", "OK");
});
t.setName("Error Dialog Close Thread");
t.start();
// the return true case happens in the identify methods above, so
// we only check the return false case here.
Assertions.assertFalse( frame.checkIfEntrySelected(), "entry not selected");
JUnitUtil.waitThreadTerminated(t);
}
@Test
public void testGetandSetAllowQuit() {
ThreadingUtil.runOnGUI( () -> frame.setVisible(true) );
frame.allowQuit(false);
Assertions.assertFalse( frame.isAllowQuit(), "Quit Not Allowed");
frame.allowQuit(true);
Assertions.assertTrue( frame.isAllowQuit(), "Quit Allowed");
}
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
JUnitUtil.resetInstanceManager();
JUnitUtil.resetProfileManager();
JUnitUtil.initDefaultUserMessagePreferences();
JUnitUtil.initGuiLafPreferencesManager();
InstanceManager.setDefault(jmri.jmrix.ConnectionConfigManager.class, new jmri.jmrix.ConnectionConfigManager());
InstanceManager.setDefault(jmri.jmrit.symbolicprog.ProgrammerConfigManager.class, new jmri.jmrit.symbolicprog.ProgrammerConfigManager());
JUnitUtil.initDebugProgrammerManager();
JUnitUtil.initRosterConfigManager();
Roster.getDefault(); // ensure exists
frame = new RosterFrame();
}
@AfterEach
public void tearDown() {
if (frame != null) {
JUnitUtil.dispose(frame);
}
JUnitUtil.clearShutDownManager();
JUnitUtil.tearDown();
}
// private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(RosterFrameTest.class);
}