- Revision
- 662
- Author
- sirenian
- Date
- 2007-01-04 10:43:13 -0600 (Thu, 04 Jan 2007)
Log Message
[EK] Quick 'fix' for Linux distros; if the typing doesn't work, a PendingException will be thrown saying it's not supported
Modified Paths
Diff
Modified: trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java (661 => 662)
--- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java 2007-01-04 15:42:19 UTC (rev 661) +++ trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java 2007-01-04 16:43:13 UTC (rev 662) @@ -23,7 +23,6 @@ public class DefaultWindowWrapperBehaviour extends UsingMiniMock { public void shouldClickAButtonOnAWindow() throws Exception { - todo("not working on unix"); checkForHeadless(); DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); @@ -54,7 +53,6 @@ public void shouldEnterTextIntoTextComponents() throws Exception { - todo("fix race condition on linux"); checkForHeadless(); DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); @@ -87,7 +85,6 @@ } public void shouldFindComponent() throws ComponentFinderException, TimeoutException { - todo("not working on linux"); checkForHeadless(); DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); try { @@ -128,7 +125,6 @@ } public void shouldSimulateKeyPressesForInputMap() throws TimeoutException { - todo("fix race condition on linux"); checkForHeadless(); DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); @@ -150,7 +146,6 @@ } public void shouldSimulateKeyPressesForKeyListeners() throws TimeoutException { - todo("fix race condition on linux"); checkForHeadless(); DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window");
Modified: trunk/extensions/swing/src/java/org/jbehave/threaded/swing/DefaultWindowWrapper.java (661 => 662)
--- trunk/extensions/swing/src/java/org/jbehave/threaded/swing/DefaultWindowWrapper.java 2007-01-04 15:42:19 UTC (rev 661) +++ trunk/extensions/swing/src/java/org/jbehave/threaded/swing/DefaultWindowWrapper.java 2007-01-04 16:43:13 UTC (rev 662) @@ -1,16 +1,22 @@ package org.jbehave.threaded.swing; import java.awt.AWTEvent; +import java.awt.AWTException; import java.awt.Component; import java.awt.EventQueue; +import java.awt.Robot; import java.awt.TextComponent; import java.awt.Toolkit; import java.awt.Window; +import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.ArrayList; import javax.swing.AbstractButton; import javax.swing.text.JTextComponent; +import org.jbehave.core.exception.PendingException; import org.jbehave.threaded.WindowGrabber; import org.jbehave.threaded.time.TimeoutException; @@ -76,11 +82,23 @@ } public void typeIntoJTextComponent(JTextComponent textComponent, String text) { - for (int i = 0; i < text.length(); i++) { - sysQueue.postEvent(createKeyPressEvent(textComponent, text.charAt(i), KeyEvent.KEY_PRESSED)); - sysQueue.postEvent(createKeyPressEvent(textComponent, text.charAt(i), KeyEvent.KEY_RELEASED)); - sysQueue.postEvent(createKeyPressEvent(textComponent, text.charAt(i), KeyEvent.KEY_TYPED)); - } + VerifyingKeyAdapter verifier = new VerifyingKeyAdapter(); + + textComponent.addKeyListener(verifier); + + try { + for (int i = 0; i < text.length(); i++) { + sysQueue.postEvent(createKeyPressEvent(textComponent, text.charAt(i), KeyEvent.KEY_PRESSED)); + sysQueue.postEvent(createKeyPressEvent(textComponent, text.charAt(i), KeyEvent.KEY_RELEASED)); + sysQueue.postEvent(createKeyPressEvent(textComponent, text.charAt(i), KeyEvent.KEY_TYPED)); + if (!verifier.events.contains(new KeycodeEventsReceived(text.charAt(i), KeyEvent.KEY_TYPED))) { + throw new PendingException("Text typing not supported for your Swing library."); + } + } + } finally { + textComponent.removeKeyListener(verifier); + } + idler.waitForIdle(); } @@ -88,23 +106,30 @@ * Use this for any key which doesn't have a corresponding character. */ public void pressKeycode(int keycode) throws TimeoutException { - //NB: Don't use the Robot. - //Why not the Robot? - //Because the Robot tries to press the space bar, which is really annoying if you're running things - //from Eclipse's vm. - - sysQueue.postEvent(createKeyPressEvent(getWindow(), keycode, KeyEvent.KEY_PRESSED)); - sysQueue.postEvent(createKeyPressEvent(getWindow(), keycode, KeyEvent.KEY_RELEASED)); + sysQueue.postEvent(createKeyPressEvent(getWindow(), keycode, KeyEvent.KEY_PRESSED)); + sysQueue.postEvent(createKeyPressEvent(getWindow(), keycode, KeyEvent.KEY_RELEASED)); idler.waitForIdle(); } public void pressKeychar(char key) throws TimeoutException { - sysQueue.postEvent(createKeyPressEvent(getWindow(), key, KeyEvent.KEY_PRESSED)); - sysQueue.postEvent(createKeyPressEvent(getWindow(), key, KeyEvent.KEY_RELEASED)); - sysQueue.postEvent(createKeyPressEvent(getWindow(), key, KeyEvent.KEY_TYPED)); - - idler.waitForIdle(); + VerifyingKeyAdapter verifier = new VerifyingKeyAdapter(); + + getWindow().addKeyListener(verifier); + + try { + sysQueue.postEvent(createKeyPressEvent(getWindow(), key, KeyEvent.KEY_PRESSED)); + sysQueue.postEvent(createKeyPressEvent(getWindow(), key, KeyEvent.KEY_RELEASED)); + sysQueue.postEvent(createKeyPressEvent(getWindow(), key, KeyEvent.KEY_TYPED)); + if (!verifier.events.contains(new KeycodeEventsReceived(key, KeyEvent.KEY_TYPED))) { + throw new PendingException("Text typing not supported for your Swing library."); + } + } finally { + getWindow().removeKeyListener(verifier); + } + + idler.waitForIdle(); + } public Component findComponent(String componentName) throws ComponentFinderException, TimeoutException { @@ -141,4 +166,22 @@ getWindow().requestFocus(); idler.waitForIdle(); } + + private class VerifyingKeyAdapter extends KeyAdapter { + private ArrayList events = new ArrayList(); + + public void keyTyped(KeyEvent e) { + events.add(new KeycodeEventsReceived(e.getKeyChar(), KeyEvent.KEY_TYPED)); + } + } + + private class KeycodeEventsReceived { + private char keyChar; + private int event; + + private KeycodeEventsReceived(char keyChar, int event) { + this.keyChar = keyChar; + this.event = event; + } + } }
To unsubscribe from this list please visit:
