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  * @bug 6497426
  27  * @summary Tests that pressing of Ctrl+ascii mostly fires KEY_TYPED with a Unicode control symbols
  28  * @author Yuri.Nesterenko@... area=awt.keyboard
  29  * @run applet CtrlASCII.html
  30  */
  31 
  32 // Note there is no @ in front of test above.  This is so that the
  33 //  harness will not mistake this file as a test file.  It should
  34 //  only see the html file as a test file. (the harness runs all
  35 //  valid test files, so it would run this test twice if this file
  36 //  were valid as well as the html file.)
  37 // Also, note the area= after Your Name in the author tag.  Here, you
  38 //  should put which functional area the test falls in.  See the
  39 //  AWT-core home page -> test areas and/or -> AWT team  for a list of
  40 //  areas.
  41 // Note also the 'RobotLWTest.html' in the run tag.  This should
  42 //  be changed to the name of the test.
  43 
  44 
  45 /**
  46  * CtrlASCII.java
  47  *
  48  * @summary Tests that pressing of Ctrl+ascii mostly fires KEY_TYPED with a Unicode control symbols
  49  */
  50 
  51 import java.applet.Applet;
  52 import java.awt.*;
  53 import java.awt.event.*;
  54 import java.util.*;
  55 
  56 
  57 //
  58 // In this test, a key listener for KEY_TYPED checks if a character typed has
  59 // a correspondent keycode in an initially filled hashtable.
  60 // If it does not, test fails. If character was produced by
  61 // pressing a wrong key still listed in the hashtable, test cannot detect it.
  62 // Under MS Windows, unlike X Window, some Ctrl+Ascii keystrokes don't
  63 // produce a unicode character, so there will be no KEY_TYPED and no problem.
  64 // Test doesn't try to verify Ctrl+deadkey behavior.
  65 //
  66 
  67 public class CtrlASCII extends Applet implements KeyListener
  68 {
  69     // Declare things used in the test, like buttons and labels here
  70     static Hashtable<Character, Integer> keycharHash = new Hashtable<Character, Integer>();
  71     static boolean testFailed = false;
  72     //Frame frame;
  73     TextField tf;
  74     Robot robot;
  75 
  76     static void fillHash( boolean isMSWindows ) {
  77         keycharHash.put(    (char)0x20         , KeyEvent.VK_SPACE        );                      /*32,x20*/ /*' ' */
  78         keycharHash.put(    (char)0x21         , KeyEvent.VK_EXCLAMATION_MARK        );           /*33,x21*/ /*'!' fr*/
  79         keycharHash.put(    (char)0x22         , KeyEvent.VK_QUOTEDBL        );                   /*34,x22*/ /*'"' fr*/
  80         keycharHash.put(    (char)0x23         , KeyEvent.VK_NUMBER_SIGN        );                /*35,x23*/ /*'#' de*/
  81         keycharHash.put(    (char)0x24         , KeyEvent.VK_DOLLAR        );                      /*36,x24*/ /*'$', de_CH*/
  82         //keycharHash.put('%',                                  (char)0x25        );                                  /*37,x25*/ /*no VK, cannot test*/
  83         keycharHash.put(    (char)0x26    , KeyEvent.VK_AMPERSAND        );                  /*38,x26*/ /*'&', fr*/
  84         keycharHash.put(    (char)0x27    , KeyEvent.VK_QUOTE        );                      /*39,x27*/ /*''', fr*/
  85         keycharHash.put(    (char)0x28    , KeyEvent.VK_LEFT_PARENTHESIS        );           /*40,x28*/ /*'(', fr*/
  86         keycharHash.put(    (char)0x29    , KeyEvent.VK_RIGHT_PARENTHESIS        );           /*41,x29*/ /*')', fr*/
  87         keycharHash.put(    (char)0x2a    , KeyEvent.VK_ASTERISK        );                    /*42,x2a*/ /*'*', fr*/
  88         keycharHash.put(    (char)0x2b    , KeyEvent.VK_PLUS        );                        /*43,x2b*/ /*'+', de*/
  89         keycharHash.put(    (char)0x2c    , KeyEvent.VK_COMMA        );                       /*44,x2c*/  /*','*/
  90         keycharHash.put(    (char)0x2d    , KeyEvent.VK_MINUS        );                       /*45,x2d*/ /*'-'*/
  91         keycharHash.put(    (char)0x2e    , KeyEvent.VK_PERIOD        );                      /*46,x2e*/ /*'.'*/
  92         keycharHash.put(    (char)0x2f    , KeyEvent.VK_SLASH        );                       /*47,x2f*/ /*'/'*/
  93         keycharHash.put(    (char)0x30    , KeyEvent.VK_0        );                           /*48,x30*/
  94         keycharHash.put(    (char)0x31    , KeyEvent.VK_1        );                           /*49,x31*/
  95         keycharHash.put(    (char)0x32    , KeyEvent.VK_2        );                           /*50,x32*/
  96         keycharHash.put(    (char)0x33    , KeyEvent.VK_3        );                           /*51,x33*/
  97         keycharHash.put(    (char)0x34    , KeyEvent.VK_4        );                           /*52,x34*/
  98         keycharHash.put(    (char)0x35    , KeyEvent.VK_5        );                           /*53,x35*/
  99         keycharHash.put(    (char)0x36    , KeyEvent.VK_6        );                           /*54,x36*/
 100         keycharHash.put(    (char)0x37    , KeyEvent.VK_7        );                           /*55,x37*/
 101         keycharHash.put(    (char)0x38    , KeyEvent.VK_8        );                           /*56,x38*/
 102         keycharHash.put(    (char)0x39    , KeyEvent.VK_9        );                           /*57,x39*/
 103         keycharHash.put(    (char)0x3a    , KeyEvent.VK_COLON        );                       /*58,x3a*/ /*':', fr*/
 104         keycharHash.put(    (char)0x3b    , KeyEvent.VK_SEMICOLON        );                   /*59,x3b*/ /*';'*/
 105         keycharHash.put(    (char)0x3c    , KeyEvent.VK_LESS        );                        /*60,x3c*/ /*'<' us 102*/
 106         keycharHash.put(    (char)0x3d    , KeyEvent.VK_EQUALS        );                      /*61,x3d*/
 107         keycharHash.put(    (char)0x3e    , KeyEvent.VK_GREATER        );                     /*62,x3e*/ /*'>' ?????? where???*/
 108             // Javadoc says: "there is no keycode for the question mark because
 109             // there is no keyboard for which it appears on the primary layer."
 110             // Well, it's Lithuanian standard.
 111         //keycharHash.put('?',                                 (char)0x3f        );                                   /*63,x3f*/ /*no VK, cannot test*/
 112         keycharHash.put(    (char)0x40   , KeyEvent.VK_AT        );                          /*64,x40*/ /*'@' ?????? where???*/
 113         keycharHash.put(    (char)0x1    , KeyEvent.VK_A        );                             /*65,x41*/
 114         keycharHash.put(    (char)0x2    , KeyEvent.VK_B        );                            /*66,x42*/
 115         keycharHash.put(    (char)0x3    , KeyEvent.VK_C        );                            /*67,x43*/
 116         keycharHash.put(    (char)0x4    , KeyEvent.VK_D        );                            /*68,x44*/
 117         keycharHash.put(    (char)0x5    , KeyEvent.VK_E        );                            /*69,x45*/
 118         keycharHash.put(    (char)0x6    , KeyEvent.VK_F        );                            /*70,x46*/
 119         keycharHash.put(    (char)0x7    , KeyEvent.VK_G        );                            /*71,x47*/
 120         keycharHash.put(    (char)0x8    , KeyEvent.VK_H        );                            /*72,x48*/
 121         keycharHash.put(    (char)0x9    , KeyEvent.VK_I        );                            /*73,x49*/
 122         keycharHash.put(    (char)0xa    , KeyEvent.VK_J        );                            /*74,x4a*/
 123         keycharHash.put(    (char)0xb    , KeyEvent.VK_K        );                            /*75,x4b*/
 124         keycharHash.put(    (char)0xc    , KeyEvent.VK_L        );                            /*76,x4c*/
 125         keycharHash.put(    (char)0xd    , KeyEvent.VK_M        );                            /*77,x4d*/
 126         keycharHash.put(    (char)0xe    , KeyEvent.VK_N        );                            /*78,x4e*/
 127         keycharHash.put(    (char)0xf    , KeyEvent.VK_O        );                            /*79,x4f*/
 128         keycharHash.put(    (char)0x10   , KeyEvent.VK_P        );                           /*80,x50*/
 129         keycharHash.put(    (char)0x11   , KeyEvent.VK_Q        );                           /*81,x51*/
 130         keycharHash.put(    (char)0x12   , KeyEvent.VK_R        );                           /*82,x52*/
 131         keycharHash.put(    (char)0x13   , KeyEvent.VK_S        );                           /*83,x53*/
 132         keycharHash.put(    (char)0x14   , KeyEvent.VK_T        );                           /*84,x54*/
 133         keycharHash.put(    (char)0x15   , KeyEvent.VK_U        );                           /*85,x55*/
 134         keycharHash.put(    (char)0x16   , KeyEvent.VK_V        );                           /*86,x56*/
 135         keycharHash.put(    (char)0x17   , KeyEvent.VK_W        );                           /*87,x57*/
 136         keycharHash.put(    (char)0x18   , KeyEvent.VK_X        );                           /*88,x58*/
 137         keycharHash.put(    (char)0x19   , KeyEvent.VK_Y        );                           /*89,x59*/
 138         keycharHash.put(    (char)0x1a   , KeyEvent.VK_Z        );                           /*90,x5a*/
 139 
 140         keycharHash.put(    (char)0x1b   , KeyEvent.VK_OPEN_BRACKET        );             /*91,x5b*/ /*'['*/
 141         keycharHash.put(    (char)0x1c   , KeyEvent.VK_BACK_SLASH        );               /*92,x5c*/ /*'\'*/
 142         keycharHash.put(    (char)0x1d   , KeyEvent.VK_CLOSE_BRACKET        );            /*93,x5d*/ /*']'*/
 143         keycharHash.put(    (char)0x5e   , KeyEvent.VK_CIRCUMFLEX        );               /*94,x5e*/  /*'^' ?? nodead fr, de??*/
 144         keycharHash.put(    (char)0x1f   , KeyEvent.VK_UNDERSCORE        );               /*95,x5f*/  /*'_' fr*/
 145         keycharHash.put(    (char)0x60   , KeyEvent.VK_BACK_QUOTE        );               /*96,x60*/
 146         /********* Same as uppercase*/
 147         //keycharHash.put(  (char)0x1         , KeyEvent.VK_a        );/*97,x61*/
 148         //keycharHash.put(  (char)0x2         , KeyEvent.VK_b        );/*98,x62*/
 149         //keycharHash.put(  (char)0x3         , KeyEvent.VK_c        );/*99,x63*/
 150         //keycharHash.put(  (char)0x4         , KeyEvent.VK_d        );/*100,x64*/
 151         //keycharHash.put(  (char)0x5         , KeyEvent.VK_e        );/*101,x65*/
 152         //keycharHash.put(  (char)0x6         , KeyEvent.VK_f        );/*102,x66*/
 153         //keycharHash.put(  (char)0x7         , KeyEvent.VK_g        );/*103,x67*/
 154         //keycharHash.put(  (char)0x8         , KeyEvent.VK_h        );/*104,x68*/
 155         //keycharHash.put(  (char)0x9         , KeyEvent.VK_i        );/*105,x69*/
 156         //keycharHash.put(  (char)0xa         , KeyEvent.VK_j        );/*106,x6a*/
 157         //keycharHash.put(  (char)0xb         , KeyEvent.VK_k        );/*107,x6b*/
 158         //keycharHash.put(  (char)0xc         , KeyEvent.VK_l        );/*108,x6c*/
 159         //keycharHash.put(  (char)0xd         , KeyEvent.VK_m        );/*109,x6d*/
 160         //keycharHash.put(  (char)0xe         , KeyEvent.VK_n        );/*110,x6e*/
 161         //keycharHash.put(  (char)0xf         , KeyEvent.VK_o        );/*111,x6f*/
 162         //keycharHash.put(  (char)0x10        , KeyEvent.VK_p        );/*112,x70*/
 163         //keycharHash.put(  (char)0x11        , KeyEvent.VK_q        );/*113,x71*/
 164         //keycharHash.put(  (char)0x12        , KeyEvent.VK_r        );/*114,x72*/
 165         //keycharHash.put(  (char)0x13        , KeyEvent.VK_s        );/*115,x73*/
 166         //keycharHash.put(  (char)0x14        , KeyEvent.VK_t        );/*116,x74*/
 167         //keycharHash.put(  (char)0x15        , KeyEvent.VK_u        );/*117,x75*/
 168         //keycharHash.put(  (char)0x16        , KeyEvent.VK_v        );/*118,x76*/
 169         //keycharHash.put(  (char)0x17        , KeyEvent.VK_w        );/*119,x77*/
 170         //keycharHash.put(  (char)0x18        , KeyEvent.VK_x        );/*120,x78*/
 171         //keycharHash.put(  (char)0x19        , KeyEvent.VK_y        );/*121,x79*/
 172         //keycharHash.put(  (char)0x1a        , KeyEvent.VK_z        );/*122,x7a*/
 173 
 174         keycharHash.put(    (char)0x7b      , KeyEvent.VK_BRACELEFT        );             /*123,x7b*/ /*'{' la (Latin American)*/
 175         //keycharHash.put(  (char)0x1c        , KeyEvent.VK_|        );                   /*124,x7c*/ /* no VK, cannot test*/
 176         keycharHash.put(    (char)0x7d      , KeyEvent.VK_BRACERIGHT        );            /*125,x7d*/ /*'}' la */
 177         //keycharHash.put(  (char)0x1e        , KeyEvent.VK_~        );                   /*126,x7e*/ /* no VK, cannot test*/
 178 
 179 
 180     }
 181     public static void main(String[] args) {
 182         CtrlASCII test = new CtrlASCII();
 183         test.init();
 184         test.start();
 185     }
 186 
 187     public void init()
 188     {
 189         fillHash( false );
 190         this.setLayout (new BorderLayout ());
 191 
 192     }//End  init()
 193 
 194     public void start ()
 195     {
 196         setSize(400,300);
 197         setVisible(true);
 198 
 199         String original = "0123456789";
 200         tf = new TextField(original, 20);
 201         this.add(tf);
 202         tf.addKeyListener(this);
 203         validate();
 204 
 205         try {
 206             robot = new Robot();
 207             robot.setAutoWaitForIdle(true);
 208             robot.setAutoDelay(100);
 209 
 210             robot.waitForIdle();
 211 
 212             // wait for focus, etc.  (Hack.)
 213             robot.delay(2000);
 214             this.requestFocus();
 215             tf.requestFocusInWindow();
 216 
 217             Point pt = getLocationOnScreen();
 218             robot.mouseMove( pt.x+100, pt.y+100 );
 219             robot.delay(2000);
 220             robot.mousePress( InputEvent.BUTTON1_MASK );
 221             robot.mouseRelease( InputEvent.BUTTON1_MASK );
 222             Enumeration<Integer> enuElem = keycharHash.elements();
 223 
 224             int kc;
 225             while( enuElem.hasMoreElements()) {
 226                 kc = enuElem.nextElement();
 227                 punchCtrlKey( robot, kc );
 228             }
 229             robot.delay(500);
 230         } catch (Exception e) {
 231             throw new RuntimeException("The test was not completed.\n\n" + e);
 232         }
 233         if( testFailed ) {
 234             throw new RuntimeException("The test failed.\n\n");
 235         }
 236         System.out.println("Success\n");
 237 
 238     }// start()
 239     public void punchCtrlKey( Robot ro, int keyCode ) {
 240         ro.keyPress(KeyEvent.VK_CONTROL);
 241         try {
 242             ro.keyPress(keyCode);
 243             ro.keyRelease(keyCode);
 244         }catch(IllegalArgumentException iae) {
 245             System.err.println("skip probably invalid keyCode "+keyCode);
 246         }
 247         ro.keyRelease(KeyEvent.VK_CONTROL);
 248         ro.delay(200);
 249     }
 250     public void keyPressed(KeyEvent evt)
 251     {
 252         //printKey(evt);
 253     }
 254 
 255     public void keyTyped(KeyEvent evt)
 256     {
 257         printKey(evt);
 258         char keych = evt.getKeyChar();
 259         if( !keycharHash.containsKey( keych ) ) {
 260             System.out.println("Unexpected keychar: "+keych);
 261             System.out.println("Unexpected keychar: "+keych);
 262             testFailed = true;
 263         }
 264     }
 265 
 266     public void keyReleased(KeyEvent evt)
 267     {
 268         //printKey(evt);
 269     }
 270 
 271     protected void printKey(KeyEvent evt)
 272     {
 273         switch(evt.getID())
 274         {
 275           case KeyEvent.KEY_TYPED:
 276           case KeyEvent.KEY_PRESSED:
 277           case KeyEvent.KEY_RELEASED:
 278             break;
 279           default:
 280             System.out.println("Other Event ");
 281             System.out.println("Other Event ");
 282             return;
 283         }
 284         System.out.print(" 0x"+ Integer.toHexString(evt.getKeyChar()));
 285         System.out.println    (" 0x"+ Integer.toHexString(evt.getKeyChar()));
 286     }
 287 
 288 }// class CtrlASCII