test/jdk/java/awt/event/KeyEvent/KeyTyped/CtrlASCII.java
author serb
Wed, 27 Feb 2019 18:46:55 -0800
changeset 54231 e4813eded7cb
parent 50834 9cf279436b9d
permissions -rw-r--r--
8213110: Remove the use of applets in automatic tests Reviewed-by: prr

/*
 * Copyright (c) 2007, 2018, 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
  @key headful
  @bug  6497426
  @summary ests that pressing of Ctrl+ascii mostly fires KEY_TYPED with a Unicode control symbols
  @run main CtrlASCII
 */

import java.awt.*;
import java.awt.event.*;
import java.util.*;

//
// In this test, a key listener for KEY_TYPED checks if a character typed has
// a correspondent keycode in an initially filled hashtable.
// If it does not, test fails. If character was produced by
// pressing a wrong key still listed in the hashtable, test cannot detect it.
// Under MS Windows, unlike X Window, some Ctrl+Ascii keystrokes don't
// produce a unicode character, so there will be no KEY_TYPED and no problem.
// Test doesn't try to verify Ctrl+deadkey behavior.
//
public class CtrlASCII extends Frame implements KeyListener
{
    // Declare things used in the test, like buttons and labels here
    static Hashtable<Character, Integer> keycharHash = new Hashtable<Character, Integer>();
    static boolean testFailed = false;
    //Frame frame;
    TextField tf;
    Robot robot;

