8160438: javax/swing/plaf/nimbus/8057791/bug8057791.java fails
Reviewed-by: alexsch, rchamyal
--- a/jdk/test/javax/swing/plaf/nimbus/8057791/bug8057791.java Mon Jul 18 15:43:30 2016 -0500
+++ b/jdk/test/javax/swing/plaf/nimbus/8057791/bug8057791.java Wed Jul 20 11:25:57 2016 +0530
@@ -21,20 +21,20 @@
* questions.
*/
-/* @test
- @bug 8057791
+ /* @test
+ @bug 8057791 8160438
@summary Selection in JList is drawn with wrong colors in Nimbus L&F
- @author Anton Litvinov
@run main bug8057791
*/
-
import java.awt.Color;
+import java.awt.Font;
import java.awt.Graphics;
+import java.awt.Point;
import java.awt.Rectangle;
+import java.awt.Robot;
import java.awt.image.BufferedImage;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashSet;
import javax.swing.DefaultListModel;
+import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
@@ -42,59 +42,148 @@
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
public class bug8057791 {
- public static void main(String[] args) {
+
+ private static JFrame frame;
+ private static JList<String> list;
+ private static DefaultListModel<String> model;
+ private static Robot robot;
+ private static final int SELECTED_INDEX = 0;
+ private static volatile String errorString = "";
+
+ public static void main(String[] args) throws Exception {
+ robot = new Robot();
+ robot.waitForIdle();
+ runSteps();
+ if (!errorString.isEmpty()) {
+ throw new RuntimeException("Error Log:\n" + errorString);
+ }
+ }
+
+ private static void runSteps() throws Exception {
+ if (tryNimbusLookAndFeel()) {
+ createUI();
+ robot.waitForIdle();
+ runColorTestCase();
+ robot.waitForIdle();
+ cleanUp();
+ }
+
+ }
+
+ private static boolean tryNimbusLookAndFeel()
+ throws Exception {
try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
-
- SwingUtilities.invokeAndWait(new Runnable() {
- @Override
- public void run() {
- final int listWidth = 50;
- final int listHeight = 50;
- final int selCellIndex = 0;
+ } catch (UnsupportedLookAndFeelException e) {
+ errorString += e.getMessage();
+ return false;
+ }
+ return true;
+ }
- JList<String> list = new JList<String>();
- list.setSize(listWidth, listHeight);
- DefaultListModel<String> listModel = new DefaultListModel<String>();
- listModel.add(selCellIndex, "E");
- list.setModel(listModel);
- list.setSelectedIndex(selCellIndex);
-
- BufferedImage img = new BufferedImage(listWidth, listHeight,
- BufferedImage.TYPE_INT_ARGB);
- Graphics g = img.getGraphics();
- list.paint(g);
- g.dispose();
+ private static void createUI()
+ throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ frame = new JFrame();
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ list = new JList<>();
+ model = new DefaultListModel<>();
+ model.add(0, "@@");
+ Font font = list.getFont();
+ list.setFont(
+ new Font(font.getFontName(),
+ Font.BOLD,
+ (int) (font.getSize2D() * 2)));
+ list.setModel(model);
+ list.setSelectedIndex(SELECTED_INDEX);
+ frame.add(list);
+ frame.pack();
+ frame.setLocationRelativeTo(null);
+ frame.setVisible(true);
+ }
+ });
+ }
- Rectangle cellRect = list.getCellBounds(selCellIndex, selCellIndex);
- HashSet<Color> cellColors = new HashSet<Color>();
- int uniqueColorIndex = 0;
- for (int x = cellRect.x; x < (cellRect.x + cellRect.width); x++) {
- for (int y = cellRect.y; y < (cellRect.y + cellRect.height); y++) {
- Color cellColor = new Color(img.getRGB(x, y), true);
- if (cellColors.add(cellColor)) {
- System.err.println(String.format("Cell color #%d: %s",
- uniqueColorIndex++, cellColor));
- }
- }
- }
+ private static void runColorTestCase() throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ Rectangle cellBounds = list.getCellBounds(SELECTED_INDEX, SELECTED_INDEX);
+ cellBounds.x += list.getLocationOnScreen().x;
+ cellBounds.y += list.getLocationOnScreen().y;
+ //positive test cases
+ Color foregroundColor = list.getSelectionForeground();
+ Color backgroundColor = list.getSelectionBackground();
+ checkColor(foregroundColor, cellBounds);
+ checkColor(backgroundColor, cellBounds);
+ //negative test cases
+ Color changedForegroundColor = foregroundColor.darker();
+ Color changedBackgroundColor = backgroundColor.brighter();
+ checkNotColor(changedForegroundColor, cellBounds);
+ checkNotColor(changedBackgroundColor, cellBounds);
+ }
+ });
+ }
+
+ private static void checkColor(Color colorCheck, Rectangle bounds) {
+ if (!findColor(colorCheck, bounds)) {
+ String error = "[ERROR][" + colorCheck.toString()
+ + "] Not found in selected cell";
+ errorString += error;
+ }
+ }
- Color selForegroundColor = list.getSelectionForeground();
- Color selBackgroundColor = list.getSelectionBackground();
- if (!cellColors.contains(new Color(selForegroundColor.getRGB(), true))) {
- throw new RuntimeException(String.format(
- "Selected cell is drawn without selection foreground color '%s'.",
- selForegroundColor));
- }
- if (!cellColors.contains(new Color(selBackgroundColor.getRGB(), true))) {
- throw new RuntimeException(String.format(
- "Selected cell is drawn without selection background color '%s'.",
- selBackgroundColor));
+ private static void checkNotColor(Color colorCheck, Rectangle bounds) {
+ if (findColor(colorCheck, bounds)) {
+ String error = "[ERROR][" + colorCheck.toString()
+ + "] is found in selected cell. "
+ + "Not supposed to be found in negative test case";
+ errorString += error;
+ }
+ }
+
+ private static boolean findColor(Color colorCheck, Rectangle bounds) {
+ BufferedImage img = new BufferedImage(bounds.width,
+ bounds.height,
+ BufferedImage.TYPE_INT_ARGB);
+ Graphics g = img.getGraphics();
+ list.paint(g);
+ g.dispose();
+ checkLoops:
+ for (int x = 0; x < bounds.width; x++) {
+ for (int y = 0; y < bounds.height; y++) {
+ Point relativePointCheck = new Point(bounds.x + x, bounds.y + y);
+ robot.mouseMove(relativePointCheck.x, relativePointCheck.y);
+ Color detectedColor = robot.getPixelColor(relativePointCheck.x,
+ relativePointCheck.y);
+ if (detectedColor.equals(colorCheck)) {
+ return true;
+ }
+ if (isMac()) {
+ //One more chance for Mac due to non-Generic display setting
+ detectedColor = new Color(img.getRGB(x, y), true);
+ if (detectedColor.equals(colorCheck)) {
+ return true;
}
}
- });
- } catch (UnsupportedLookAndFeelException | InterruptedException | InvocationTargetException e) {
- throw new RuntimeException(e);
+ }
}
+ return false;
+ }
+
+ private static boolean isMac() {
+ String osName = System.getProperty("os.name");
+ return osName.contains("Mac");
+ }
+
+ private static void cleanUp() throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ frame.dispose();
+ }
+ });
}
}