From: scott s. <ssy...@us...> - 2005-08-16 22:41:57
|
Update of /cvsroot/abbot/abbot.swt/src/abbot/tester/swt In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23317/src/abbot/tester/swt Modified Files: MenuItemTester.java Log Message: Add method which takes a delimiter for the path. Change implementation to use Condition instead of waitForIdle; that way the MenuItemTester gets off the stack when the menu's disappear, instead or when display thread is idle. Index: MenuItemTester.java =================================================================== RCS file: /cvsroot/abbot/abbot.swt/src/abbot/tester/swt/MenuItemTester.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** MenuItemTester.java 25 Jul 2005 04:13:29 -0000 1.21 --- MenuItemTester.java 16 Aug 2005 22:41:49 -0000 1.22 *************** *** 1,4 **** --- 1,9 ---- package abbot.tester.swt; + import java.util.ArrayList; + import java.util.Iterator; + import java.util.List; + import java.util.StringTokenizer; + import junit.framework.Assert; *************** *** 7,11 **** import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Decorations; - import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; --- 12,15 ---- *************** *** 15,19 **** import org.eclipse.swt.widgets.Widget; ! import abbot.WaitTimedOutError; import abbot.finder.matchers.swt.ClassMatcher; import abbot.finder.matchers.swt.NameMatcher; --- 19,23 ---- import org.eclipse.swt.widgets.Widget; ! import abbot.Log; import abbot.finder.matchers.swt.ClassMatcher; import abbot.finder.matchers.swt.NameMatcher; *************** *** 38,71 **** "ADP Schedule Contract with IBM Corp."; - /** properties **/ - // protected int accelerator; - // protected boolean enabled,selection; - // protected Menu menu, parent; - // protected Rectangle bounds; - public static final String ARM_LISTENER_NAME = "a4sArmListener"; public static final String SELECTION_LISTENER_NAME = "a4sSelectionListener"; public static final String WATCHER_NAME = "a4sWatcher"; public static final int PATH_CLICKING_WAIT_TIME = 500000; - /** - * Sets the above properties to their current values for the given widget. - * NOTE: This should be called in a block of code synchronized on this - * tester. - */ - // protected synchronized void getProperties(final MenuItem item){ - // super.getProperties(item); - // Robot.syncExec(item.getDisplay(),this,new Runnable(){ - // public void run(){ - // accelerator = item.getAccelerator(); - // enabled = item.getEnabled(); - // selection = item.getSelection(); - // menu = item.getMenu(); - // parent = item.getParent(); - // bounds = SWTWorkarounds.getBounds(item); - // } - // }); - // } - /* * These getter methods return a particular property of the given widget. --- 42,52 ---- "ADP Schedule Contract with IBM Corp."; public static final String ARM_LISTENER_NAME = "a4sArmListener"; public static final String SELECTION_LISTENER_NAME = "a4sSelectionListener"; public static final String WATCHER_NAME = "a4sWatcher"; public static final int PATH_CLICKING_WAIT_TIME = 500000; + + public static final String DEFAULT_MENUITEM_PATH_DELIMITER = "/"; /* * These getter methods return a particular property of the given widget. *************** *** 172,270 **** } /* end getters */ ! ! // returns the path for the given menu item ! public String getPathString(MenuItem item){ ! String path = ""; ! Menu parent; ! while(item!=null){ ! path= getText(item)+"/"+path; ! parent = getParent(item); ! item = ((MenuTester)getTester(Menu.class)).getParentItem(parent); ! } ! path = path.substring(0,path.length()-1); ! return path; ! } ! ! // flag and associated methods to identify if actionClickMenuItemByPath ! // has completed, volatile should do all the monitor job. ! private volatile boolean doneClickingMenuItem = false; ! private void setDone(){ ! /* to make this work we want it to run as a sort of monitor */ ! doneClickingMenuItem = true; ! } ! private void setUndone(){ ! doneClickingMenuItem = false; ! } ! /* was there a good reason this was synchronized before? */ ! private boolean isDone(){ ! return doneClickingMenuItem; ! } ! ! /** ! * Exposes a menu item by clicking along its path and clicks the item. For dynamic ! * menus, the actual MenuItem that is passed may not actually be the one that is clicked. ! * It is only used to resolve the path to the item. ! * ! * @param item the item to click ! * @param parentControl the Control that owns the root popup, or null if not popup ! * @param delay time (in ms) to wait between item clicks ! */ ! // public void actionClickMenuItem(MenuItem item, Control parentControl, int delay){ ! // //Decorations parentDec = ((MenuTester)getTester(Menu.class)).getParent(getParent(item)); ! // Decorations parentDec = item.getParent().getParent(); ! // actionClickMenuItemByPath(getPathString(item),parentControl,parentDec,delay); ! // } ! /* ! * TODO: Need to rewrite this to make it thread safe. In particular, the issues wrt the ! * display loop and new dialogs need to be examined. ! * ! */ ! public void actionSelectMenuItem(final String path, final Control parentControl, final Decorations parentDecorations, final int delay) { ! //System.out.println("asmi"); ! boolean started = false; ! final Display d = parentDecorations.getDisplay(); ! setUndone(); ! ! if(Thread.currentThread() == parentDecorations.getDisplay().getThread()){ ! Thread t = new Thread(){ ! public void run(){ ! actionClickMenuItemByPathImp(path,parentControl,parentDecorations, delay); ! } ! }; ! ! while(!isDone() && !parentDecorations.isDisposed() && !parentDecorations.getDisplay().isDisposed()){ ! // System.out.println("Idle waiting loop"); ! waitForIdle(parentDecorations.getDisplay()); ! // if (d.readAndDispatch()) { ! // //waitForIdle(d); ! // } else { ! // System.out.println ("Nothing to do"); ! // } ! // System.out.println("/Idle waiting loop"); ! if(!started){ ! started = true; ! //System.out.println("start thread"); ! t.start(); ! } ! // /* wait till done */ ! // try { Thread.sleep(750); } catch (InterruptedException e) { ! // e.printStackTrace(); ! // } ! // d.syncExec(new Runnable(){ ! // public void run(){ ! // while(d.readAndDispatch() && !isDone()); ! // } ! // }); ! // if (!d.readAndDispatch()) { ! // System.out.println("rd"); ! // d.sleep(); ! // } ! } ! } ! else ! actionClickMenuItemByPathImp(path,parentControl,parentDecorations,delay); ! //System.out.println("/asmi"); ! } /** --- 153,212 ---- } /* end getters */ ! ! // returns the path for the given menu item ! public String getPathString(MenuItem item){ ! return getPathString(item,DEFAULT_MENUITEM_PATH_DELIMITER); ! } ! ! public String getPathString(MenuItem item, String delimiter){ ! String path = ""; ! Menu parent; ! while(item!=null){ ! path= getText(item)+delimiter+path; ! parent = getParent(item); ! item = ((MenuTester)getTester(Menu.class)).getParentItem(parent); ! } ! path = path.substring(0,path.length()-1); ! return path; ! } ! ! public void actionSelectMenuItem(final String path, final Control parentControl, final Decorations parentDecorations, final int delay) { ! actionSelectMenuItem(path,parentControl,parentDecorations,delay,DEFAULT_MENUITEM_PATH_DELIMITER); ! } ! ! public void actionSelectMenuItem(final String path, final Control parentControl, final Decorations parentDecorations, final int delay, String delimiter) ! { ! final boolean [] done = {false}; ! final StringBuffer debugBuffer = new StringBuffer(); ! debugBuffer.append("PATH:["); ! debugBuffer.append(path); ! debugBuffer.append("]\n"); ! final StringTokenizer st = new StringTokenizer(path,delimiter); ! final int expectedNumberOfArmEvents = st.countTokens(); ! final List watchers = new ArrayList(expectedNumberOfArmEvents); ! //final List<Watcher> watchers = new ArrayList<Watcher>(expectedNumberOfArmEvents); ! for (int i = 0; i < expectedNumberOfArmEvents; i++) { ! watchers.add(i,new Watcher(debugBuffer)); ! } ! Thread t = new Thread(){ ! public void run(){ ! actionClickMenuItemByPathImp(st,parentControl,parentDecorations, delay, watchers,debugBuffer,done); ! Log.log("Leaving MenuItemTester thread for:"+path); ! } ! }; ! t.start(); ! wait(new Condition() { + public boolean test() { + return (done[0] && (getNumberOfArmedEvents(watchers) == expectedNumberOfArmEvents)); + } + + public String toString() { + return path + " to have "+expectedNumberOfArmEvents+"SWT.Arm events\n\nfor path:" + +path+"\n\n"+debugBuffer.toString(); + } + + }); + } /** *************** *** 289,418 **** actionSelectMenuItem(path, parentControl, parentDecorations, delay); } ! // boolean started = false; ! // setUndone(); ! // ! // if(Thread.currentThread() == parentDecorations.getDisplay().getThread()){ ! // Thread t = new Thread(){ ! // public void run(){ ! // actionClickMenuItemByPathImp(path,parentControl,parentDecorations, delay); ! // } ! // }; ! // ! // while(!isDone() && !parentDecorations.getDisplay().isDisposed()){ ! // System.out.println("Idle waiting loop"); ! // waitForIdle(parentDecorations.getDisplay()); ! // System.out.println("/idle waiting loop"); ! // if(!started){ ! // started = true; ! // t.start(); ! // } ! // } ! // } ! // else ! // actionClickMenuItemByPathImp(path,parentControl,parentDecorations,delay); ! // } ! private void actionClickMenuItemByPathImp(String path, Control parentControl, Decorations parentDecorations, int delay){ ! // TODO: rt-click control if menu is a popup ! if(parentControl != null){ ! Rectangle bounds = ((ControlTester)WidgetTester.getTester(Control.class)). ! getBounds(parentControl); ! actionClick(parentControl,bounds.x/2,bounds.y/2,"BUTTON1"); ! } ! ! int separator = -1; ! String text = null; ! MenuItem lastItem = null; ! do{ ! separator = path.indexOf('/'); ! text = (separator==-1)?path : path.substring(0,separator); ! lastItem = resolveAndClickItem(text, parentControl, parentDecorations, ((lastItem==null) ? (Widget)parentDecorations : (Widget)lastItem)); ! actionDelay(delay); ! path = path.substring(separator+1); ! }while(separator>=0); ! //System.out.println("Setting done"); ! setDone(); ! //System.out.println("Set to done"); ! ! } ! private MenuItem resolveAndClickItem(String text, Control parentControl, ! Decorations parentDecorations, Widget parent){ ! // String title = ((DecorationsTester)WidgetTester.getTester(Decorations.class)). ! // getText(parentDecorations); ! BasicFinder finder = new BasicFinder(new TestHierarchy(parentDecorations.getDisplay())); ! WaitTimedOutError waitError = null; ! MenuItem item = null; ! try{ ! //item = (MenuItem)DefaultWidgetFinder.getFinder().findWidget(ref); ! // use new matcher API ! item = (MenuItem)finder.find(parent, new TextMatcher(text)); ! addWatcher(item); ! actionClick(item); ! final MenuItem itemT = item; ! //System.out.println ("asmi waiting"); ! wait(new Condition() { ! public boolean test() { ! return itemT.isDisposed() || isArmedOrSelected(itemT); ! } ! }, PATH_CLICKING_WAIT_TIME); ! //System.out.println ("/asmi waiting"); ! }catch(WidgetNotFoundException wnfe){ ! System.err.println("Widget MenuItem {"+text+"} not found"); ! setDone(); ! }catch(MultipleWidgetsFoundException mwfe){ ! System.err.println("Multiple Widgets found when looking for " ! +" MenuItem {"+text+"}"); ! setDone(); ! }catch(WaitTimedOutError wtoe){ ! wtoe.fillInStackTrace(); ! waitError = wtoe; ! setDone(); ! } ! ! if (waitError != null) ! throw waitError; ! ! if(item != null && !item.isDisposed()) ! removeWatcher(item); ! return item; ! } ! // Listener to signal when a menu item has been clicked ! private class Watcher implements Listener{ ! private volatile boolean gotArm = false; ! private volatile boolean gotSelection = false; ! public void handleEvent(org.eclipse.swt.widgets.Event e){ ! if(e.type==SWT.Arm) ! gotArm = true; ! if(e.type==SWT.Selection) ! gotSelection= true; ! } ! } ! ! // adds a watcher-listener to the given menu item ! private void addWatcher(final MenuItem item){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! Watcher watcher = new Watcher(); ! item.setData(WATCHER_NAME,watcher); ! item.addListener(SWT.Arm,watcher); ! item.addListener(SWT.Selection,watcher); ! } ! }); ! } ! ! // removes the given item's watcher-listener ! private void removeWatcher(final MenuItem item){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! Watcher watcher = (Watcher)item.getData(WATCHER_NAME); ! if(watcher!=null) ! item.removeListener(SWT.Arm,watcher); ! item.removeListener(SWT.Selection, watcher); ! } ! }); ! } ! //private Watcher watcher=null; // tests whether the given item has received the Arm or Selection event --- 231,364 ---- actionSelectMenuItem(path, parentControl, parentDecorations, delay); } ! ! private void actionClickMenuItemByPathImp(StringTokenizer path, Control parentControl, Decorations parentDecorations, int delay, List watchers, StringBuffer buffer, boolean [] done){ ! //private void actionClickMenuItemByPathImp(StringTokenizer path, Control parentControl, Decorations parentDecorations, int delay, List<Watcher> watchers, StringBuffer buffer){ ! // rt-click control if menu is a popup ! if(parentControl != null){ ! Rectangle bounds = ((ControlTester)WidgetTester.getTester(Control.class)). ! getBounds(parentControl); ! actionClick(parentControl,bounds.x/2,bounds.y/2,"BUTTON1"); ! } ! ! MenuItem lastItem = null; ! int watcherIndex = 0; ! try { ! do { ! String token = path.nextToken(); ! lastItem = resolveAndClickItem(token, parentControl, parentDecorations, ((lastItem==null) ? (Widget)parentDecorations : (Widget)lastItem),(Watcher)watchers.get(watcherIndex)); ! actionDelay(delay); ! watcherIndex++; ! } while(path.hasMoreTokens()); ! } catch (WidgetNotFoundException e) { ! e.printStackTrace(); ! buffer.append("\nWidgetNotFoundException:"); ! buffer.append(e.getMessage()); ! int numberOfArmedMenus = getNumberOfArmedEvents(watchers); ! escapeArmedMenus(numberOfArmedMenus); ! } catch (MultipleWidgetsFoundException e) { ! e.printStackTrace(); ! buffer.append("\nMultipleWidgetsFoundException:"); ! buffer.append(e.getMessage()); ! int numberOfArmedMenus = getNumberOfArmedEvents(watchers); ! escapeArmedMenus(numberOfArmedMenus); ! } finally { ! done[0] = true; ! } ! } ! private MenuItem resolveAndClickItem(String text, Control parentControl, ! Decorations parentDecorations, Widget parent, Watcher watcher) ! throws WidgetNotFoundException, MultipleWidgetsFoundException ! { ! BasicFinder finder = new BasicFinder(new TestHierarchy(parentDecorations.getDisplay())); ! MenuItem item = null; ! item = (MenuItem)finder.find(parent, new TextMatcher(text)); ! addWatcher(item, watcher); ! actionClick(item); ! final MenuItem itemT = item; ! wait(new Condition() { ! public boolean test() { ! return itemT.isDisposed() || isArmedOrSelected(itemT); ! } ! }, PATH_CLICKING_WAIT_TIME); ! ! if(item != null && !item.isDisposed()) { ! removeWatcher(item); ! } ! return item; ! } ! ! private void escapeArmedMenus(int numberOfArmEvents) { ! for (int i = 0; i <= numberOfArmEvents;i++) { ! actionDelay(200); ! keyPress(SWT.ESC); ! keyRelease(SWT.ESC); ! } ! } ! // Listener to signal when a menu item has been clicked ! private class Watcher implements Listener{ ! private volatile boolean _gotArm = false; ! private volatile boolean _gotSelection = false; ! private StringBuffer _debugBuffer; ! ! public Watcher(StringBuffer buffer) { ! _debugBuffer = buffer; ! } ! ! public void handleEvent(org.eclipse.swt.widgets.Event e){ ! if(e.type==SWT.Arm){ ! _debugBuffer.append("\n[SWT.Arm]:"); ! _debugBuffer.append(e); ! _gotArm = true; ! } ! if(e.type==SWT.Selection) { ! _debugBuffer.append("\n[SWT.Selection]:"); ! _debugBuffer.append(e); ! _gotSelection= true; ! } ! } ! ! public boolean gotArmEvent() {return _gotArm;} ! public boolean gotSelectionEvent() {return _gotSelection;} ! } ! // adds a watcher-listener to the given menu item ! private void addWatcher(final MenuItem item, final Watcher watcher){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! item.setData(WATCHER_NAME,watcher); ! item.addListener(SWT.Arm,watcher); ! item.addListener(SWT.Selection,watcher); ! } ! }); ! } ! ! // removes the given item's watcher-listener ! private void removeWatcher(final MenuItem item){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! Watcher watcher = (Watcher)item.getData(WATCHER_NAME); ! if(watcher!=null) { ! item.removeListener(SWT.Arm,watcher); ! item.removeListener(SWT.Selection, watcher); ! } ! } ! }); ! } ! ! private int getNumberOfArmedEvents(List watchers) { ! //private int getNumberOfArmedEvents(List <Watcher> watchers) { ! int numberOfArmedEvents = 0; ! Iterator it = watchers.iterator(); ! while (it.hasNext()) { ! //for (Watcher watcher : watchers) { ! Watcher watcher = (Watcher)it.next(); ! if (watcher.gotArmEvent()) { ! numberOfArmedEvents++; ! } ! } ! return numberOfArmedEvents; ! } // tests whether the given item has received the Arm or Selection event *************** *** 424,443 **** } Watcher lWatcher = (Watcher)item.getData(WATCHER_NAME); ! return Boolean.valueOf((lWatcher == null) ? false : lWatcher.gotArm || lWatcher.gotSelection); } }); return result.booleanValue(); - // item.getDisplay().syncExec(new Runnable(){ - // public void run(){ - // watcher = (Watcher)item.getData(WATCHER_NAME); - // } - // }); - // return (watcher==null)?false:testWatcher(); } - // private synchronized boolean testWatcher(){ - // return watcher.gotArm || watcher.gotSelection; - // } - /** * Factory method. --- 370,379 ---- } Watcher lWatcher = (Watcher)item.getData(WATCHER_NAME); ! return Boolean.valueOf((lWatcher == null) ? false : lWatcher.gotArmEvent()); } }); return result.booleanValue(); } /** * Factory method. |