1 /*
   2  * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25   @test
  26   @key headful
  27   @bug  6497426
  28   @summary ests that pressing of Ctrl+ascii mostly fires KEY_TYPED with a Unicode control symbols
  29   @run main CtrlASCII
  30  */
  31 
  32 import java.awt.*;
  33 import java.awt.event.*;
  34 import java.util.*;
  35 
  36 //
  37 // In this test, a key listener for KEY_TYPED checks if a character typed has
  38 // a correspondent keycode in an initially filled hashtable.
  39 // If it does not, test fails. If character was produced by
  40 // pressing a wrong key still listed in the hashtable, test cannot detect it.
  41 // Under MS Windows, unlike X Window, some Ctrl+Ascii keystrokes don't
  42 // produce a unicode character, so there will be no KEY_TYPED and no problem.
  43 // Test doesn't try to verify Ctrl+deadkey behavior.
  44 //
  45 public class CtrlASCII extends Frame implements KeyListener
  46 {
  47     // Declare things used in the test, like buttons and labels here
  48     static Hashtable<Character, Integer> keycharHash = new Hashtable<Character, Integer>();
  49     static boolean testFailed = false;
  50     //Frame frame;
  51     TextField tf;
  52     Robot robot;
  53 
  54     static void fillHash( boolean isMSWindows ) {
  55         keycharHash.put(    (char)0x20         , KeyEvent.VK_SPACE        );                      /*32,x20*/ /*' ' */
  56         keycharHash.put(    (char)0x21         , KeyEvent.VK_EXCLAMATION_MARK        );           /*33,x21*/ /*'!' fr*/
  57         keycharHash.put(    (char)0x22         , KeyEvent.VK_QUOTEDBL        );                   /*34,x22*/ /*'"' fr*/
  58         keycharHash.put(    (char)0x23         , KeyEvent.VK_NUMBER_SIGN        );                /*35,x23*/ /*'#' de*/
  59         keycharHash.put(    (char)0x24         , KeyEvent.VK_DOLLAR        );                      /*36,x24*/ /*'$', de_CH*/
  60         //keycharHash.put('%',                                  (char)0x25        );                                  /*37,x25*/ /*no VK, cannot test*/
  61         keycharHash.put(    (char)0x26    , KeyEvent.VK_AMPERSAND        );                  /*38,x26*/ /*'&', fr*/
  62         keycharHash.put(    (char)0x27    , KeyEvent.VK_QUOTE        );                      /*39,x27*/ /*''', fr*/
  63         keycharHash.put(    (char)0x28    , KeyEvent.VK_LEFT_PARENTHESIS        );           /*40,x28*/ /*'(', fr*/
  64         keycharHash.put(    (char)0x29    , KeyEvent.VK_RIGHT_PARENTHESIS        );           /*41,x29*/ /*')', fr*/
  65         keycharHash.put(    (char)0x2a    , KeyEvent.VK_ASTERISK        );                    /*42,x2a*/ /*'*', fr*/
  66         keycharHash.put(    (char)0x2b    , KeyEvent.VK_PLUS        );                        /*43,x2b*/ /*'+', de*/
  67         keycharHash.put(    (char)0x2c    , KeyEvent.VK_COMMA        );                       /*44,x2c*/  /*','*/
  68         keycharHash.put(    (char)0x2d    , KeyEvent.VK_MINUS        );                       /*45,x2d*/ /*'-'*/
  69         keycharHash.put(    (char)0x2e    , KeyEvent.VK_PERIOD        );                      /*46,x2e*/ /*'.'*/
  70         keycharHash.put(    (char)0x2f    , KeyEvent.VK_SLASH        );                       /*47,x2f*/ /*'/'*/
  71         keycharHash.put(    (char)0x30    , KeyEvent.VK_0        );                           /*48,x30*/
  72         keycharHash.put(    (char)0x31    , KeyEvent.VK_1        );                           /*49,x31*/
  73         keycharHash.put(    (char)0x32    , KeyEvent.VK_2        );                           /*50,x32*/
  74         keycharHash.put(    (char)0x33    , KeyEvent.VK_3        );                           /*51,x33*/
  75         keycharHash.put(    (char)0x34    , KeyEvent.VK_4        );                           /*52,x34*/
  76         keycharHash.put(    (char)0x35    , KeyEvent.VK_5        );                           /*53,x35*/
  77         keycharHash.put(    (char)0x36    , KeyEvent.VK_6        );                           /*54,x36*/
  78         keycharHash.put(    (char)0x37    , KeyEvent.VK_7        );                           /*55,x37*/
  79         keycharHash.put(    (char)0x38    , KeyEvent.VK_8        );                           /*56,x38*/
  80         keycharHash.put(    (char)0x39    , KeyEvent.VK_9        );                           /*57,x39*/
  81         keycharHash.put(    (char)0x3a    , KeyEvent.VK_COLON        );                       /*58,x3a*/ /*':', fr*/
  82         keycharHash.put(    (char)0x3b    , KeyEvent.VK_SEMICOLON        );                   /*59,x3b*/ /*';'*/
  83         keycharHash.put(    (char)0x3c    , KeyEvent.VK_LESS        );                        /*60,x3c*/ /*'<' us 102*/
  84         keycharHash.put(    (char)0x3d    , KeyEvent.VK_EQUALS        );                      /*61,x3d*/
  85         keycharHash.put(    (char)0x3e    , KeyEvent.VK_GREATER        );                     /*62,x3e*/ /*'>' ?????? where???*/
  86             // Javadoc says: "there is no keycode for the question mark because
  87             // there is no keyboard for which it appears on the primary layer."
  88             // Well, it's Lithuanian standard.
  89         //keycharHash.put('?',                                 (char)0x3f        );                                   /*63,x3f*/ /*no VK, cannot test*/
  90         keycharHash.put(    (char)0x40   , KeyEvent.VK_AT        );                          /*64,x40*/ /*'@' ?????? where???*/
  91         keycharHash.put(    (char)0x1    , KeyEvent.VK_A        );                             /*65,x41*/
  92         keycharHash.put(    (char)0x2    , KeyEvent.VK_B        );                            /*66,x42*/
  93         keycharHash.put(    (char)0x3    , KeyEvent.VK_C        );                            /*67,x43*/
  94         keycharHash.put(    (char)0x4    , KeyEvent.VK_D        );                            /*68,x44*/
  95         keycharHash.put(    (char)0x5    , KeyEvent.VK_E        );                            /*69,x45*/
  96         keycharHash.put(    (char)0x6    , KeyEvent.VK_F        );                            /*70,x46*/
  97         keycharHash.put(    (char)0x7    , KeyEvent.VK_G        );                            /*71,x47*/
  98         keycharHash.put(    (char)0x8    , KeyEvent.VK_H        );                            /*72,x48*/
  99         keycharHash.put(    (char)0x9    , KeyEvent.VK_I        );                            /*73,x49*/
 100         keycharHash.put(    (char)0xa    , KeyEvent.VK_J        );                            /*74,x4a*/
 101         keycharHash.put(    (char)0xb    , KeyEvent.VK_K        );                            /*75,x4b*/
 102         keycharHash.put(    (char)0xc    , KeyEvent.VK_L        );                            /*76,x4c*/
 103         keycharHash.put(    (char)0xd    , KeyEvent.VK_M        );                            /*77,x4d*/
 104         keycharHash.put(    (char)0xe    , KeyEvent.VK_N        );                            /*78,x4e*/
 105         keycharHash.put(    (char)0xf    , KeyEvent.VK_O        );                            /*79,x4f*/
 106         keycharHash.put(    (char)0x10   , KeyEvent.VK_P        );                           /*80,x50*/
 107         keycharHash.put(    (char)0x11   , KeyEvent.VK_Q        );                           /*81,x51*/
 108         keycharHash.put(    (char)0x12   , KeyEvent.VK_R        );                           /*82,x52*/
 109         keycharHash.put(    (char)0x13   , KeyEvent.VK_S        );                           /*83,x53*/
 110         keycharHash.put(    (char)0x14   , KeyEvent.VK_T        );                           /*84,x54*/
 111         keycharHash.put(    (char)0x15   , KeyEvent.VK_U        );                           /*85,x55*/
 112         keycharHash.put(    (char)0x16   , KeyEvent.VK_V        );                           /*86,x56*/
 113         keycharHash.put(    (char)0x17   , KeyEvent.VK_W        );                           /*87,x57*/
 114         keycharHash.put(    (char)0x18   , KeyEvent.VK_X        );                           /*88,x58*/
 115         keycharHash.put(    (char)0x19   , KeyEvent.VK_Y        );                           /*89,x59*/
 116         keycharHash.put(    (char)0x1a   , KeyEvent.VK_Z        );                           /*90,x5a*/
 117 
 118         keycharHash.put(    (char)0x1b   , KeyEvent.VK_OPEN_BRACKET        );             /*91,x5b*/ /*'['*/
 119         keycharHash.put(    (char)0x1c   , KeyEvent.VK_BACK_SLASH        );               /*92,x5c*/ /*'\'*/
 120         keycharHash.put(    (char)0x1d   , KeyEvent.VK_CLOSE_BRACKET        );            /*93,x5d*/ /*']'*/
 121         keycharHash.put(    (char)0x5e   , KeyEvent.VK_CIRCUMFLEX        );               /*94,x5e*/  /*'^' ?? nodead fr, de??*/
 122         keycharHash.put(    (char)0x1f   , KeyEvent.VK_UNDERSCORE        );               /*95,x5f*/  /*'_' fr*/
 123         keycharHash.put(    (char)0x60   , KeyEvent.VK_BACK_QUOTE        );               /*96,x60*/
 124         /********* Same as uppercase*/
 125         //keycharHash.put(  (char)0x1         , KeyEvent.VK_a        );/*97,x61*/
 126         //keycharHash.put(  (char)0x2         , KeyEvent.VK_b        );/*98,x62*/
 127         //keycharHash.put(  (char)0x3         , KeyEvent.VK_c        );/*99,x63*/
 128         //keycharHash.put(  (char)0x4         , KeyEvent.VK_d        );/*100,x64*/
 129         //keycharHash.put(  (char)0x5         , KeyEvent.VK_e        );/*101,x65*/
 130         //keycharHash.put(  (char)0x6         , KeyEvent.VK_f        );/*102,x66*/
 131         //keycharHash.put(  (char)0x7         , KeyEvent.VK_g        );/*103,x67*/
 132         //keycharHash.put(  (char)0x8         , KeyEvent.VK_h        );/*104,x68*/
 133         //keycharHash.put(  (char)0x9         , KeyEvent.VK_i        );/*105,x69*/
 134         //keycharHash.put(  (char)0xa         , KeyEvent.VK_j        );/*106,x6a*/
 135         //keycharHash.put(  (char)0xb         , KeyEvent.VK_k        );/*107,x6b*/
 136         //keycharHash.put(  (char)0xc         , KeyEvent.VK_l        );/*108,x6c*/
 137         //keycharHash.put(  (char)0xd         , KeyEvent.VK_m        );/*109,x6d*/
 138         //keycharHash.put(  (char)0xe         , KeyEvent.VK_n        );/*110,x6e*/
 139         //keycharHash.put(  (char)0xf         , KeyEvent.VK_o        );/*111,x6f*/
 140         //keycharHash.put(  (char)0x10        , KeyEvent.VK_p        );/*112,x70*/
 141         //keycharHash.put(  (char)0x11        , KeyEvent.VK_q        );/*113,x71*/
 142         //keycharHash.put(  (char)0x12        , KeyEvent.VK_r        );/*114,x72*/
 143         //keycharHash.put(  (char)0x13        , KeyEvent.VK_s        );/*115,x73*/
 144         //keycharHash.put(  (char)0x14        , KeyEvent.VK_t        );/*116,x74*/
 145         //keycharHash.put(  (char)0x15        , KeyEvent.VK_u        );/*117,x75*/
 146         //keycharHash.put(  (char)0x16        , KeyEvent.VK_v        );/*118,x76*/
 147         //keycharHash.put(  (char)0x17        , KeyEvent.VK_w        );/*119,x77*/
 148         //keycharHash.put(  (char)0x18        , KeyEvent.VK_x        );/*120,x78*/
 149         //keycharHash.put(  (char)0x19        , KeyEvent.VK_y        );/*121,x79*/
 150         //keycharHash.put(  (char)0x1a        , KeyEvent.VK_z        );/*122,x7a*/
 151 
 152         keycharHash.put(    (char)0x7b      , KeyEvent.VK_BRACELEFT        );             /*123,x7b*/ /*'{' la (Latin American)*/
 153         //keycharHash.put(  (char)0x1c        , KeyEvent.VK_|        );                   /*124,x7c*/ /* no VK, cannot test*/
 154         keycharHash.put(    (char)0x7d      , KeyEvent.VK_BRACERIGHT        );            /*125,x7d*/ /*'}' la */
 155         //keycharHash.put(  (char)0x1e        , KeyEvent.VK_~        );                   /*126,x7e*/ /* no VK, cannot test*/
 156 
 157 
 158     }
 159     public static void main(String[] args) {
 160         CtrlASCII test = new CtrlASCII();
 161         test.init();
 162         test.start();
 163     }
 164 
 165     public void init()
 166     {
 167         fillHash( false );
 168         this.setLayout (new BorderLayout ());
 169 
 170     }//End  init()
 171 
 172     public void start ()
 173     {
 174         setSize(400,300);
 175         setLocationRelativeTo(null);
 176         setVisible(true);
 177 
 178         String original = "0123456789";
 179         tf = new TextField(original, 20);
 180         this.add(tf);
 181         tf.addKeyListener(this);
 182         validate();
 183 
 184         try {
 185             robot = new Robot();
 186             robot.setAutoWaitForIdle(true);
 187             robot.setAutoDelay(100);
 188 
 189             robot.waitForIdle();
 190 
 191             // wait for focus, etc.  (Hack.)
 192             robot.delay(2000);
 193             this.requestFocus();
 194             tf.requestFocusInWindow();
 195 
 196             Point pt = getLocationOnScreen();
 197             robot.mouseMove( pt.x+100, pt.y+100 );
 198             robot.delay(2000);
 199             robot.mousePress( InputEvent.BUTTON1_MASK );
 200             robot.mouseRelease( InputEvent.BUTTON1_MASK );
 201             Enumeration<Integer> enuElem = keycharHash.elements();
 202 
 203             int kc;
 204             while( enuElem.hasMoreElements()) {
 205                 kc = enuElem.nextElement();
 206                 punchCtrlKey( robot, kc );
 207             }
 208             robot.delay(500);
 209         } catch (Exception e) {
 210             throw new RuntimeException("The test was not completed.\n\n" + e);
 211         }
 212         if( testFailed ) {
 213             throw new RuntimeException("The test failed.\n\n");
 214         }
 215         System.out.println("Success\n");
 216 
 217     }// start()
 218     public void punchCtrlKey( Robot ro, int keyCode ) {
 219         ro.keyPress(KeyEvent.VK_CONTROL);
 220         try {
 221             ro.keyPress(keyCode);
 222             ro.keyRelease(keyCode);
 223         }catch(IllegalArgumentException iae) {
 224             System.err.println("skip probably invalid keyCode "+keyCode);
 225         }
 226         ro.keyRelease(KeyEvent.VK_CONTROL);
 227         ro.delay(200);
 228     }
 229     public void keyPressed(KeyEvent evt)
 230     {
 231         //printKey(evt);
 232     }
 233 
 234     public void keyTyped(KeyEvent evt)
 235     {
 236         printKey(evt);
 237         char keych = evt.getKeyChar();
 238         if( !keycharHash.containsKey( keych ) ) {
 239             System.out.println("Unexpected keychar: "+keych);
 240             System.out.println("Unexpected keychar: "+keych);
 241             testFailed = true;
 242         }
 243     }
 244 
 245     public void keyReleased(KeyEvent evt)
 246     {
 247         //printKey(evt);
 248     }
 249 
 250     protected void printKey(KeyEvent evt)
 251     {
 252         switch(evt.getID())
 253         {
 254           case KeyEvent.KEY_TYPED:
 255           case KeyEvent.KEY_PRESSED:
 256           case KeyEvent.KEY_RELEASED:
 257             break;
 258           default:
 259             System.out.println("Other Event ");
 260             System.out.println("Other Event ");
 261             return;
 262         }
 263         System.out.print(" 0x"+ Integer.toHexString(evt.getKeyChar()));
 264         System.out.println    (" 0x"+ Integer.toHexString(evt.getKeyChar()));
 265     }
 266 
 267 }// class CtrlASCII