    static void fillHash( boolean isMSWindows ) {
        keycharHash.put(    (char)0x20         , KeyEvent.VK_SPACE        );                      /*32,x20*/ /*' ' */
        keycharHash.put(    (char)0x21         , KeyEvent.VK_EXCLAMATION_MARK        );           /*33,x21*/ /*'!' fr*/
        keycharHash.put(    (char)0x22         , KeyEvent.VK_QUOTEDBL        );                   /*34,x22*/ /*'"' fr*/
        keycharHash.put(    (char)0x23         , KeyEvent.VK_NUMBER_SIGN        );                /*35,x23*/ /*'#' de*/
        keycharHash.put(    (char)0x24         , KeyEvent.VK_DOLLAR        );                      /*36,x24*/ /*'$', de_CH*/
        //keycharHash.put('%',                                  (char)0x25        );                                  /*37,x25*/ /*no VK, cannot test*/
        keycharHash.put(    (char)0x26    , KeyEvent.VK_AMPERSAND        );                  /*38,x26*/ /*'&', fr*/
        keycharHash.put(    (char)0x27    , KeyEvent.VK_QUOTE        );                      /*39,x27*/ /*''', fr*/
        keycharHash.put(    (char)0x28    , KeyEvent.VK_LEFT_PARENTHESIS        );           /*40,x28*/ /*'(', fr*/
        keycharHash.put(    (char)0x29    , KeyEvent.VK_RIGHT_PARENTHESIS        );           /*41,x29*/ /*')', fr*/
        keycharHash.put(    (char)0x2a    , KeyEvent.VK_ASTERISK        );                    /*42,x2a*/ /*'*', fr*/
        keycharHash.put(    (char)0x2b    , KeyEvent.VK_PLUS        );                        /*43,x2b*/ /*'+', de*/
        keycharHash.put(    (char)0x2c    , KeyEvent.VK_COMMA        );                       /*44,x2c*/  /*','*/
        keycharHash.put(    (char)0x2d    , KeyEvent.VK_MINUS        );                       /*45,x2d*/ /*'-'*/
        keycharHash.put(    (char)0x2e    , KeyEvent.VK_PERIOD        );                      /*46,x2e*/ /*'.'*/
        keycharHash.put(    (char)0x2f    , KeyEvent.VK_SLASH        );                       /*47,x2f*/ /*'/'*/
        keycharHash.put(    (char)0x30    , KeyEvent.VK_0        );                           /*48,x30*/
        keycharHash.put(    (char)0x31    , KeyEvent.VK_1        );                           /*49,x31*/
        keycharHash.put(    (char)0x32    , KeyEvent.VK_2        );                           /*50,x32*/
        keycharHash.put(    (char)0x33    , KeyEvent.VK_3        );                           /*51,x33*/
        keycharHash.put(    (char)0x34    , KeyEvent.VK_4        );                           /*52,x34*/
        keycharHash.put(    (char)0x35    , KeyEvent.VK_5        );                           /*53,x35*/
        keycharHash.put(    (char)0x36    , KeyEvent.VK_6        );                           /*54,x36*/
        keycharHash.put(    (char)0x37    , KeyEvent.VK_7        );                           /*55,x37*/
        keycharHash.put(    (char)0x38    , KeyEvent.VK_8        );                           /*56,x38*/
        keycharHash.put(    (char)0x39    , KeyEvent.VK_9        );                           /*57,x39*/
        keycharHash.put(    (char)0x3a    , KeyEvent.VK_COLON        );                       /*58,x3a*/ /*':', fr*/
        keycharHash.put(    (char)0x3b    , KeyEvent.VK_SEMICOLON        );                   /*59,x3b*/ /*';'*/
        keycharHash.put(    (char)0x3c    , KeyEvent.VK_LESS        );                        /*60,x3c*/ /*'<' us 102*/
        keycharHash.put(    (char)0x3d    , KeyEvent.VK_EQUALS        );                      /*61,x3d*/
        keycharHash.put(    (char)0x3e    , KeyEvent.VK_GREATER        );                     /*62,x3e*/ /*'>' ?????? where???*/
            // Javadoc says: "there is no keycode for the question mark because
            // there is no keyboard for which it appears on the primary layer."
            // Well, it's Lithuanian standard.
        //keycharHash.put('?',                                 (char)0x3f        );                                   /*63,x3f*/ /*no VK, cannot test*/
        keycharHash.put(    (char)0x40   , KeyEvent.VK_AT        );                          /*64,x40*/ /*'@' ?????? where???*/
        keycharHash.put(    (char)0x1    , KeyEvent.VK_A        );                             /*65,x41*/
        keycharHash.put(    (char)0x2    , KeyEvent.VK_B        );                            /*66,x42*/
        keycharHash.put(    (char)0x3    , KeyEvent.VK_C        );                            /*67,x43*/
        keycharHash.put(    (char)0x4    , KeyEvent.VK_D        );                            /*68,x44*/
        keycharHash.put(    (char)0x5    , KeyEvent.VK_E        );                            /*69,x45*/
        keycharHash.put(    (char)0x6    , KeyEvent.VK_F        );                            /*70,x46*/
        keycharHash.put(    (char)0x7    , KeyEvent.VK_G        );                            /*71,x47*/
        keycharHash.put(    (char)0x8    , KeyEvent.VK_H        );                            /*72,x48*/
        keycharHash.put(    (char)0x9    , KeyEvent.VK_I        );                            /*73,x49*/
        keycharHash.put(    (char)0xa    , KeyEvent.VK_J        );                            /*74,x4a*/
        keycharHash.put(    (char)0xb    , KeyEvent.VK_K        );                            /*75,x4b*/
        keycharHash.put(    (char)0xc    , KeyEvent.VK_L        );                            /*76,x4c*/
        keycharHash.put(    (char)0xd    , KeyEvent.VK_M        );                            /*77,x4d*/
        keycharHash.put(    (char)0xe    , KeyEvent.VK_N        );                            /*78,x4e*/
        keycharHash.put(    (char)0xf    , KeyEvent.VK_O        );                            /*79,x4f*/
        keycharHash.put(    (char)0x10   , KeyEvent.VK_P        );                           /*80,x50*/
        keycharHash.put(    (char)0x11   , KeyEvent.VK_Q        );                           /*81,x51*/
        keycharHash.put(    (char)0x12   , KeyEvent.VK_R        );                           /*82,x52*/
        keycharHash.put(    (char)0x13   , KeyEvent.VK_S        );                           /*83,x53*/
        keycharHash.put(    (char)0x14   , KeyEvent.VK_T        );                           /*84,x54*/
        keycharHash.put(    (char)0x15   , KeyEvent.VK_U        );                           /*85,x55*/
        keycharHash.put(    (char)0x16   , KeyEvent.VK_V        );                           /*86,x56*/
        keycharHash.put(    (char)0x17   , KeyEvent.VK_W        );                           /*87,x57*/
        keycharHash.put(    (char)0x18   , KeyEvent.VK_X        );                           /*88,x58*/
        keycharHash.put(    (char)0x19   , KeyEvent.VK_Y        );                           /*89,x59*/
        keycharHash.put(    (char)0x1a   , KeyEvent.VK_Z        );                           /*90,x5a*/

        keycharHash.put(    (char)0x1b   , KeyEvent.VK_OPEN_BRACKET        );             /*91,x5b*/ /*'['*/
        keycharHash.put(    (char)0x1c   , KeyEvent.VK_BACK_SLASH        );               /*92,x5c*/ /*'\'*/
        keycharHash.put(    (char)0x1d   , KeyEvent.VK_CLOSE_BRACKET        );            /*93,x5d*/ /*']'*/
        keycharHash.put(    (char)0x5e   , KeyEvent.VK_CIRCUMFLEX        );               /*94,x5e*/  /*'^' ?? nodead fr, de??*/
        keycharHash.put(    (char)0x1f   , KeyEvent.VK_UNDERSCORE        );               /*95,x5f*/  /*'_' fr*/
        keycharHash.put(    (char)0x60   , KeyEvent.VK_BACK_QUOTE        );               /*96,x60*/
        /********* Same as uppercase*/
        //keycharHash.put(  (char)0x1         , KeyEvent.VK_a        );/*97,x61*/
        //keycharHash.put(  (char)0x2         , KeyEvent.VK_b        );/*98,x62*/
        //keycharHash.put(  (char)0x3         , KeyEvent.VK_c        );/*99,x63*/
        //keycharHash.put(  (char)0x4         , KeyEvent.VK_d        );/*100,x64*/
        //keycharHash.put(  (char)0x5         , KeyEvent.VK_e        );/*101,x65*/
        //keycharHash.put(  (char)0x6         , KeyEvent.VK_f        );/*102,x66*/
        //keycharHash.put(  (char)0x7         , KeyEvent.VK_g        );/*103,x67*/
        //keycharHash.put(  (char)0x8         , KeyEvent.VK_h        );/*104,x68*/
        //keycharHash.put(  (char)0x9         , KeyEvent.VK_i        );/*105,x69*/
        //keycharHash.put(  (char)0xa         , KeyEvent.VK_j        );/*106,x6a*/
        //keycharHash.put(  (char)0xb         , KeyEvent.VK_k        );/*107,x6b*/
        //keycharHash.put(  (char)0xc         , KeyEvent.VK_l        );/*108,x6c*/
        //keycharHash.put(  (char)0xd         , KeyEvent.VK_m        );/*109,x6d*/
        //keycharHash.put(  (char)0xe         , KeyEvent.VK_n        );/*110,x6e*/
        //keycharHash.put(  (char)0xf         , KeyEvent.VK_o        );/*111,x6f*/
        //keycharHash.put(  (char)0x10        , KeyEvent.VK_p        );/*112,x70*/
        //keycharHash.put(  (char)0x11        , KeyEvent.VK_q        );/*113,x71*/
        //keycharHash.put(  (char)0x12        , KeyEvent.VK_r        );/*114,x72*/
        //keycharHash.put(  (char)0x13        , KeyEvent.VK_s        );/*115,x73*/
        //keycharHash.put(  (char)0x14        , KeyEvent.VK_t        );/*116,x74*/
        //keycharHash.put(  (char)0x15        , KeyEvent.VK_u        );/*117,x75*/
        //keycharHash.put(  (char)0x16        , KeyEvent.VK_v        );/*118,x76*/
        //keycharHash.put(  (char)0x17        , KeyEvent.VK_w        );/*119,x77*/
        //keycharHash.put(  (char)0x18        , KeyEvent.VK_x        );/*120,x78*/
        //keycharHash.put(  (char)0x19        , KeyEvent.VK_y        );/*121,x79*/
        //keycharHash.put(  (char)0x1a        , KeyEvent.VK_z        );/*122,x7a*/

        keycharHash.put(    (char)0x7b      , KeyEvent.VK_BRACELEFT        );             /*123,x7b*/ /*'{' la (Latin American)*/
        //keycharHash.put(  (char)0x1c        , KeyEvent.VK_|        );                   /*124,x7c*/ /* no VK, cannot test*/
        keycharHash.put(    (char)0x7d      , KeyEvent.VK_BRACERIGHT        );            /*125,x7d*/ /*'}' la */
        //keycharHash.put(  (char)0x1e        , KeyEvent.VK_~        );                   /*126,x7e*/ /* no VK, cannot test*/


    }
    public static void main(String[] args) {
        CtrlASCII test = new CtrlASCII();
        test.init();
        test.start();
    }

