8144161: [TESTBUG] [macosx] Test javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java fails for mac
authoraniyogi
Tue, 31 May 2016 16:03:21 +0530
changeset 39015 3fa4e9304a9a
parent 39014 bb1c478f025b
child 39016 f52c1429ae85
8144161: [TESTBUG] [macosx] Test javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java fails for mac Reviewed-by: rchamyal, alexsch
jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java
--- a/jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java	Tue May 31 12:29:57 2016 +0530
+++ b/jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java	Tue May 31 16:03:21 2016 +0530
@@ -22,106 +22,153 @@
  */
 
 /* @test
-   @bug 7072653
-   @summary JComboBox popup mispositioned if its height exceeds the screen height
-   @author Semyon Sadetsky
-  */
-
-
-import javax.swing.*;
+ * @bug 7072653 8144161
+ * @summary JComboBox popup mispositioned if its height exceeds the screen height
+ * @run main bug7072653
+ */
+import java.awt.FlowLayout;
+import java.awt.GraphicsConfiguration;
+import java.awt.Insets;
+import java.awt.Robot;
 import javax.swing.event.PopupMenuEvent;
 import javax.swing.event.PopupMenuListener;
-import java.awt.*;
 import java.awt.Toolkit;
+import java.awt.Window;
+import java.util.Arrays;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
 
 public class bug7072653 {
 
     private static JComboBox combobox;
     private static JFrame frame;
+    private static Robot robot;
+    private static volatile String errorString = "";
 
     public static void main(String[] args) throws Exception {
-        try {
+        robot = new Robot();
+        robot.delay(100);
+        UIManager.LookAndFeelInfo[] lookAndFeelArray
+                = UIManager.getInstalledLookAndFeels();
+        for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+            executeCase(lookAndFeelItem.getClassName());
+            robot.delay(1000);
+        }
+        if (!"".equals(errorString)) {
+
+            throw new RuntimeException("Error Log:\n" + errorString);
+        }
+    }
+
+    private static void executeCase(String lookAndFeelString) throws Exception {
+        if (tryLookAndFeel(lookAndFeelString)) {
             SwingUtilities.invokeAndWait(new Runnable() {
                 @Override
                 public void run() {
-                    frame = new JFrame("JComboBox Test");
-                    setup(frame);
+                    try {
+                        setup(lookAndFeelString);
+                        test();
+                    } catch (Exception ex) {
+                        errorString += "\n";
+                        errorString += Arrays.toString(ex.getStackTrace());
+                    }
+                    finally {
+                        frame.dispose();
+                    }
                 }
             });
-            test();
-        }
-        finally {
-            frame.dispose();
         }
 
     }
 
-    static void setup(JFrame frame)  {
-
+    private static void setup(String lookAndFeelString)
+            throws Exception {
 
-        frame.setUndecorated(true);
+        frame = new JFrame("JComboBox Test " + lookAndFeelString);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
         frame.setSize(320, 200);
-
         frame.getContentPane().setLayout(new FlowLayout());
-
+        frame.setLocationRelativeTo(null);
         combobox = new JComboBox(new DefaultComboBoxModel() {
-            public Object getElementAt(int index) { return "Element " + index; }
+            @Override
+            public Object getElementAt(int index) {
+                return "Element " + index;
+            }
+
+            @Override
             public int getSize() {
-                return 1000;
+                return 100;
             }
         });
 
-
         combobox.setMaximumRowCount(100);
         frame.getContentPane().add(combobox);
+        frame.setVisible(true);
+        combobox.addPopupMenuListener(new PopupMenuListener() {
+            @Override
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+            }
 
-        frame.setVisible(true);
+            @Override
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                int height = 0;
+                for (Window window : JFrame.getWindows()) {
+                    if (Window.Type.POPUP == window.getType()) {
+                        height = window.getSize().height;
+                        break;
+                    }
+                }
+                GraphicsConfiguration gc
+                        = combobox.getGraphicsConfiguration();
+                Insets screenInsets = Toolkit.getDefaultToolkit()
+                        .getScreenInsets(gc);
+                int gcHeight = gc.getBounds().height;
+                if (lookAndFeelString.contains("aqua")) {
+                    gcHeight = gcHeight - screenInsets.top;
+                    //For Aqua LAF
+                } else {
+                    gcHeight = gcHeight - screenInsets.top
+                            - screenInsets.bottom;
+                }
+                if (height == gcHeight) {
+                    return;
+                }
+
+                String exception = "Popup window height "
+                        + "For LookAndFeel" + lookAndFeelString + " is wrong"
+                        + "\nShould be " + height + "Actually " + gcHeight;
+                errorString += exception;
+            }
+
+            @Override
+            public void popupMenuCanceled(PopupMenuEvent e) {
+            }
+
+        });
 
     }
 
-    static void test() throws Exception{
-        SwingUtilities.invokeAndWait(new Runnable() {
-            @Override
-            public void run() {
-                combobox.addPopupMenuListener(new PopupMenuListener() {
-                    @Override
-                    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
-                    }
-
-                    @Override
-                    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
-                        int height = 0;
-                        for (Window window : JFrame.getWindows()) {
-                            if (Window.Type.POPUP == window.getType()) {
-                                height = window.getSize().height;
-                                break;
-                            }
-                        }
-                        GraphicsConfiguration gc =
-                                combobox.getGraphicsConfiguration();
-                        Insets screenInsets = Toolkit.getDefaultToolkit()
-                                .getScreenInsets(gc);
-
-                        if (height == gc.getBounds().height - screenInsets.top -
-                                screenInsets.bottom ) {
-                            System.out.println("ok");
-                            return;
-                        }
-                        throw new RuntimeException(
-                                "Popup window height is wrong " + height);
-                    }
-
-                    @Override
-                    public void popupMenuCanceled(PopupMenuEvent e) {
-                    }
-                });
-                combobox.setPopupVisible(true);
-                combobox.setPopupVisible(false);
-            }
-        });
+    private static void test() throws Exception {
+        combobox.setPopupVisible(true);
+        combobox.setPopupVisible(false);
     }
 
+    private static boolean tryLookAndFeel(String lookAndFeelString)
+            throws Exception {
+        try {
+            UIManager.setLookAndFeel(
+                    lookAndFeelString);
 
+        } catch (UnsupportedLookAndFeelException
+                | ClassNotFoundException
+                | InstantiationException
+                | IllegalAccessException e) {
+            return false;
+        }
+        return true;
+    }
 }