/* * Copyright (c) 2015, 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. */ /* * @test * @summary Testing built-in editor. * @ignore 8139872 * @build ReplToolTesting EditorTestBase * @run testng EditorPadTest */ import java.awt.AWTException; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.awt.Robot; import java.awt.event.InputEvent; import java.awt.event.WindowEvent; import java.lang.reflect.InvocationTargetException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.function.Consumer; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JViewport; import javax.swing.SwingUtilities; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class EditorPadTest extends EditorTestBase { private static final int DELAY = 500; private static Robot robot; private static JFrame frame = null; private static JTextArea area = null; private static JButton cancel = null; private static JButton accept = null; private static JButton exit = null; @BeforeClass public static void setUp() { try { robot = new Robot(); robot.setAutoWaitForIdle(true); robot.setAutoDelay(DELAY); } catch (AWTException e) { throw new ExceptionInInitializerError(e); } } @AfterClass public static void shutdown() { executorShutdown(); } @Override public void writeSource(String s) { SwingUtilities.invokeLater(() -> area.setText(s)); } @Override public String getSource() { try { String[] s = new String[1]; SwingUtilities.invokeAndWait(() -> s[0] = area.getText()); return s[0]; } catch (InvocationTargetException | InterruptedException e) { throw new RuntimeException(e); } } @Override public void accept() { clickOn(accept); } @Override public void exit() { clickOn(exit); } @Override public void cancel() { clickOn(cancel); } @Override public void shutdownEditor() { SwingUtilities.invokeLater(this::clearElements); waitForIdle(); } @Test public void testShuttingDown() { testEditor( (a) -> assertEditOutput(a, "/e", "", this::shutdownEditor) ); } private void waitForIdle() { robot.waitForIdle(); robot.delay(DELAY); } private Future task; @Override public void assertEdit(boolean after, String cmd, Consumer checkInput, Consumer checkOutput, Action action) { if (!after) { setCommandInput(cmd + "\n"); task = getExecutor().submit(() -> { try { waitForIdle(); SwingUtilities.invokeLater(this::seekElements); waitForIdle(); checkInput.accept(getSource()); action.accept(); } catch (Throwable e) { shutdownEditor(); if (e instanceof AssertionError) { throw (AssertionError) e; } throw new RuntimeException(e); } }); } else { try { task.get(); waitForIdle(); checkOutput.accept(getCommandOutput()); } catch (ExecutionException e) { if (e.getCause() instanceof AssertionError) { throw (AssertionError) e.getCause(); } throw new RuntimeException(e); } catch (Exception e) { throw new RuntimeException(e); } finally { shutdownEditor(); } } } private void seekElements() { for (Frame f : Frame.getFrames()) { if (f.getTitle().contains("Edit Pad")) { frame = (JFrame) f; // workaround frame.setLocation(0, 0); Container root = frame.getContentPane(); for (Component c : root.getComponents()) { if (c instanceof JScrollPane) { JScrollPane scrollPane = (JScrollPane) c; for (Component comp : scrollPane.getComponents()) { if (comp instanceof JViewport) { JViewport view = (JViewport) comp; area = (JTextArea) view.getComponent(0); } } } if (c instanceof JPanel) { JPanel p = (JPanel) c; for (Component comp : p.getComponents()) { if (comp instanceof JButton) { JButton b = (JButton) comp; switch (b.getText()) { case "Cancel": cancel = b; break; case "Exit": exit = b; break; case "Accept": accept = b; break; } } } } } } } } private void clearElements() { if (frame != null) { frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); frame = null; } area = null; accept = null; cancel = null; exit = null; } private void clickOn(JButton button) { waitForIdle(); Point p = button.getLocationOnScreen(); Dimension d = button.getSize(); robot.mouseMove(p.x + d.width / 2, p.y + d.height / 2); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); } }