Files
JIMRI/java/test/jmri/util/swing/JmriJOptionPaneTest.java
2026-06-17 14:00:51 +02:00

290 lines
13 KiB
Java

package jmri.util.swing;
import java.util.Locale;
import javax.swing.*;
import jmri.util.JUnitUtil;
import org.junit.jupiter.api.*;
import org.netbeans.jemmy.operators.*;
/**
* Tests for JmriJOptionPane.
* @author Steve Young Copyright (C) 2023
*/
@jmri.util.junit.annotations.DisabledIfHeadless
public class JmriJOptionPaneTest {
@Test
public void testShowConfirmDialogOkCanel() {
JFrame frame = new JFrame("JFrame Window");
JPanel panel = new JPanel();
JLabel label = new JLabel("Label in JFrame");
panel.add(label);
frame.add(panel);
frame.pack();
jmri.util.ThreadingUtil.runOnGUI( () -> frame.setVisible(true) );
JFrameOperator jfo = new JFrameOperator("JFrame Window");
Thread canelButtonThread = JemmyUtil.createModalDialogOperatorThread(
"OptionPane Title", Bundle.getMessage("ButtonCancel"));
int optionPressed = JmriJOptionPane.showConfirmDialog(panel, "Message", "OptionPane Title", JmriJOptionPane.OK_CANCEL_OPTION );
JUnitUtil.waitFor(()-> !(canelButtonThread.isAlive()), "cancel dialog finished");
Assertions.assertEquals(JmriJOptionPane.CANCEL_OPTION, optionPressed);
Thread okButtonThread = JemmyUtil.createModalDialogOperatorThread(
"OptionPane Title", Bundle.getMessage("ButtonOK"));
optionPressed = JmriJOptionPane.showConfirmDialog(panel, "Message", "OptionPane Title", JmriJOptionPane.OK_CANCEL_OPTION );
JUnitUtil.waitFor(()-> !(okButtonThread.isAlive()), "ok dialog finished"); // NOI18N
Assertions.assertEquals(JmriJOptionPane.OK_OPTION, optionPressed);
jfo.requestClose();
jfo.waitClosed();
}
@Test
public void testMessageDialogueNoOptions() {
Thread okButtonThread = JemmyUtil.createModalDialogOperatorThread(
"Error Title", Bundle.getMessage("ButtonOK"));
JmriJOptionPane.showMessageDialog(null, "testMessageDialogMessage", "Error Title", JmriJOptionPane.ERROR_MESSAGE);
JUnitUtil.waitFor(()-> !( okButtonThread.isAlive()), "ok error dialog finished");
}
@Test
public void testYesNoOptions() {
JFrame frame = new JFrame("JFrame testYesNoOptions");
JPanel panel = new JPanel();
JLabel label = new JLabel("Label in testYesNoOptions JFrame");
panel.add(label);
frame.add(panel);
frame.pack();
frame.setLocation(100, 100);
jmri.util.ThreadingUtil.runOnGUI( () -> frame.setVisible(true) );
JFrameOperator jfo = new JFrameOperator("JFrame testYesNoOptions");
Thread yesButtonThread = JemmyUtil.createModalDialogOperatorThread(
"Question Title", Bundle.getMessage("ButtonYes"));
int result = JmriJOptionPane.showConfirmDialog(panel,"Yes or no message",
"Question Title", JmriJOptionPane.YES_NO_OPTION, JmriJOptionPane.QUESTION_MESSAGE);
JUnitUtil.waitFor(()-> !( yesButtonThread.isAlive()), "yes dialog finished");
Assertions.assertEquals(JmriJOptionPane.YES_OPTION, result);
Thread noButtonThread = JemmyUtil.createModalDialogOperatorThread(
"Question Title", Bundle.getMessage("ButtonNo"));
result = JmriJOptionPane.showConfirmDialog(panel,"Yes or no message",
"Question Title", JmriJOptionPane.YES_NO_OPTION, JmriJOptionPane.QUESTION_MESSAGE);
JUnitUtil.waitFor(()-> !( noButtonThread.isAlive()), "no dialog finished");
Assertions.assertEquals(JmriJOptionPane.NO_OPTION, result);
jfo.requestClose();
jfo.waitClosed();
JUnitUtil.dispose(frame);
}
@Test
public void testModalNoFrameMessage() {
Thread okButtonThread = JemmyUtil.createModalDialogOperatorThread(
"Error Title", Bundle.getMessage("ButtonOK"));
JmriJOptionPane.showMessageDialog(null, "testMessageDialogMessage", "Error Title", JmriJOptionPane.ERROR_MESSAGE);
JUnitUtil.waitFor(()-> !( okButtonThread.isAlive()), "ok error dialog finished");
}
@Test
public void testShowStringInput() {
Thread t = new Thread(() -> {
// constructor for jdo will wait until the dialog is visible
JDialogOperator jdo = new JDialogOperator(UIManager.getString("OptionPane.inputDialogTitle",
Locale.getDefault()));
JTextFieldOperator jtfo = new JTextFieldOperator(jdo,0);
Assertions.assertEquals("Initial Foo", jtfo.getText());
jtfo.setText("New Foo");
JButtonOperator jbo = new JButtonOperator(jdo, Bundle.getMessage("ButtonOK"));
jbo.pushNoBlock();
});
t.setName("Close String Input Dialog Thread");
t.start();
String s = JmriJOptionPane.showInputDialog(null, "Enter a new String value for Foo", "Initial Foo");
JUnitUtil.waitFor(()-> !( t.isAlive()), "string input dialog finished");
Assertions.assertEquals("New Foo", s);
}
@Test
public void testCancelInputString() {
JFrame frame = new JFrame("JFrame testCancelInputString");
JPanel panel = new JPanel();
JLabel label = new JLabel("Label in testCancelInputString JFrame");
panel.add(label);
frame.add(panel);
frame.pack();
frame.setLocation(150, 150);
jmri.util.ThreadingUtil.runOnGUI( () -> frame.setVisible(true) );
JFrameOperator jfo = new JFrameOperator("JFrame testCancelInputString");
Thread t = new Thread(() -> {
// constructor for jdo will wait until the dialog is visible
JDialogOperator jdo = new JDialogOperator(UIManager.getString("OptionPane.inputDialogTitle", Locale.getDefault()));
JButtonOperator jbo = new JButtonOperator(jdo, Bundle.getMessage("ButtonCancel"));
jbo.pushNoBlock();
});
t.setName("cancel String Input Dialog Thread");
t.start();
String s = JmriJOptionPane.showInputDialog(panel, "Cancel Enter a new String value for Foo", "Initial Foo Cancel");
JUnitUtil.waitFor(()-> !( t.isAlive()), "cancel string input dialog finished");
Assertions.assertNull( s);
jfo.requestClose();
jfo.waitClosed();
JUnitUtil.dispose(frame);
}
@Test
public void testInfoDialog() {
Thread okButtonThread = JemmyUtil.createModalDialogOperatorThread(
UIManager.getString("OptionPane.messageDialogTitle", Locale.getDefault()), Bundle.getMessage("ButtonOK"));
JmriJOptionPane.showMessageDialog(null, "testInfoDialogMessage" );
JUnitUtil.waitFor(()-> !( okButtonThread.isAlive()), "ok info dialog finished");
}
@Test
public void testCustomOptionsDialog(){
Thread okButtonThread = JemmyUtil.createModalDialogOperatorThread(
"My Title", "Option B");
int value = JmriJOptionPane.showOptionDialog(null, "My Custom Message", "My Title",
JmriJOptionPane.DEFAULT_OPTION, JmriJOptionPane.QUESTION_MESSAGE, null, new String[]{"Option A", "Option B", "Option C"}, "Option C");
JUnitUtil.waitFor(()-> !( okButtonThread.isAlive()), "ok info dialog finished");
Assertions.assertEquals(1, value,"returns Option B at position 1 in Array");
}
@Test
public void testShowOptionYesNoDialogueWithInitialValueNo() {
Thread t = JemmyUtil.createModalDialogOperatorThread(
Bundle.getMessage("WarningTitle"), JmriJOptionPane.NO_STRING);
String[] options = new String[] {JmriJOptionPane.YES_STRING, JmriJOptionPane.NO_STRING};
int result = JmriJOptionPane.showOptionDialog(null, "My Message", Bundle.getMessage("WarningTitle"),
JmriJOptionPane.DEFAULT_OPTION, JmriJOptionPane.WARNING_MESSAGE, null,
options, options[1]);
JUnitUtil.waitFor(()-> !( t.isAlive()), "click no finished");
Assertions.assertEquals(1, result, "array position 1 clicked");
}
@Test
public void testShowOptionYesNoDialogueWithInitialValueYes() {
Thread t = JemmyUtil.createModalDialogOperatorThread(
Bundle.getMessage("WarningTitle"), JmriJOptionPane.YES_STRING);
String[] options = new String[] {JmriJOptionPane.YES_STRING, JmriJOptionPane.NO_STRING};
int result = JmriJOptionPane.showOptionDialog(null, "My Message", Bundle.getMessage("WarningTitle"),
JmriJOptionPane.DEFAULT_OPTION, JmriJOptionPane.WARNING_MESSAGE, null,
options, options[0]);
JUnitUtil.waitFor(()-> !( t.isAlive()), "click yes finished");
Assertions.assertEquals(0, result, "array position 0 clicked");
}
@Test
public void testShowOptionYesNoDialogueEscapeButton() {
Thread t = new Thread(() -> {
// constructor for jdo will wait until the dialog is visible
JDialogOperator jdo = new JDialogOperator(Bundle.getMessage("WarningTitle"));
jdo.pressKey(java.awt.event.KeyEvent.VK_ESCAPE);
jdo.waitClosed();
});
t.setName("escape button Dialog Thread");
t.start();
String[] options = new String[] {JmriJOptionPane.YES_STRING, JmriJOptionPane.NO_STRING};
int result = JmriJOptionPane.showOptionDialog(null, "My Message", Bundle.getMessage("WarningTitle"),
JmriJOptionPane.DEFAULT_OPTION, JmriJOptionPane.WARNING_MESSAGE, null,
options, options[0]);
JUnitUtil.waitFor(()-> !( t.isAlive()), "escape key pressed to close");
Assertions.assertEquals(JmriJOptionPane.CLOSED_OPTION, result, "no button clicked, Dialog exited, -1 returned");
}
@Test
public void testShowOptionYesNoMaybeDialogueEnterButton() {
Thread t = new Thread(() -> {
// constructor for jdo will wait until the dialog is visible
JDialogOperator jdo = new JDialogOperator(Bundle.getMessage("WarningTitle"));
jdo.pressKey(java.awt.event.KeyEvent.VK_ENTER);
jdo.waitClosed();
});
t.setName("enter button Dialog Thread");
t.start();
String[] options = new String[] {JmriJOptionPane.YES_STRING, JmriJOptionPane.NO_STRING, "Maybe"};
int result = JmriJOptionPane.showOptionDialog(null, "My Message", Bundle.getMessage("WarningTitle"),
JmriJOptionPane.DEFAULT_OPTION, JmriJOptionPane.WARNING_MESSAGE, null,
options, "Maybe");
JUnitUtil.waitFor(()-> !( t.isAlive()), "enter key pressed to close");
Assertions.assertEquals(2, result, "enter pressed, array position 2 returned");
}
@Test
public void testShowOptionABCBDefaultEnterButton() {
Thread t = new Thread(() -> {
// constructor for jdo will wait until the dialog is visible
JDialogOperator jdo = new JDialogOperator(Bundle.getMessage("WarningTitle"));
jdo.pressKey(java.awt.event.KeyEvent.VK_ENTER);
jdo.waitClosed();
});
t.setName("ABC enter button Dialog Thread");
t.start();
String[] options = new String[] {"A","B","C"};
int result = JmriJOptionPane.showOptionDialog(null, "My Message", Bundle.getMessage("WarningTitle"),
JmriJOptionPane.DEFAULT_OPTION, JmriJOptionPane.QUESTION_MESSAGE, null,
options, "B");
JUnitUtil.waitFor(()-> !( t.isAlive()), "ABC enter key pressed to close");
Assertions.assertEquals(1, result, "enter pressed, array position 1 returned");
}
@Test
public void testCanBeFoundInTestsWithNoTitle(){
Thread t = JemmyUtil.createModalDialogOperatorThread(
"", Bundle.getMessage("ButtonOK"));
JmriJOptionPane.showMessageDialog(null, "Message", "", JmriJOptionPane.WARNING_MESSAGE);
JUnitUtil.waitFor(() -> !t.isAlive(), "dialog with empty title string found and clicked OK");
}
private boolean calledBack;
@Test
public void testNonModalFoundWithModalOperator(){
Thread t = JemmyUtil.createModalDialogOperatorThread(
"Non Modal Modal Title", Bundle.getMessage("ButtonOK"));
JmriJOptionPane.showMessageDialogNonModal(null, "Message",
"Non Modal Modal Title", 0, () -> calledBack=true);
JUnitUtil.waitFor(() -> calledBack, "Dialog calledback");
JUnitUtil.waitFor(() -> !t.isAlive(), "testNonModalFoundWithModalOperator Thread Complete");
}
@Test
public void testNonModalFoundWithJemmyUtil(){
JmriJOptionPane.showMessageDialogNonModal(null, "Message",
"Non Modal Title", 0, () -> calledBack=true);
JemmyUtil.pressDialogButton("Non Modal Title", Bundle.getMessage("ButtonOK"));
JUnitUtil.waitFor(() -> calledBack, "testNonModalFoundWithTest calledback");
}
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
calledBack = false;
}
@AfterEach
public void tearDown() {
JUnitUtil.resetWindows(false, false);
JUnitUtil.tearDown();
}
}