    public void init()
    {
        fillHash( false );
        this.setLayout (new BorderLayout ());

    }//End  init()

    public void start ()
    {
        setSize(400,300);
        setLocationRelativeTo(null);
        setVisible(true);

        String original = "0123456789";
        tf = new TextField(original, 20);
        this.add(tf);
        tf.addKeyListener(this);
        validate();

        try {
            robot = new Robot();
            robot.setAutoWaitForIdle(true);
            robot.setAutoDelay(100);

            robot.waitForIdle();

            // wait for focus, etc.  (Hack.)
            robot.delay(2000);
            this.requestFocus();
            tf.requestFocusInWindow();

            Point pt = getLocationOnScreen();
            robot.mouseMove( pt.x+100, pt.y+100 );
            robot.delay(2000);
            robot.mousePress( InputEvent.BUTTON1_MASK );
            robot.mouseRelease( InputEvent.BUTTON1_MASK );
            Enumeration<Integer> enuElem = keycharHash.elements();

            int kc;
            while( enuElem.hasMoreElements()) {
                kc = enuElem.nextElement();
                punchCtrlKey( robot, kc );
            }
            robot.delay(500);
        } catch (Exception e) {
            throw new RuntimeException("The test was not completed.\n\n" + e);
        }
        if( testFailed ) {
            throw new RuntimeException("The test failed.\n\n");
        }
        System.out.println("Success\n");

    }// start()
    public void punchCtrlKey( Robot ro, int keyCode ) {
        ro.keyPress(KeyEvent.VK_CONTROL);
        try {
            ro.keyPress(keyCode);
            ro.keyRelease(keyCode);
        }catch(IllegalArgumentException iae) {
            System.err.println("skip probably invalid keyCode "+keyCode);
        }
        ro.keyRelease(KeyEvent.VK_CONTROL);
        ro.delay(200);
    }
    public void keyPressed(KeyEvent evt)
    {
        //printKey(evt);
    }

    public void keyTyped(KeyEvent evt)
    {
        printKey(evt);
        char keych = evt.getKeyChar();
        if( !keycharHash.containsKey( keych ) ) {
            System.out.println("Unexpected keychar: "+keych);
            System.out.println("Unexpected keychar: "+keych);
            testFailed = true;
        }
    }

    public void keyReleased(KeyEvent evt)
    {
        //printKey(evt);
    }

    protected void printKey(KeyEvent evt)
    {
        switch(evt.getID())
        {
          case KeyEvent.KEY_TYPED:
          case KeyEvent.KEY_PRESSED:
          case KeyEvent.KEY_RELEASED:
            break;
          default:
            System.out.println("Other Event ");
            System.out.println("Other Event ");
            return;
        }
        System.out.print(" 0x"+ Integer.toHexString(evt.getKeyChar()));
        System.out.println    (" 0x"+ Integer.toHexString(evt.getKeyChar()));
    }

}// class CtrlASCII