241 lines
8.4 KiB
Java
241 lines
8.4 KiB
Java
package jmri.util.swing;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
|
import java.awt.Component;
|
|
|
|
import javax.annotation.Nonnull;
|
|
import javax.swing.*;
|
|
|
|
import org.netbeans.jemmy.ComponentChooser;
|
|
import org.netbeans.jemmy.operators.*;
|
|
import org.netbeans.jemmy.util.NameComponentChooser;
|
|
|
|
import jmri.util.JmriJFrame;
|
|
|
|
/**
|
|
* Utility Methods for Jemmy Tests.
|
|
*
|
|
* @author Paul Bender Copyright (C) 2018
|
|
*/
|
|
|
|
public class JemmyUtil {
|
|
public static void pressDialogButton(JmriJFrame f, String buttonName) {
|
|
JFrameOperator jfo = new JFrameOperator(f);
|
|
JDialogOperator jdo = new JDialogOperator(jfo, 1); // wait for the first dialog.
|
|
NameComponentChooser bChooser = new NameComponentChooser(buttonName);
|
|
JButtonOperator jbo = new JButtonOperator(jdo, bChooser);
|
|
// Click button
|
|
jbo.push();
|
|
}
|
|
|
|
public static void pressDialogButton(String dialogTitle, String buttonName) {
|
|
JDialogOperator jdo = new JDialogOperator(dialogTitle); // wait for the first dialog.
|
|
JButtonOperator jbo = new JButtonOperator(jdo, buttonName);
|
|
// Click button
|
|
jbo.push();
|
|
}
|
|
|
|
public static void pressDialogButton(JmriJFrame f, String dialogTitle, String buttonName) {
|
|
JFrameOperator jfo = new JFrameOperator(f);
|
|
JDialogOperator jdo = new JDialogOperator(jfo, dialogTitle); // wait for the first dialog.
|
|
JButtonOperator jbo = new JButtonOperator(jdo, buttonName);
|
|
// Click button
|
|
jbo.push();
|
|
}
|
|
|
|
public static void enterClickAndLeave(JButton comp) {
|
|
JButtonOperator jbo = new JButtonOperator(comp);
|
|
jbo.push();
|
|
}
|
|
|
|
public static void enterClickAndLeaveThreadSafe(JButton comp) {
|
|
// test can hang if button isn't enabled
|
|
jmri.util.JUnitUtil.waitFor(() -> {
|
|
return comp.isEnabled();
|
|
}, "wait for button to be enabled");
|
|
|
|
Thread t = new Thread(() -> {
|
|
JButtonOperator jbo = new JButtonOperator(comp);
|
|
jbo.push();
|
|
});
|
|
t.start();
|
|
}
|
|
|
|
public static void enterClickAndLeave(JCheckBox comp) {
|
|
JCheckBoxOperator jbo = new JCheckBoxOperator(comp);
|
|
jbo.doClick();
|
|
}
|
|
|
|
public static void enterClickAndLeave(JRadioButton comp) {
|
|
JRadioButtonOperator jbo = new JRadioButtonOperator(comp);
|
|
jbo.doClick();
|
|
}
|
|
|
|
public static void enterClickAndLeave(JToggleButton comp) {
|
|
JToggleButtonOperator jtbo = new JToggleButtonOperator(comp);
|
|
jtbo.doClick();
|
|
}
|
|
|
|
public static void pressButton(WindowOperator frame, String text) {
|
|
JButtonOperator jbo = new JButtonOperator(frame, text);
|
|
jbo.push();
|
|
}
|
|
|
|
public static void clickOnCellThreadSafe(JTableOperator tbl, int row, String columnName) {
|
|
new Thread(() -> {
|
|
tbl.clickOnCell(row, tbl.findColumn(columnName));
|
|
}).start();
|
|
}
|
|
|
|
public static void confirmJOptionPane(WindowOperator wo, String title, String message, String buttonLabel) {
|
|
// the previous version of this message verified the text string
|
|
// if the dialog matched the passed message value. We need to
|
|
// determine how to do that using Jemmy.
|
|
JDialogOperator jdo = new JDialogOperator(wo, title);
|
|
JButtonOperator jbo = new JButtonOperator(jdo, buttonLabel);
|
|
jbo.push();
|
|
}
|
|
|
|
/**
|
|
* Create a Modal Dialog Operator Thread.
|
|
* Button action is complete when Thread terminates.
|
|
* @param dialogTitle The Dialog title
|
|
* @param buttonText the text of the Button to press.
|
|
* @return the Thread.
|
|
*/
|
|
public static Thread createModalDialogOperatorThread(String dialogTitle, String buttonText) {
|
|
Thread t = new Thread(() -> {
|
|
// constructor for jdo will wait until the dialog is visible
|
|
JDialogOperator jdo = new JDialogOperator(dialogTitle);
|
|
JButtonOperator jbo = new JButtonOperator(jdo, buttonText);
|
|
jbo.push(); // push waits for the button action to complete.
|
|
});
|
|
t.setName(dialogTitle + " Close Dialog Thread");
|
|
t.start();
|
|
return t;
|
|
}
|
|
|
|
public static JLabel getLabelWithText(String frameName, String text) {
|
|
// Find window by name
|
|
JmriJFrame frame = JmriJFrame.getFrame(frameName);
|
|
|
|
// find label within that
|
|
JLabel jl = JLabelOperator.findJLabel(frame,new ComponentChooser(){
|
|
@Override
|
|
public boolean checkComponent(Component comp){
|
|
if(comp == null){
|
|
return false;
|
|
} else if (comp instanceof JLabel ) {
|
|
return ((JLabel)comp).getText().equals(text);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
@Override
|
|
public String getDescription(){
|
|
return "find JLabel with text: " + text;
|
|
}
|
|
});
|
|
return jl;
|
|
}
|
|
|
|
/**
|
|
* Get a JLabelOperator for a Named JLabel.
|
|
* @param jfo the JFrameOperator containing the JLabel.
|
|
* @param name the name given to the JLabel
|
|
* @return a new JLabelOperator.
|
|
* Fails test if JLabel is not located.
|
|
*/
|
|
public static JLabelOperator getLabelOperatorByName(@Nonnull JFrameOperator jfo, @Nonnull String name) {
|
|
return new JLabelOperator(jfo,new ComponentChooser(){
|
|
@Override
|
|
public boolean checkComponent(Component comp){
|
|
if(comp == null){
|
|
return false;
|
|
} else if (comp instanceof JLabel ) {
|
|
return name.equals(comp.getName());
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
@Override
|
|
public String getDescription(){
|
|
return "find JLabel with Name: " + name;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get a JButtonOperator for a Named Button.
|
|
* @param jfo the JFrameOperator containing the JButton.
|
|
* @param name the name given to the JButton
|
|
* @return a new JButtonOperator.
|
|
* Fails test if JButton is not located.
|
|
*/
|
|
public static JButtonOperator getButtonOperatorByName(@Nonnull JFrameOperator jfo, @Nonnull String name) {
|
|
return new JButtonOperator(jfo,new ComponentChooser(){
|
|
@Override
|
|
public boolean checkComponent(Component comp){
|
|
if(comp == null){
|
|
return false;
|
|
} else if (comp instanceof JButton ) {
|
|
return name.equals(comp.getName());
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
@Override
|
|
public String getDescription(){
|
|
return "find JButton with Name: " + name;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get a JButtonOperator for a JButton with a specific Action Command.
|
|
* @param jfo the JFrameOperator containing the JButton.
|
|
* @param action the ActionCommand of the JButton
|
|
* @return a new JButtonOperator.
|
|
* Fails test if JButton is not located.
|
|
*/
|
|
public static JButtonOperator getButtonOperatorByActionComnmand(@Nonnull JFrameOperator jfo, @Nonnull String action ) {
|
|
return new JButtonOperator(jfo,new ComponentChooser(){
|
|
@Override
|
|
public boolean checkComponent(Component comp){
|
|
if(comp == null){
|
|
return false;
|
|
} else if (comp instanceof JButton ) {
|
|
return action.equals(((JButton)comp).getActionCommand());
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
@Override
|
|
public String getDescription(){
|
|
return "find JButton with Action: " + action ;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Wait for a specified {@link JmriJFrame} to become active.
|
|
* @param f The non-null {@link JmriJFrame} to wait for and activate.
|
|
* @throws AssertionError if the frame does not become active.
|
|
*/
|
|
public static void waitFor( @Nonnull JmriJFrame f) {
|
|
int count = 5;
|
|
boolean active = false;
|
|
f.requestFocus();
|
|
while (!active && count > 0) {
|
|
active = jmri.util.JUnitUtil.waitFor(() -> {
|
|
return f.isActive();
|
|
});
|
|
count--;
|
|
f.requestFocusInWindow();
|
|
}
|
|
assertTrue( f.isActive(), () -> "frame " + f.getTitle() +" should be active");
|
|
}
|
|
|
|
}
|