jdk-24/test/jdk/java/awt/Icon/IconShowingTest/IconShowingTest.java
Harshitha Onkar 787e16bb44 8289077: Add manual tests to open
Reviewed-by: azvegint
2023-02-06 23:43:18 +00:00

281 lines
11 KiB
Java

/*
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Window;
import java.awt.image.BaseMultiResolutionImage;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
import static jdk.test.lib.Platform.isWindows;
/*
* @test
* @bug 6233560 6280303 6292933
* @summary Tests if toplevel's icons are shown correctly
* @key headful
* @requires (os.family == "windows")
* @library /java/awt/regtesthelpers /test/lib
* @build PassFailJFrame jdk.test.lib.Platform
* @run main/manual IconShowingTest
*/
public class IconShowingTest {
private static final int EXTRA_OFFSET = 50;
private static final String INSTRUCTIONS =
"Look at the icons shown on frames and dialogs, icons of minimized frames\n"
+ (isWindows() ? "are displayed in ALT+TAB window\n" : "") + "\n"+
"""
Alpha-channel (transparency) should be supported
by Windows and may not be supported by other platforms.
Notes:
* Icons might appear in grayscale.
* Default icon might be either Duke or Java Cup.
Press PASS if the icons match label description in windows
and are shown correctly, FAIL otherwise.
""";
public static void main(String[] args) throws Exception {
PassFailJFrame passFailJFrame = new PassFailJFrame("Icon Showing " +
"Test Instructions", INSTRUCTIONS, 5, 18, 48);
SwingUtilities.invokeAndWait(() -> {
try {
createAndShowGUI();
} catch (Exception e) {
throw new RuntimeException("Error while running the test", e);
}
});
passFailJFrame.awaitAndCheck();
}
public static void createAndShowGUI()
throws InterruptedException, InvocationTargetException {
Image i_16 = createIcon(16, 8, "16");
Image i_32 = createIcon(32, 14, "32");
Image i_48 = createIcon(48, 24, "48");
Image i_64 = createIcon(64, 30, "64");
ImageIcon ji_16 = new ImageIcon(IconShowingTest.class.getResource(
"java-icon16.png"));
Image[] images = new Image[] {i_16, i_32, i_48, i_64};
List<Image> imageList = Arrays.asList(images);
ImageIcon icon = new ImageIcon(new MRImage(images));
Frame f1 = new Frame("Frame 1");
f1.setIconImages(imageList);
f1.setLayout(new GridLayout(0, 1));
f1.add(new JLabel("Icon 16x16", new ImageIcon(i_16), JLabel.CENTER));
f1.add(new JLabel("Icon 32x32", new ImageIcon(i_32), JLabel.CENTER));
f1.add(new JLabel("Icon 48x48", new ImageIcon(i_48), JLabel.CENTER));
f1.add(new JLabel("Icon 64x64", new ImageIcon(i_64), JLabel.CENTER));
PassFailJFrame.positionTestWindow(null,
PassFailJFrame.Position.TOP_LEFT_CORNER);
Rectangle bounds = PassFailJFrame.getInstructionFrameBounds();
int windowPosX = bounds.x + bounds.width + 5;
f1.setBounds(windowPosX, EXTRA_OFFSET, 200, 300);
f1.setVisible(true);
f1.toFront();
PassFailJFrame.addTestWindow(f1);
int windowPosY = f1.getY() + f1.getHeight();
Dialog d11 = new Dialog(f1, "Dialog 1.1");
d11.setResizable(false);
addIconAndLabelToWindow(d11, windowPosX, windowPosY - EXTRA_OFFSET,
(isWindows() ? "No icon, non-resizable dialog"
: "Inherited icon, non-resizable dialog"),
(isWindows() ? null : icon));
Dialog d12 = new Dialog(d11, "Dialog 1.2");
addIconAndLabelToWindow(d12, windowPosX, windowPosY + EXTRA_OFFSET,
"Inherited icon, resizable dialog", icon);
Frame f2 = new Frame("Frame 2");
addIconAndLabelToWindow(f2, windowPosX + 200, 0,
"Default Icon", ji_16);
Dialog d21 = new Dialog(f2, "Dialog 2.1");
d21.setResizable(false);
addIconAndLabelToWindow(d21, windowPosX + 200, 100,
(isWindows() ? "No icon, non-resizable dialog"
: "Inherited default Icon, non-resizable dialog"),
(isWindows() ? null : ji_16));
Dialog d22 = new Dialog(f2, "Dialog 2.2");
addIconAndLabelToWindow(d22, windowPosX + 200, 200,
"Inherited default Icon, resizable dialog", ji_16);
Dialog d23 = new Dialog(f2, "Dialog 2.3");
d23.setIconImages(imageList);
d23.setResizable(false);
addIconAndLabelToWindow(d23, windowPosX + 200, 300,
"Modified Icon, non-resizable dialog", icon);
Dialog d24 = new Dialog(f2, "Dialog 2.4");
d24.setIconImages(imageList);
addIconAndLabelToWindow(d24, windowPosX + 200, 400,
"Modified Icon, resizable dialog", icon);
Dialog d31 = new Dialog((Frame)null, "Dialog 3.1");
addIconAndLabelToWindow(d31, windowPosX + 400, 100,
"Default icon, resizable dialog", ji_16);
Dialog d32 = new Dialog(d31, "Dialog 3.2");
d32.setResizable(false);
addIconAndLabelToWindow(d32, windowPosX + 400, 200,
(isWindows() ? "No icon, non-resizable dialog"
: "Default Icon, non-resizable dialog"),
(isWindows() ? null : ji_16));
Dialog d33 = new Dialog(d31, "Dialog 3.3");
d33.setIconImages(imageList);
d33.setResizable(false);
addIconAndLabelToWindow(d33, windowPosX + 400, 300,
"Modified icon, non-resizable dialog", icon);
Dialog d34 = new Dialog(d33, "Dialog 3.4");
d34.setResizable(false);
addIconAndLabelToWindow(d34, windowPosX + 400, 400,
(isWindows() ? "No icon, non-resizable dialog"
: "Inherited modified icon, non-resizable dialog"),
(isWindows() ? null : icon));
Dialog d41 = new Dialog((Frame) null, "Dialog 4.1");
d41.setResizable(false);
addIconAndLabelToWindow(d41, windowPosX + 600, 100,
"Default icon, non-resizable dialog", ji_16);
Dialog d42 = new Dialog(d41, "Dialog 4.2");
addIconAndLabelToWindow(d42, windowPosX + 600, 200,
"Inherited default icon, resizable dialog", ji_16);
Dialog d43 = new Dialog(d41, "Dialog 4.3");
d43.setIconImages(imageList);
addIconAndLabelToWindow(d43, windowPosX + 600, 300,
"Modified icon, resizable dialog", icon);
Dialog d44 = new Dialog(d43, "Dialog 4.4");
addIconAndLabelToWindow(d44, windowPosX + 600, 400,
"Inherited modified icon, resizable dialog", icon);
}
private static void addIconAndLabelToWindow(Window win, int x, int y,
String title, ImageIcon icon) {
win.setBounds(x, (y + EXTRA_OFFSET), 200, 100);
win.add(new JLabel(title, icon, JLabel.CENTER));
win.setVisible(true);
win.toFront();
PassFailJFrame.addTestWindow(win);
}
public static Image createIcon(int size, int fontSize, String value) {
BufferedImage bImg = new BufferedImage(size, size, TYPE_INT_ARGB);
Graphics2D g2d = bImg.createGraphics();
int half = size / 2;
for (int i = 0; i < half - 1; i += 2) {
g2d.setComposite(AlphaComposite.Src);
g2d.setColor(Color.RED);
g2d.fillRect(0, i, half, 1);
g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(0, i + 1, half, 1);
}
g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(half, 0, half, half);
g2d.setComposite(AlphaComposite.Src);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setFont(new Font("Dialog", Font.PLAIN, fontSize));
g2d.setColor(Color.BLUE);
g2d.drawString(value, half - 1, half - 2);
int height = (half + 1) / 3;
// Green
GradientPaint greenGradient = new GradientPaint(0, half - 1, Color.GREEN,
size, half - 1, new Color(0, 255, 0, 0));
g2d.setPaint(greenGradient);
g2d.fillRect(0, half - 1, size, height);
// Blue
GradientPaint blueGradient = new GradientPaint(0, (half - 1) + height, Color.BLUE,
size, (half - 1) + height, new Color(0, 0, 255, 0));
g2d.setPaint(blueGradient);
g2d.fillRect(0, (half - 1) + height, size, height);
// Red
GradientPaint redGradient = new GradientPaint(0, (half - 1) + height * 2, Color.RED,
size, (half - 1) + height * 2, new Color(255, 0, 0, 0));
g2d.setPaint(redGradient);
g2d.fillRect(0, (half - 1) + height * 2, size, height);
g2d.dispose();
return bImg;
}
private static class MRImage extends BaseMultiResolutionImage {
public MRImage(Image... resolutionVariants) {
super(resolutionVariants);
}
@Override
public Image getResolutionVariant(double expectedSize, double unused) {
final int size = (int) Math.round(expectedSize / 16.0) * 16;
List<Image> imageList = getResolutionVariants();
for (int i = 0; i < imageList.size(); i++) {
if (size == imageList.get(i).getWidth(null)) {
return imageList.get(i);
} else if (imageList.get(i).getWidth(null) > size) {
return imageList.get(i > 0 ? i - 1 : i);
}
}
return imageList.get(0); //default/base image
}
}
}