/
githubmirror
/
panama-vector
Обзор
Документация
Войти
/
githubmirror
/
panama-vector
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
test/jdk/java/awt/Mixing/AWT_Mixing/MixingPanelsResizing.java
343 строки
13 KB
Khalid Boulanouare
8360498: [TEST_BUG] Some Mixing test continue to fail
23 апр 2026, 20:05
23 апр 2026, 20:05
8256d13
Код
Авторство
О чём код?
/* * Copyright (c) 2014, 2026, 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.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Panel; import java.awt.Point; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import test.java.awt.regtesthelpers.Util; /** * AWT/Swing overlapping test for Panel and JPanel behavior during resizing. * <p>See <a href="https://bugs.openjdk.org/browse/JDK-6786219">JDK-6786219</a> for details */ /* * @test * @key headful * @bug 6786219 8221823 * @summary Issues when resizing the frame after mixing of heavy weight & light weight components * @author sergey.grinev@oracle.com: area=awt.mixing * @library ../../regtesthelpers * @build Util * @build FrameBorderCounter * @run main MixingPanelsResizing */ public class MixingPanelsResizing { private static final int TOLERANCE_MACOSX = 15; private static JFrame frame; private static JButton jbutton; private static Button awtButton; private static JButton jbutton2; private static Button awtButton2; private static final Color jbColor = Color.RED; private static final Color awtColor = Color.ORANGE; private static final Color jb2Color = Color.BLUE; private static final Color awt2Color = Color.CYAN; private static final int ROBOT_DELAY = 500; private static Point lLoc; private static int borderShift; private static int frameBorderCounter() { String JAVA_HOME = System.getProperty("java.home"); try { Process p = Runtime.getRuntime() .exec(JAVA_HOME + "/bin/java FrameBorderCounter"); try { p.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); throw new RuntimeException(e); } if (p.exitValue() != 0) { throw new RuntimeException( "FrameBorderCounter exited with not null code!\n" + readInputStream(p.getErrorStream())); } return Integer.parseInt(readInputStream(p.getInputStream()).trim()); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } private static String readInputStream(InputStream is) throws IOException { byte[] buffer = new byte[4096]; int len = 0; StringBuilder sb = new StringBuilder(); try (InputStreamReader isr = new InputStreamReader(is)) { while ((len = is.read(buffer)) > 0) { sb.append(new String(buffer, 0, len)); } } return sb.toString(); } private static void init() throws Exception { //*** Create instructions for the user here *** borderShift = frameBorderCounter(); borderShift = Math.abs(borderShift) == 1 ? borderShift : (borderShift / 2); SwingUtilities.invokeAndWait(new Runnable() { public void run() { // prepare controls frame = new JFrame(); Panel awtPanel = new Panel(); awtPanel.setBackground(Color.GREEN); awtButton = new Button("AWTButton"); awtPanel.add(awtButton); awtButton.setForeground(awtColor); awtButton.setBackground(awtColor); jbutton = new JButton("SwingButton"); awtPanel.add(jbutton); jbutton.setForeground(jbColor); jbutton.setBackground(jbColor); jbutton.setOpaque(true); JPanel jPanel = new JPanel(); jbutton2 = new JButton("SwingButton2"); jPanel.add(jbutton2); jbutton2.setForeground(jb2Color); jbutton2.setBackground(jb2Color); jbutton2.setOpaque(true); awtButton2 = new Button("AWT Button2"); jPanel.add(awtButton2); awtButton2.setForeground(awt2Color); awtButton2.setBackground(awt2Color); jPanel.setBackground(Color.YELLOW); frame.add(awtPanel, BorderLayout.SOUTH); frame.add(jPanel, BorderLayout.NORTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); ///////////////////////// final Robot robot = Util.createRobot(); robot.setAutoDelay(ROBOT_DELAY); Util.waitForIdle(robot); SwingUtilities.invokeAndWait(new Runnable() { public void run() { lLoc = frame.getLocationOnScreen(); lLoc.translate(frame.getWidth() + borderShift, frame.getHeight() + borderShift); } }); //grow robot.mouseMove(lLoc.x, lLoc.y); robot.mousePress(InputEvent.BUTTON1_MASK); Runnable test = new Runnable() { public void run() { Point btnLoc = jbutton.getLocationOnScreen(); Color c = robot.getPixelColor(btnLoc.x + 5, btnLoc.y + 5); System.out.println("Color picked for jbutton: " + c); if (!isAlmostEqualColor(c, jbColor)) { fail("JButton was not redrawn properly on AWT Panel during move"); } btnLoc = awtButton.getLocationOnScreen(); c = robot.getPixelColor(btnLoc.x + 5, btnLoc.y + 5); System.out.println("Color picked for awtButton: " + c); if (!isAlmostEqualColor(c, awtColor)) { fail("AWT Button was not redrawn properly on AWT Panel during move"); } btnLoc = jbutton2.getLocationOnScreen(); c = robot.getPixelColor(btnLoc.x + 5, btnLoc.y + 5); System.out.println("Color picked for jbutton2: " + c); if (!isAlmostEqualColor(c, jb2Color)) { fail("JButton was not redrawn properly on JPanel during move"); } btnLoc = awtButton2.getLocationOnScreen(); c = robot.getPixelColor(btnLoc.x + 5, btnLoc.y + 5); System.out.println("Color picked for awtButton2: " + c); if (!isAlmostEqualColor(c, awt2Color)) { fail("ATW Button was not redrawn properly on JPanel during move"); } } }; for (int i = 0; i < 30; i++) { test.run(); robot.mouseMove(lLoc.x + 20 * i, lLoc.y + 10 * i); } robot.mouseRelease(InputEvent.BUTTON1_MASK); //back System.out.println("fast back"); robot.mousePress(InputEvent.BUTTON1_MASK); for (int i = 5; i >= 0; i--) { test.run(); robot.mouseMove(lLoc.x + 120 * i, lLoc.y + 60 * i); } robot.mouseRelease(InputEvent.BUTTON1_MASK); pass(); }//End init() /***************************************************** * Standard Test Machinery Section * DO NOT modify anything in this section -- it's a * standard chunk of code which has all of the * synchronisation necessary for the test harness. * By keeping it the same in all tests, it is easier * to read and understand someone else's test, as * well as insuring that all tests behave correctly * with the test harness. * There is a section following this for test- * classes ******************************************************/ private static boolean theTestPassed = false; private static boolean testGeneratedInterrupt = false; private static String failureMessage = ""; private static Thread mainThread = null; private static int sleepTime = 300000; // Not sure about what happens if multiple of this test are // instantiated in the same VM. Being static (and using // static vars), it aint gonna work. Not worrying about // it for now. public static void main(String args[]) throws Exception { if (!Toolkit.getDefaultToolkit().isDynamicLayoutActive()) { System.out.println("Dynamic layout is not active. Test passes."); return; } mainThread = Thread.currentThread(); try { init(); } catch (TestPassedException e) { //The test passed, so just return from main and harness will // interepret this return as a pass return; } //At this point, neither test pass nor test fail has been // called -- either would have thrown an exception and ended the // test, so we know we have multiple threads. //Test involves other threads, so sleep and wait for them to // called pass() or fail() try { Thread.sleep(sleepTime); //Timed out, so fail the test throw new RuntimeException( "Timed out after " + (sleepTime / 1000) + " seconds"); } catch (InterruptedException e) { //The test harness may have interrupted the test. If so, rethrow the exception // so that the harness gets it and deals with it. if (!testGeneratedInterrupt) { throw e; } //reset flag in case hit this code more than once for some reason (just safety) testGeneratedInterrupt = false; if (theTestPassed == false) { throw new RuntimeException(failureMessage); } } }//main public static synchronized void setTimeoutTo(int seconds) { sleepTime = seconds * 1000; } public static synchronized void pass() { System.out.println("The test passed."); System.out.println("The test is over, hit Ctl-C to stop Java VM"); //first check if this is executing in main thread if (mainThread == Thread.currentThread()) { //Still in the main thread, so set the flag just for kicks, // and throw a test passed exception which will be caught // and end the test. theTestPassed = true; throw new TestPassedException(); } theTestPassed = true; testGeneratedInterrupt = true; mainThread.interrupt(); }//pass() public static synchronized void fail() { //test writer didn't specify why test failed, so give generic fail("it just plain failed! :-)"); } public static synchronized void fail(String whyFailed) { System.out.println("The test failed: " + whyFailed); System.out.println("The test is over, hit Ctl-C to stop Java VM"); //check if this called from main thread if (mainThread == Thread.currentThread()) { //If main thread, fail now 'cause not sleeping throw new RuntimeException(whyFailed); } theTestPassed = false; testGeneratedInterrupt = true; failureMessage = whyFailed; mainThread.interrupt(); }//fail() private static boolean isAlmostEqualColor(Color color, Color refColor) { System.out.println("Comparing color: " + color + " with reference " + "color: " + refColor); return color.equals(refColor) || (Math.abs(color.getRed() - refColor.getRed()) < TOLERANCE_MACOSX && Math.abs(color.getGreen() - refColor.getGreen()) < TOLERANCE_MACOSX && Math.abs(color.getBlue() - refColor.getBlue()) < TOLERANCE_MACOSX); } static class TestPassedException extends RuntimeException { } }// class JButtonInGlassPane