Title: [jbehave] [667] trunk/extensions/swing/src/java/org/jbehave/threaded: [EK] Fixed Swing problems?

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:

http://xircles.codehaus.org/manage_email

Reply via email to