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 }