--- /dev/null 2017-11-06 10:26:03.000000000 +0530 +++ new/test/jdk/java/awt/Robot/RobotUnicodeCodeTest.java 2017-11-06 10:26:01.870506800 +0530 @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2017, 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 + * @bug 8148344 + * @summary Unicode text print via Java Robot + @run main/manual RobotUnicodeCodeTest + */ +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import java.awt.AWTException; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +public class RobotUnicodeCodeTest { + private static TestUI test = null; + private static CountDownLatch testLatch = null; + + public static void disposeUI() throws Exception { + SwingUtilities.invokeAndWait(() -> { + if(test != null) { + test.disposeUI(); + } + }); + } + + public static void main(String[] args) throws Exception { + testLatch = new CountDownLatch(1); + test = new TestUI(testLatch); + int [] unicodeCodes = { + // U+201A(8218 in decimal) represents comma characher(,) + // U+49, U+4F, U+50, + 73, 8218, 79, 8218, 80, 8218, + + // U+C5, + 197, 8218, + + // Surrogate pair for U+10437, + 55297, 56375, + 8218, + + // Surrogare pair for U+24B62, + 55378, 57186, + 8218, + + // U+4B, U+4A + 75, 8218, 74}; + + // initialize the test UI system + SwingUtilities.invokeAndWait(() -> { + try { + test.createUI(); + } catch (Exception ex) { + throw new RuntimeException("Exception while creating UI"); + } + }); + + RobotFrame robotFrame = new RobotFrame(); + try { + Robot robot = new Robot(); + robot.setAutoDelay(300); + robot.mouseMove(450, 450); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + + // Input unicode keys to Robot + for (int i = 0; i < unicodeCodes.length; i++) { + robot.keyUnicode(unicodeCodes[i]); + } + } catch (AWTException e) { + robotFrame.dispose(); + disposeUI(); + throw new RuntimeException("Exception while Java Robot unicode key input"); + } + + boolean status = testLatch.await(1, TimeUnit.MINUTES); + if (!status) { + System.out.println("Test timed out."); + } + + if (test.testResult == false) { + disposeUI(); + throw new RuntimeException("Test Failed."); + } + + robotFrame.dispose(); + } + + @SuppressWarnings("serial") + private static class RobotFrame extends JFrame { + RobotFrame() { + this.setLocation(300, 300); + this.setTitle("RobotUnicodeCodeFrame"); + JTextArea textArea = new JTextArea(25, 50); + this.add(textArea); + this.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + this.pack(); + this.setVisible(true); + } + } +} + +class TestUI { + + private static JFrame mainFrame; + private static JPanel mainControlPanel; + + private static JTextArea instructionTextArea; + + private static JPanel resultButtonPanel; + private static JButton passButton; + private static JButton failButton; + + private GridBagConstraints gbc; + private static GridBagLayout layout; + private final CountDownLatch latch; + public boolean testResult = false; + + public TestUI(CountDownLatch latch) { + this.latch = latch; + } + + public final void createUI() throws Exception { + mainFrame = new JFrame(); + + layout = new GridBagLayout(); + mainControlPanel = new JPanel(layout); + resultButtonPanel = new JPanel(layout); + + gbc = new GridBagConstraints(); + + // Create Test instructions + String instructions + = "See for the Unicode chars(UTF-16) printed in the following order \n" + + " U+49, U+4F, U+50, U+C5, U+10437(Surrogate pairs), \n" + + " U+24B62(Surrogate pairs), U+4B, U+4A \n" + + "If yes, click on 'pass' else click on 'fail'\n"; + + instructionTextArea = new JTextArea(); + instructionTextArea.setText(instructions); + instructionTextArea.setEditable(false); + instructionTextArea.setBorder(BorderFactory. + createTitledBorder("Test Instructions")); + + gbc.gridx = 0; + gbc.gridy = 0; + mainControlPanel.add(instructionTextArea, gbc); + + // Add customization to this test ui + customize(); + + // Create resultButtonPanel with Pass, Fail buttons + passButton = new JButton("Pass"); + passButton.setActionCommand("Pass"); + passButton.addActionListener((ActionEvent e) -> { + System.out.println("Pass Button pressed!"); + testResult = true; + latch.countDown(); + disposeUI(); + }); + + failButton = new JButton("Fail"); + failButton.setActionCommand("Fail"); + failButton.addActionListener((ActionEvent e) -> { + System.out.println("Fail Button pressed!"); + testResult = false; + latch.countDown(); + disposeUI(); + }); + + gbc.gridx = 0; + gbc.gridy = 0; + resultButtonPanel.add(passButton, gbc); + + gbc.gridx = 1; + gbc.gridy = 0; + resultButtonPanel.add(failButton, gbc); + + gbc.gridx = 0; + gbc.gridy = 2; + mainControlPanel.add(resultButtonPanel, gbc); + + mainFrame.add(mainControlPanel); + mainFrame.pack(); + mainFrame.setVisible(true); + } + + public void disposeUI() { + mainFrame.dispose(); + } + + private void customize() throws Exception { + // Customize the test UI title + mainFrame.setTitle("RobotUnicodeCodeTest"); + } +}