1 /*
   2  * Copyright (c) 2014, 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.glass.ui.monocle.input;
  27 
  28 import org.junit.After;
  29 import org.junit.Assert;
  30 import org.junit.Before;
  31 import org.junit.Test;
  32 
  33 public class USKeyboardTest {
  34 
  35     private UInput ui;
  36 
  37     @Before
  38     public void initDevice() {
  39         TestLog.reset();
  40         ui = new UInput();
  41     }
  42 
  43     @After
  44     public void destroyDevice() throws InterruptedException {
  45         ui.waitForQuiet();
  46         try {
  47             ui.processLine("DESTROY");
  48         } catch (RuntimeException e) { }
  49         ui.processLine("CLOSE");
  50         ui.dispose();
  51     }
  52 
  53     private void checkShift(String key, char unShifted, char shifted) throws Exception {
  54         checkKey(key, unShifted, false);
  55         checkKey(key, shifted, true);
  56     }
  57 
  58     private void checkKey(String key, char c, boolean shiftPressed) throws Exception {
  59         if (shiftPressed) {
  60             ui.processLine("EV_KEY KEY_LEFTSHIFT 1");
  61             ui.processLine("EV_SYN");
  62         }
  63         ui.processLine("EV_KEY " + key + " 1");
  64         ui.processLine("EV_SYN");
  65         ui.processLine("EV_KEY " + key + " 0");
  66         ui.processLine("EV_SYN");
  67         if (shiftPressed) {
  68             ui.processLine("EV_KEY KEY_LEFTSHIFT 0");
  69             ui.processLine("EV_SYN");
  70             TestLog.waitForLog("Key released: SHIFT");
  71         }
  72         TestLog.waitForLog("Key typed: %0$c", new Object[] { c });
  73     }
  74 
  75     @Test
  76     public void testShift() throws Exception {
  77         TestApplication.showFullScreenScene();
  78         TestApplication.addKeyListeners();
  79         ui.processLine("OPEN");
  80         ui.processLine("EVBIT EV_KEY");
  81         ui.processLine("EVBIT EV_SYN");
  82         ui.processLine("KEYBIT KEY_A");
  83         ui.processLine("KEYBIT KEY_1");
  84         ui.processLine("KEYBIT KEY_2");
  85         ui.processLine("KEYBIT KEY_3");
  86         ui.processLine("KEYBIT KEY_4");
  87         ui.processLine("KEYBIT KEY_5");
  88         ui.processLine("KEYBIT KEY_6");
  89         ui.processLine("KEYBIT KEY_7");
  90         ui.processLine("KEYBIT KEY_8");
  91         ui.processLine("KEYBIT KEY_9");
  92         ui.processLine("KEYBIT KEY_0");
  93         ui.processLine("KEYBIT KEY_LEFTSHIFT");
  94         ui.processLine("PROPERTY ID_INPUT_KEYBOARD 1");
  95         ui.processLine("CREATE");
  96 
  97         checkShift("KEY_A", 'a', 'A');
  98         checkShift("KEY_1", '1', '!');
  99         checkShift("KEY_2", '2', '@');
 100         checkShift("KEY_3", '3', '#');
 101         checkShift("KEY_4", '4', '$');
 102         checkShift("KEY_5", '5', '%');
 103         checkShift("KEY_6", '6', '^');
 104         checkShift("KEY_7", '7', '&');
 105         checkShift("KEY_8", '8', '*');
 106         checkShift("KEY_9", '9', '(');
 107         checkShift("KEY_0", '0', ')');
 108     }
 109 
 110     @Test
 111     public void testCapsLock() throws Exception {
 112         TestApplication.showFullScreenScene();
 113         TestApplication.addKeyListeners();
 114         ui.processLine("OPEN");
 115         ui.processLine("EVBIT EV_KEY");
 116         ui.processLine("EVBIT EV_SYN");
 117         ui.processLine("KEYBIT KEY_A");
 118         ui.processLine("KEYBIT KEY_1");
 119         ui.processLine("KEYBIT KEY_2");
 120         ui.processLine("KEYBIT KEY_3");
 121         ui.processLine("KEYBIT KEY_4");
 122         ui.processLine("KEYBIT KEY_5");
 123         ui.processLine("KEYBIT KEY_6");
 124         ui.processLine("KEYBIT KEY_7");
 125         ui.processLine("KEYBIT KEY_8");
 126         ui.processLine("KEYBIT KEY_9");
 127         ui.processLine("KEYBIT KEY_0");
 128         ui.processLine("KEYBIT KEY_LEFTSHIFT");
 129         ui.processLine("KEYBIT KEY_CAPSLOCK");
 130         ui.processLine("PROPERTY ID_INPUT_KEYBOARD 1");
 131         ui.processLine("CREATE");
 132 
 133         ui.processLine("EV_KEY KEY_CAPSLOCK 1");
 134         ui.processLine("EV_SYN");
 135         ui.processLine("EV_KEY KEY_CAPSLOCK 0");
 136         ui.processLine("EV_SYN");
 137 
 138         checkShift("KEY_A", 'A', 'a');
 139         checkShift("KEY_1", '1', '!');
 140         checkShift("KEY_2", '2', '@');
 141         checkShift("KEY_3", '3', '#');
 142         checkShift("KEY_4", '4', '$');
 143         checkShift("KEY_5", '5', '%');
 144         checkShift("KEY_6", '6', '^');
 145         checkShift("KEY_7", '7', '&');
 146         checkShift("KEY_8", '8', '*');
 147         checkShift("KEY_9", '9', '(');
 148         checkShift("KEY_0", '0', ')');
 149 
 150         ui.processLine("EV_KEY KEY_CAPSLOCK 1");
 151         ui.processLine("EV_SYN");
 152         ui.processLine("EV_KEY KEY_CAPSLOCK 0");
 153         ui.processLine("EV_SYN");
 154         TestLog.waitForLog("Key released: CAPS");
 155     }
 156 
 157     /** Key presses and releases are allowed to overlap. RT-37425. */
 158     @Test
 159     public void testPressReleaseOrder() throws Exception {
 160         TestApplication.showFullScreenScene();
 161         TestApplication.addKeyListeners();
 162         ui.processLine("OPEN");
 163         ui.processLine("EVBIT EV_KEY");
 164         ui.processLine("EVBIT EV_SYN");
 165         ui.processLine("KEYBIT KEY_1");
 166         ui.processLine("KEYBIT KEY_2");
 167         ui.processLine("KEYBIT KEY_3");
 168         ui.processLine("KEYBIT KEY_4");
 169         ui.processLine("KEYBIT KEY_CAPSLOCK");
 170         ui.processLine("PROPERTY ID_INPUT_KEYBOARD 1");
 171         ui.processLine("CREATE");
 172 
 173         ui.processLine("EV_KEY KEY_1 1");
 174         ui.processLine("EV_SYN");
 175         TestLog.waitForLog("Key pressed: DIGIT1");
 176         TestLog.waitForLog("Key typed: 1");
 177         ui.processLine("EV_KEY KEY_2 1");
 178         ui.processLine("EV_SYN");
 179         TestLog.waitForLog("Key pressed: DIGIT2");
 180         TestLog.waitForLog("Key typed: 2");
 181         ui.processLine("EV_KEY KEY_1 0");
 182         ui.processLine("EV_SYN");
 183         TestLog.waitForLog("Key released: DIGIT1");
 184         ui.processLine("EV_KEY KEY_3 1");
 185         ui.processLine("EV_SYN");
 186         TestLog.waitForLog("Key pressed: DIGIT3");
 187         TestLog.waitForLog("Key typed: 3");
 188         ui.processLine("EV_KEY KEY_2 0");
 189         ui.processLine("EV_SYN");
 190         TestLog.waitForLog("Key released: DIGIT2");
 191         ui.processLine("EV_KEY KEY_4 1");
 192         ui.processLine("EV_SYN");
 193         TestLog.waitForLog("Key pressed: DIGIT4");
 194         TestLog.waitForLog("Key typed: 4");
 195         ui.processLine("EV_KEY KEY_3 0");
 196         ui.processLine("EV_SYN");
 197         TestLog.waitForLog("Key released: DIGIT3");
 198         ui.processLine("EV_KEY KEY_4 0");
 199         ui.processLine("EV_SYN");
 200         TestLog.waitForLog("Key released: DIGIT3");
 201     }
 202 
 203     @Test
 204     public void testBackspace() throws Exception {
 205         TestApplication.showFullScreenScene();
 206         TestApplication.addKeyListeners();
 207         ui.processLine("OPEN");
 208         ui.processLine("EVBIT EV_KEY");
 209         ui.processLine("EVBIT EV_SYN");
 210         ui.processLine("KEYBIT KEY_BACKSPACE");
 211         ui.processLine("KEYBIT KEY_LEFTSHIFT");
 212         ui.processLine("KEYBIT KEY_CAPSLOCK");
 213         ui.processLine("PROPERTY ID_INPUT_KEYBOARD 1");
 214         ui.processLine("CREATE");
 215 
 216         ui.processLine("EV_KEY KEY_BACKSPACE 1");
 217         ui.processLine("EV_SYN");
 218         TestLog.waitForLog("Key pressed: BACK_SPACE");
 219         ui.processLine("EV_KEY KEY_BACKSPACE 0");
 220         ui.processLine("EV_SYN");
 221         TestLog.waitForLog("Key released: BACK_SPACE");
 222         Assert.assertEquals(0l, TestLog.countLogContaining("Key typed"));
 223 
 224         TestLog.reset();
 225         ui.processLine("EV_KEY KEY_LEFTSHIFT 1");
 226         ui.processLine("EV_SYN");
 227         ui.processLine("EV_KEY KEY_BACKSPACE 1");
 228         ui.processLine("EV_SYN");
 229         TestLog.waitForLog("Key pressed: BACK_SPACE");
 230         ui.processLine("EV_KEY KEY_BACKSPACE 0");
 231         ui.processLine("EV_SYN");
 232         ui.processLine("EV_KEY KEY_LEFTSHIFT 0");
 233         ui.processLine("EV_SYN");
 234         TestLog.waitForLog("Key released: BACK_SPACE");
 235         Assert.assertEquals(0l, TestLog.countLogContaining("Key typed"));
 236 
 237         TestLog.reset();
 238         ui.processLine("EV_KEY KEY_CAPSLOCK 1");
 239         ui.processLine("EV_SYN");
 240         ui.processLine("EV_KEY KEY_CAPSLOCK 0");
 241         ui.processLine("EV_SYN");
 242         ui.processLine("EV_KEY KEY_BACKSPACE 1");
 243         ui.processLine("EV_SYN");
 244         TestLog.waitForLog("Key pressed: BACK_SPACE");
 245         ui.processLine("EV_KEY KEY_BACKSPACE 0");
 246         ui.processLine("EV_SYN");
 247         ui.processLine("EV_KEY KEY_CAPSLOCK 1");
 248         ui.processLine("EV_SYN");
 249         ui.processLine("EV_KEY KEY_CAPSLOCK 0");
 250         ui.processLine("EV_SYN");
 251         TestLog.waitForLog("Key released: BACK_SPACE");
 252         Assert.assertEquals(0l, TestLog.countLogContaining("Key typed"));
 253 
 254         TestLog.reset();
 255         ui.processLine("EV_KEY KEY_CAPSLOCK 1");
 256         ui.processLine("EV_SYN");
 257         ui.processLine("EV_KEY KEY_CAPSLOCK 0");
 258         ui.processLine("EV_SYN");
 259         ui.processLine("EV_KEY KEY_LEFTSHIFT 1");
 260         ui.processLine("EV_SYN");
 261         ui.processLine("EV_KEY KEY_BACKSPACE 1");
 262         ui.processLine("EV_SYN");
 263         TestLog.waitForLog("Key pressed: BACK_SPACE");
 264         ui.processLine("EV_KEY KEY_BACKSPACE 0");
 265         ui.processLine("EV_SYN");
 266         ui.processLine("EV_KEY KEY_LEFTSHIFT 0");
 267         ui.processLine("EV_SYN");
 268         ui.processLine("EV_KEY KEY_CAPSLOCK 1");
 269         ui.processLine("EV_SYN");
 270         ui.processLine("EV_KEY KEY_CAPSLOCK 0");
 271         ui.processLine("EV_SYN");
 272         TestLog.waitForLog("Key released: BACK_SPACE");
 273         Assert.assertEquals(0l, TestLog.countLogContaining("Key typed"));
 274     }
 275 
 276 }