Title: [jbehave] [662] trunk/extensions/swing/src/java/org/jbehave/threaded/swing: [EK] Quick 'fix' for Linux distros; if the typing doesn't work, a
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:

http://xircles.codehaus.org/manage_email

Reply via email to