8132770: Test javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java fails in MacOSX
authoralexsch
Tue, 17 Nov 2015 19:29:04 +0400
changeset 34402 3b1729d04dbb
parent 34401 5c29353d768b
child 34403 b4ca8477370e
8132770: Test javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java fails in MacOSX Reviewed-by: rchamyal, alexsch Contributed-by: Avik Niyogi <avik.niyogi@oracle.com>
jdk/test/javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java
--- a/jdk/test/javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java	Tue Nov 17 19:09:37 2015 +0400
+++ b/jdk/test/javax/swing/JRadioButton/FocusTraversal/FocusTraversal.java	Tue Nov 17 19:29:04 2015 +0400
@@ -22,43 +22,82 @@
  */
 
 /* @test
-   @bug 8129940
-   @summary JRadioButton does not honor non-standard FocusTraversalKeys
-   @author Semyon Sadetsky
-  */
-
-import javax.swing.*;
-import java.awt.*;
+ @bug 8129940 8132770
+ @summary JRadioButton should run custom FocusTraversalKeys for all LaFs
+ @run main FocusTraversal
+ */
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.KeyboardFocusManager;
+import java.awt.Robot;
 import java.awt.event.KeyEvent;
 import java.util.HashSet;
 import java.util.Set;
+import javax.swing.ButtonGroup;
+import javax.swing.FocusManager;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
 
 public class FocusTraversal {
 
     private static JFrame frame;
     private static JRadioButton a;
+    private static JRadioButton b;
+    private static JRadioButton c;
     private static JRadioButton d;
     private static JTextField next;
     private static JTextField prev;
+    private static Robot robot;
 
     public static void main(String[] args) throws Exception {
+
+        robot = new Robot();
+        robot.delay(2000);
+        UIManager.LookAndFeelInfo[] lookAndFeelArray
+                = UIManager.getInstalledLookAndFeels();
+        for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+            executeCase(lookAndFeelItem.getClassName());
+        }
+    }
+
+    private static void executeCase(String lookAndFeelString)
+            throws Exception {
+        if (tryLookAndFeel(lookAndFeelString)) {
+            createUI(lookAndFeelString);
+            robot.delay(2000);
+            runTestCase();
+            robot.delay(2000);
+            cleanUp();
+            robot.delay(2000);
+        }
+    }
+
+    private static void createUI(final String lookAndFeelString)
+            throws Exception {
         SwingUtilities.invokeAndWait(new Runnable() {
             @Override
             public void run() {
-                frame = new JFrame("FocusTraversalTest");
-                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-                frame.setUndecorated(true);
-
                 Set<KeyStroke> keystrokes = new HashSet<KeyStroke>();
                 keystrokes.add(KeyStroke.getKeyStroke("TAB"));
                 keystrokes.add(KeyStroke.getKeyStroke("ENTER"));
+                frame = new JFrame("FocusTraversalTest " + lookAndFeelString);
+                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+                frame.setUndecorated(true);
                 frame.setFocusTraversalKeys(
                         KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
                         keystrokes);
 
                 a = new JRadioButton("a");
-                JRadioButton b = new JRadioButton("b");
-                JRadioButton c = new JRadioButton("c");
+                b = new JRadioButton("b");
+                c = new JRadioButton("c");
                 d = new JRadioButton("d");
 
                 ButtonGroup radioButtonGroup = new ButtonGroup();
@@ -84,61 +123,102 @@
 
                 frame.add(root);
                 frame.pack();
+                frame.setLocationRelativeTo(null);
                 frame.setVisible(true);
-            }
-        });
-
-        SwingUtilities.invokeAndWait(new Runnable() {
-            @Override
-            public void run() {
-                a.requestFocus();
+                frame.toFront();
             }
         });
+    }
 
-        Robot robot = new Robot();
-        robot.waitForIdle();
+    private static void runTestCase() throws Exception {
+        LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
+        focusOn(a);
+        if (isExcludedLookAndFeel(lookAndFeel)) {
+            robot.keyPress(KeyEvent.VK_ENTER);
+            robot.keyRelease(KeyEvent.VK_ENTER);
+            robot.waitForIdle();
+            isFocusOwner(b, "forward");
+            robot.keyPress(KeyEvent.VK_SHIFT);
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_SHIFT);
+            robot.waitForIdle();
+            isFocusOwner(a, "backward");
+
+        } else {
 
-        robot.setAutoDelay(200);
+            robot.keyPress(KeyEvent.VK_ENTER);
+            robot.keyRelease(KeyEvent.VK_ENTER);
+            robot.waitForIdle();
+            isFocusOwner(next, "forward");
+            robot.keyPress(KeyEvent.VK_SHIFT);
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_SHIFT);
+            robot.waitForIdle();
+            isFocusOwner(d, "backward");
+        }
 
-        robot.keyPress(KeyEvent.VK_ENTER);
-        robot.keyRelease(KeyEvent.VK_ENTER);
-        robot.waitForIdle();
+    }
+
+    private static boolean isExcludedLookAndFeel(LookAndFeel lookAndFeel) {
 
+        return lookAndFeel.toString().toLowerCase().contains("aqua")
+                || lookAndFeel.toString().toLowerCase().contains("nimbus")
+                || lookAndFeel.toString().toLowerCase().contains("gtk");
+    }
+
+    private static void focusOn(Component component)
+            throws Exception {
         SwingUtilities.invokeAndWait(new Runnable() {
             @Override
             public void run() {
-                Component focusOwner =
-                        FocusManager.getCurrentManager().getFocusOwner();
-                if (focusOwner != next) {
+                component.requestFocusInWindow();
+            }
+        });
+    }
+
+    private static void isFocusOwner(Component queriedFocusOwner,
+            String direction)
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                Component actualFocusOwner
+                        = FocusManager.getCurrentManager().getFocusOwner();
+                if (actualFocusOwner != queriedFocusOwner) {
+                    frame.dispose();
                     throw new RuntimeException(
-                            "Focus component is wrong after forward key " + focusOwner);
+                            "Focus component is wrong after " + direction
+                            + " direction ");
+
                 }
             }
         });
+    }
 
-        robot.keyPress(KeyEvent.VK_SHIFT);
-        robot.keyPress(KeyEvent.VK_TAB);
-        robot.keyRelease(KeyEvent.VK_TAB);
-        robot.keyRelease(KeyEvent.VK_SHIFT);
-        robot.waitForIdle();
+    private static boolean tryLookAndFeel(String lookAndFeelString)
+            throws Exception {
+
+        try {
+            UIManager.setLookAndFeel(
+                    lookAndFeelString);
+
+        } catch (UnsupportedLookAndFeelException
+                | ClassNotFoundException
+                | InstantiationException
+                | IllegalAccessException e) {
+            return false;
+        }
+        return true;
+    }
+
+    private static void cleanUp() throws Exception {
         SwingUtilities.invokeAndWait(new Runnable() {
             @Override
             public void run() {
-                Component focusOwner =
-                        FocusManager.getCurrentManager().getFocusOwner();
-                if (focusOwner != d) {
-                    throw new RuntimeException(
-                            "Focus component is wrong after backward key " + focusOwner);
-                }
-            }
-        });
-        SwingUtilities.invokeLater(new Runnable() {
-            @Override
-            public void run() {
                 frame.dispose();
             }
         });
-        System.out.println("ok");
-
     }
 }