- Revision
- 667
- Author
- sirenian
- Date
- 2007-01-10 09:06:40 -0600 (Wed, 10 Jan 2007)
Log Message
[EK] Fixed Swing problems?
Modified Paths
- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java
- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/time/ClockedTimeouterBehaviour.java
- trunk/extensions/swing/src/java/org/jbehave/threaded/QueuedMiniHashMap.java
- trunk/extensions/swing/src/java/org/jbehave/threaded/swing/CharacterTyper.java
- trunk/extensions/swing/src/java/org/jbehave/threaded/time/ClockedTimeouter.java
Diff
Modified: trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java (666 => 667)
--- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java 2007-01-09 10:46:50 UTC (rev 666) +++ trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java 2007-01-10 15:06:40 UTC (rev 667) @@ -24,11 +24,11 @@ public void shouldClickAButtonOnAWindow() throws Exception { checkForHeadless(); - DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); + DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME); try { - JFrame frame = disposeOnCloseFrame(); - frame.setName("a.window"); + AFrame frame = new AFrame(); + frame.setName(AFrame.FRAME_NAME); JButton button = new JButton("Press Me!"); button.setName("a.button"); @@ -54,11 +54,10 @@ public void shouldEnterTextIntoTextComponents() throws Exception { checkForHeadless(); - DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); + DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME); try { - JFrame frame = disposeOnCloseFrame(); - frame.setName("a.window"); + AFrame frame = new AFrame(); JTextComponent textField = new JTextField(); textField.setName("a.textfield"); @@ -86,12 +85,11 @@ public void shouldFindComponent() throws ComponentFinderException, TimeoutException { checkForHeadless(); - DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); + DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME); try { + + AFrame frame = new AFrame(); - JFrame frame = disposeOnCloseFrame(); - frame.setName("a.window"); - JPanel panel = new JPanel(); panel.setName("a.panel"); @@ -106,36 +104,27 @@ public void shouldCloseWindows() throws TimeoutException { checkForHeadless(); - DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); + DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME); + + AFrame frame = new AFrame(); - JFrame frame = disposeOnCloseFrame(); - frame.setName("a.window"); - frame.setVisible(true); - wrapper.closeWindow(); ensureThat(!frame.isShowing()); frame.dispose(); } - - - private JFrame disposeOnCloseFrame() { - JFrame frame = new JFrame(); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - return frame; - } public void shouldSimulateKeyPressesForInputMap() throws TimeoutException { checkForHeadless(); - DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); + DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME); try { AFrame frame = new AFrame(); - Mock action = "" + Mock action = "" "Action"); action.stubs("isEnabled").will(returnValue(true)); action.expects("actionPerformed").with(anything()); - frame.contentPanel.getActionMap().put("an action", (Action) action); + frame.contentPanel.getActionMap().put(AFrame.ACTION_KEY, (Action) action); wrapper.pressKeychar(' '); @@ -147,15 +136,10 @@ public void shouldSimulateKeyPressesForKeyListeners() throws TimeoutException { checkForHeadless(); - DefaultWindowWrapper wrapper = new DefaultWindowWrapper("a.window"); + DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME); try { - JFrame frame = disposeOnCloseFrame(); - JPanel panel = new JPanel(); - frame.setContentPane(panel); - frame.setName("a.window"); - frame.pack(); - frame.setVisible(true); + AFrame frame = new AFrame(); Matcher spaceKeyEvent = new Matcher() { public boolean matches(Object arg) { @@ -167,7 +151,7 @@ keyListener.stubs("keyTyped").once().with(spaceKeyEvent); keyListener.stubs("keyPressed").once().with(spaceKeyEvent); keyListener.expects("keyReleased").once().with(spaceKeyEvent); - frame.addKeyListener((KeyListener) keyListener); + frame.contentPanel.addKeyListener((KeyListener) keyListener); wrapper.pressKeychar(' '); @@ -182,12 +166,16 @@ } public class AFrame extends JFrame { + private static final String FRAME_NAME = "a.window"; + private static final String ACTION_KEY = "AFrame.action"; + + private JPanel contentPanel = new JPanel(); public AFrame() { - setName("a.window"); + setName(FRAME_NAME); setContentPane(contentPanel); - contentPanel.getInputMap().put(KeyStroke.getKeyStroke(' '), "an action"); + contentPanel.getInputMap().put(KeyStroke.getKeyStroke(' '), ACTION_KEY); this.pack(); this.setVisible(true);
Modified: trunk/extensions/swing/src/behaviour/org/jbehave/threaded/time/ClockedTimeouterBehaviour.java (666 => 667)
--- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/time/ClockedTimeouterBehaviour.java 2007-01-09 10:46:50 UTC (rev 666) +++ trunk/extensions/swing/src/behaviour/org/jbehave/threaded/time/ClockedTimeouterBehaviour.java 2007-01-10 15:06:40 UTC (rev 667) @@ -8,26 +8,26 @@ private PseudoClock clock = new PseudoClock(); - public void shouldTimeoutIffTimeoutHasBeenExceeded() { + public void shouldTimeoutIffTimeoutHasBeenEqualledOrExceeded() { ClockedTimeouter timeouter = new ClockedTimeouter(clock); clock.setTimeInMillis(0); timeouter.start(20); - for (int i = 1; i < 21; i++) { + for (int i = 1; i < 20; i++) { try { clock.setTimeInMillis(i); timeouter.checkTime(); - ensureThat(i, isLessThanOrEq(20)); + ensureThat(i, isLessThan(20)); } catch (TimeoutException e) { - ensureThat(i, isGreaterThan(20)); + ensureThat(i, isGreaterThanOrEq(20)); } } } - private Matcher isLessThanOrEq(final int time) { + private Matcher isLessThan(final int time) { return new Matcher() { public boolean matches(Object arg) { - return arg instanceof Long && ((Long)arg).longValue() <= time; + return arg instanceof Long && ((Long)arg).longValue() < time; } public String toString() { @@ -36,10 +36,10 @@ }; } - private Matcher isGreaterThan(final int time) { + private Matcher isGreaterThanOrEq(final int time) { return new Matcher() { public boolean matches(Object arg) { - return arg instanceof Long && ((Long)arg).longValue() > time; + return arg instanceof Long && ((Long)arg).longValue() >= time; } public String toString() {
Modified: trunk/extensions/swing/src/java/org/jbehave/threaded/QueuedMiniHashMap.java (666 => 667)
--- trunk/extensions/swing/src/java/org/jbehave/threaded/QueuedMiniHashMap.java 2007-01-09 10:46:50 UTC (rev 666) +++ trunk/extensions/swing/src/java/org/jbehave/threaded/QueuedMiniHashMap.java 2007-01-10 15:06:40 UTC (rev 667) @@ -9,8 +9,6 @@ import org.jbehave.threaded.time.Timeouter; import org.jbehave.threaded.time.TimeouterFactory; - - /** * An asynchronous holder implementing some map-like features. If an object is * retrieved using a key and no object is present, this set will wait for a
Modified: trunk/extensions/swing/src/java/org/jbehave/threaded/swing/CharacterTyper.java (666 => 667)
--- trunk/extensions/swing/src/java/org/jbehave/threaded/swing/CharacterTyper.java 2007-01-09 10:46:50 UTC (rev 666) +++ trunk/extensions/swing/src/java/org/jbehave/threaded/swing/CharacterTyper.java 2007-01-10 15:06:40 UTC (rev 667) @@ -2,19 +2,18 @@ import java.awt.AWTEvent; import java.awt.Component; +import java.awt.Container; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.Window; -import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import javax.swing.AbstractAction; +import javax.swing.JComponent; import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.KeyStroke; import org.jbehave.core.exception.PendingException; +import org.jbehave.threaded.QueuedMiniHashMap; import org.jbehave.threaded.time.TimeoutException; /** @@ -22,9 +21,8 @@ */ class CharacterTyper { + private static final String ACTION_KEY = "CharacterTyper.action"; private static final String TEXT_TYPING_UNSUPPORTED = "Text typing not supported for your Swing library."; - private static Boolean typingCharWorks; - private static Boolean pressingCharWorks; private EventQueue sysQueue; private Idler idler; @@ -36,19 +34,14 @@ } public void typeIntoComponent(Component component, String text) { - VerifyingKeyAdapter verifier = new VerifyingKeyAdapter(); - component.addKeyListener(verifier); - + QueueingKeyAdapter queuer = new QueueingKeyAdapter(component); try { for (int i = 0; i < text.length(); i++) { postKeyEvent(component, text.charAt(i)); - if (!verifier.keyTyped) { - throw new PendingException(TEXT_TYPING_UNSUPPORTED); - } + queuer.waitForEvent(); } } finally { - component.removeKeyListener(verifier); - idler.waitForIdle(); + queuer.removeSelf(); } } @@ -57,91 +50,30 @@ * (eg: as a game control key) rather than being typed into a text component. */ public void pressKeychar(Window window, char key) throws TimeoutException { - if (pressingCharWorks == null) { - postTypedEventWithInputVerifier(window, key); - } else if (!pressingCharWorks.booleanValue()) { - throw new PendingException(TEXT_TYPING_UNSUPPORTED); - } else { - postKeyEvent(window, key); - } - } - - private void postTypedEventWithInputVerifier(Window window, char key) throws TimeoutException { - boolean result = verifyKeyCharEventPostedToNewFrame(key); + QueueingKeyAdapter queuer = null; - if (result) { - postTypedEvent(window, key); - pressingCharWorks = Boolean.TRUE; + if(window instanceof JFrame) { + Container contentPane = ((JFrame)window).getContentPane(); + if (contentPane instanceof JComponent) { + queuer = new QueueingKeyAdapter(contentPane); + } } else { - pressingCharWorks = Boolean.FALSE; - throw new PendingException(TEXT_TYPING_UNSUPPORTED); + queuer = new QueueingKeyAdapter(window.getFocusOwner()); } - } - - private boolean verifyKeyCharEventPostedToNewFrame(char key) throws TimeoutException { - JFrame jFrame = new JFrame(); - jFrame.setName("CharacterTyper.frame"); - JPanel panel = new JPanel(); - jFrame.setContentPane(panel); - - KeyStroke keyStroke = KeyStroke.getKeyStroke(key); - String actionId = "CharacterTyper.actionFor " + key; - VerifyingAction verifier = new VerifyingAction(); + postKeyEvent(window, key); - panel.getInputMap().put(keyStroke, actionId); - panel.getActionMap().put(actionId, verifier); - - jFrame.pack(); - jFrame.setVisible(true); - - new DefaultWindowWrapper("CharacterTyper.frame").getOpenWindow(); - - postKeyEvent(jFrame, key); - - panel.getInputMap().remove(keyStroke); - panel.getActionMap().remove(actionId); - - boolean result = verifier.actionPerformed; - jFrame.dispose(); - - idler.waitForIdle(); - - return result; - } - - private void postTypedEvent(Window window, char key) throws TimeoutException { - if (typingCharWorks == null) { - postTypedEventWithVerifier(window, key); - } else if (!typingCharWorks.booleanValue()) { - throw new PendingException(TEXT_TYPING_UNSUPPORTED); - } else { - postKeyEvent(window, key); - } - } - - private void postTypedEventWithVerifier(Window window, char key) { - VerifyingKeyAdapter verifier = new VerifyingKeyAdapter(); - window.addKeyListener(verifier); - try { - postKeyEvent(window, key); - if (verifier.keyTyped) { - typingCharWorks = Boolean.TRUE; - } else { - typingCharWorks = Boolean.FALSE; - throw new PendingException(TEXT_TYPING_UNSUPPORTED); - } + queuer.waitForEvent(); + } finally { + queuer.removeSelf(); } - finally { - window.removeKeyListener(verifier); - } } - private void postKeyEvent(Component component, char key) { + private void postKeyEvent(final Component component, final char key) { sysQueue.postEvent(createKeyPressEvent(component, key, KeyEvent.KEY_PRESSED)); sysQueue.postEvent(createKeyPressEvent(component, key, KeyEvent.KEY_RELEASED)); - sysQueue.postEvent(createKeyPressEvent(component, key, KeyEvent.KEY_TYPED)); + sysQueue.postEvent(createKeyPressEvent(component, key, KeyEvent.KEY_TYPED)); idler.waitForIdle(); } @@ -154,19 +86,29 @@ c); } - private class VerifyingKeyAdapter extends KeyAdapter { - private boolean keyTyped; + private class QueueingKeyAdapter extends KeyAdapter { + private QueuedMiniHashMap map = new QueuedMiniHashMap(); + private final Component component; + public QueueingKeyAdapter(Component component) { + this.component = component; + component.requestFocus(); + component.addKeyListener(this); + } public void keyTyped(KeyEvent e) { - keyTyped = true; + map.put("keyTyped", e); } - } - - private class VerifyingAction extends AbstractAction { - private boolean actionPerformed; - public void actionPerformed(ActionEvent e) { - actionPerformed = true; + public void waitForEvent() { + try { + map.get("keyTyped", 1000); + } catch (TimeoutException e) { + throw new PendingException(TEXT_TYPING_UNSUPPORTED); + } + idler.waitForIdle(); } - } - + + public void removeSelf() { + component.removeKeyListener(this); + } + } }
Modified: trunk/extensions/swing/src/java/org/jbehave/threaded/time/ClockedTimeouter.java (666 => 667)
--- trunk/extensions/swing/src/java/org/jbehave/threaded/time/ClockedTimeouter.java 2007-01-09 10:46:50 UTC (rev 666) +++ trunk/extensions/swing/src/java/org/jbehave/threaded/time/ClockedTimeouter.java 2007-01-10 15:06:40 UTC (rev 667) @@ -9,7 +9,7 @@ } public void checkTime() throws TimeoutException { - if (endTime < clock.getTimeInMillis()) throw new TimeoutException(); + if (endTime <= clock.getTimeInMillis()) throw new TimeoutException(); } public long getTimeLeftIfAny() {
To unsubscribe from this list please visit:
