/******************************************************************************* * Copyright (c) 2009 Ketan Padegaonkar and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ketan Padegaonkar - initial API and implementation *******************************************************************************/ package org.eclipse.swtbot.swt.finder.keyboard; import static org.eclipse.swtbot.swt.finder.utils.SWTUtils.isMac; import org.eclipse.swt.SWT; import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest; import org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText; import org.eclipse.swtbot.swt.finder.widgets.SWTBotText; import org.junit.Before; import org.junit.Test; /** * @author Ketan Padegaonkar <KetanPadegaonkar [at] gmail [dot] com> * @version $Id$ */ public abstract class AbstractKeyboardTest extends AbstractCustomControlExampleTest { private SWTBotStyledText styledText; private SWTBotText listeners; private Keyboard keyboard; @Test public void canTypeSingleQuote() throws Exception { styledText.setFocus(); styledText.typeText("'"); assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=2009363 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text='}"); assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=2009363 data=null}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1951427 data=null character=''' keyCode=" + toKeyCode(39, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1951515 data=null character=''' keyCode=" + toKeyCode(39, styledText.widget) + " stateMask=0 doit=true}"); } @Test public void canTypeAltUpKey() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.MOD3, Keystrokes.UP); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=-2118818527 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=-2118818111 data=null character='\\0' keyCode=" + toKeyCode(16777217, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=-2118818055 data=null character='\\0' keyCode=" + toKeyCode(16777217, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=-2118817351 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canTypeBackquoteKey() throws Exception { styledText.setFocus(); styledText.typeText("`"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=332938450 data=null character='`' keyCode=" + toKeyCode(96, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=332938540 data=null character='`' keyCode=" + toKeyCode(96, styledText.widget) + " stateMask=0 doit=true}"); } @Test public void canTypeShiftKey() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.SHIFT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=332938450 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=332938540 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canTypeEndKey() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.END); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1686687 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1686718 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=0 doit=true}"); } @Test public void canTypeCTRLKey() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.CTRL); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334095974 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334096084 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canTypeAltKey() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.ALT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337927063 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337927163 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canType_CTRL_SHIFT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.SHIFT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334163451 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334163611 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334163782 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334163832 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canType_SHIFT_CTRL_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.CTRL); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334173686 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334173996 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334174277 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334174347 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canType_CTRL_ALT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.ALT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334364901 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334365191 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334365331 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=327680 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334365492 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canType_ALT_CTRL_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.ALT, Keystrokes.CTRL); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334374164 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334374324 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334374475 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=327680 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334374495 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canType_SHIFT_ALT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.ALT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334403126 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334403236 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334403366 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334403426 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canType_ALT_SHIFT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.ALT, Keystrokes.SHIFT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334417126 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=334417456 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334417526 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=334417577 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canType_SHIFT_CTRL_ALT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.CTRL, Keystrokes.ALT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998217 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998548 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=336998858 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=336998938 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=458752 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337000000 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337000330 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canType_SHIFT_ALT_CTRL_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.ALT, Keystrokes.CTRL); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337024085 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337024595 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337025316 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337026738 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=458752 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337027700 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337028090 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canType_CTRL_SHIFT_ALT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.SHIFT, Keystrokes.ALT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337073666 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337074086 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337074527 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337074928 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=458752 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337075999 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337076370 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canType_CTRL_ALT_SHIFT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.ALT, Keystrokes.SHIFT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337084111 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337084592 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337085162 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=327680 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337085753 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=458752 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337086184 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=327680 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337086584 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canType_ALT_CTRL_SHIFT_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.ALT, Keystrokes.CTRL, Keystrokes.SHIFT); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337516292 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337516753 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337517113 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=327680 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337517985 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=458752 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337518335 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=327680 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337518686 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canType_ALT_SHIFT_CTRL_Keys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.ALT, Keystrokes.SHIFT, Keystrokes.CTRL); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337527028 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337527649 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=337528209 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337531534 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=458752 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337532275 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=337532666 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canTypeCTRL_SHIFT_T() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.toKeys(SWT.CTRL | SWT.SHIFT, 't')); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356391804 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356392194 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=356393156 data=null character='' keyCode=" + toKeyCode(116, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356392495 data=null character='' keyCode=" + toKeyCode(116, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356393987 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=393216 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=356394307 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canTypeSmallCharacters() throws Exception { styledText.setFocus(); keyboard.typeText("ab"); assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=358259489 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text=a}"); assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=358259489 data=null}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=358259489 data=null character='a' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=358259560 data=null character='a' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=358264617 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=1 end=1 text=b}"); assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=358264617 data=null}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=358264617 data=null character='b' keyCode=" + toKeyCode(98, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=358259810 data=null character='b' keyCode=" + toKeyCode(98, styledText.widget) + " stateMask=0 doit=true}"); } @Test public void canTypeCapitalCharacters() throws Exception { styledText.setFocus(); keyboard.typeText("A"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=359800165 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=359800285 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text=A}"); assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=359800285 data=null}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=359800285 data=null character='A' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=359800405 data=null character='A' keyCode=" + toKeyCode(97, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=359800485 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canTypeCTRL_SPACE() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.CTRL, Keystrokes.create(' ')[0]); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=41517702 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=0 doit=true}"); if (!isWin32() && !isGtk()) // FIXME: bug 278162: Sending CTRL+SPACE does not work consistently across platforms assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=41517983 data=null}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=41517983 data=null character=' ' keyCode=" + toKeyCode(32, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=41518070 data=null character=' ' keyCode=" + toKeyCode(32, styledText.widget) + " stateMask=262144 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=41518278 data=null character='\\0' keyCode=" + toKeyCode(262144, styledText.widget) + " stateMask=262144 doit=true}"); } @Test public void canTypeFunctionKeys() throws Exception { styledText.setFocus(); styledText.notifyKeyboardEvent(SWT.NONE, '\0', SWT.F2); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=71024493 data=null character='\\0' keyCode=" + toKeyCode(16777227, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=71024597 data=null character='\\0' keyCode=" + toKeyCode(16777227, styledText.widget) + " stateMask=0 doit=true}"); } @Test public void canTypeArrowKeys() throws Exception { styledText.setFocus(); styledText.pressShortcut(Keystrokes.DOWN); assertEventMatches(listeners, "Traverse [31]: TraverseEvent{StyledText {} time=72468446 data=null character='\\0' keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=0 doit=false detail=64}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=72468446 data=null character='\\0' keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=72468502 data=null character='\\0' keyCode=" + toKeyCode(16777218, styledText.widget) + " stateMask=0 doit=true}"); } @Test public void canTypeShiftEnd() throws Exception { if (isWin32()) // FIXME: 278207: Display.post() cannot post SHIFT+END keystrokes. return; styledText.setFocus(); styledText.pressShortcut(Keystrokes.SHIFT, Keystrokes.END); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=74720408 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=74720744 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=74720800 data=null character='\\0' keyCode=" + toKeyCode(16777224, styledText.widget) + " stateMask=131072 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=74720904 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=131072 doit=true}"); } @Test public void canTypeModifierAndSpecialKeys() throws Exception { styledText.setFocus(); styledText.pressShortcut(SWT.ALT | SWT.SHIFT, SWT.F1, '\0'); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734039746 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734040242 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=1734040650 data=null character='\\0' keyCode=" + toKeyCode(16777226, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734040730 data=null character='\\0' keyCode=" + toKeyCode(16777226, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734041073 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=1734041394 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Test public void canTypeALT_SHIFT_C() throws Exception { // don't execute on mac if (!isMac()) return; styledText.setFocus(); styledText.pressShortcut(SWT.ALT | SWT.SHIFT, 'c'); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17898887 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=0 doit=true}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17899215 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=65536 doit=true}"); assertEventMatches(listeners, "Verify [25]: VerifyEvent{StyledText {} time=17899783 data=null character='\\0' keyCode=" + toKeyCode(0, styledText.widget) + " stateMask=0 doit=true start=0 end=0 text=Ç}"); assertEventMatches(listeners, "Modify [24]: ModifyEvent{StyledText {} time=17899783 data=null}"); assertEventMatches(listeners, "KeyDown [1]: KeyEvent{StyledText {} time=17899783 data=null character='Ç' keyCode=" + toKeyCode(99, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17899887 data=null character='Ç' keyCode=" + toKeyCode(99, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17900711 data=null character='\\0' keyCode=" + toKeyCode(131072, styledText.widget) + " stateMask=196608 doit=true}"); assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17901071 data=null character='\\0' keyCode=" + toKeyCode(65536, styledText.widget) + " stateMask=65536 doit=true}"); } @Before public void prepareExample() throws Exception { keyboard = new Keyboard(); bot.tabItem("StyledText").activate(); bot.checkBox("Horizontal Fill").select(); bot.checkBox("Vertical Fill").select(); bot.checkBox("Listen").deselect(); bot.checkBox("Listen").select(); styledText = bot.styledTextInGroup("StyledText"); styledText.setText(""); bot.button("Clear").click(); listeners = bot.textInGroup("Listeners"); } private static boolean isWin32() { String swtPlatform = SWT.getPlatform(); return ("win32".equals(swtPlatform)); } private static boolean isGtk() { String swtPlatform = SWT.getPlatform(); return ("gtk".equals(swtPlatform)); } }