package com.windowtester.test.locator.swt; import java.awt.event.KeyEvent; import java.util.concurrent.Callable; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; import abbot.tester.swt.TextTester; import com.windowtester.runtime.IUIContext; import com.windowtester.runtime.MultipleWidgetsFoundException; import com.windowtester.runtime.WT; import com.windowtester.runtime.WidgetNotFoundException; import com.windowtester.runtime.WidgetSearchException; import com.windowtester.runtime.condition.ICondition; import com.windowtester.runtime.internal.concurrent.VoidCallable; import com.windowtester.runtime.locator.WidgetReference; import com.windowtester.runtime.swt.condition.SWTIdleCondition; import com.windowtester.runtime.swt.internal.widgets.DisplayReference; import com.windowtester.runtime.swt.locator.MenuItemLocator; import com.windowtester.runtime.swt.locator.TextLocator; import com.windowtester.test.locator.swt.shells.TextTestShell; import com.windowtester.test.util.TypingLinuxHelper; import com.windowtester.test.util.junit.OS; import com.windowtester.test.util.junit.RunOn; /******************************************************************************* * Copyright (c) 2012 Google, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Google, Inc. - initial API and implementation *******************************************************************************/ public class TextEntryTest extends AbstractLocatorTest { public static class CaretIsAtIndexCondition implements ICondition { private final int index; private final Text text; public CaretIsAtIndexCondition(Text text, int index) { this.text = text; this.index = index; } /* (non-Javadoc) * @see com.windowtester.runtime.condition.ICondition#test() */ public boolean test() { return DisplayReference.getDefault().execute(new Callable<Boolean>(){ public Boolean call() throws Exception { return text.getCaretPosition() == index; } }); } } TextTestShell window; @Override public void uiSetup() { window = new TextTestShell(); window.open(); } @Override public void uiTearDown() { window.getShell().dispose(); } public static void enterText(IUIContext ui, final String text){ final Display display = Display.getDefault(); //wait until UI settles down to guard against focus race condition new SWTIdleCondition(display).waitForIdle(); //get the focus control final Control focusControl = getFocusControl(display); //if it's a Text, use our special insert logic if (focusControl instanceof Text) { DisplayReference.getDefault().execute(new VoidCallable() { public void call() throws Exception { Text widget = (Text)focusControl; for (int i = 0; i < text.length(); i++) { widget.insert(Character.toString(text.charAt(i))); } } }); } else if (focusControl instanceof StyledText) { DisplayReference.getDefault().execute(new VoidCallable() { public void call() throws Exception { StyledText widget = (StyledText)focusControl; for (int i = 0; i < text.length(); i++) { widget.insert(Character.toString(text.charAt(i))); } } }); } else { try{ TypingLinuxHelper.switchToInsertStrategyIfNeeded(); //or else, use our default strategy ui.enterText(text); }finally{ TypingLinuxHelper.restoreOriginalStrategy(); } } } private static Control getFocusControl(final Display display) { final Control focusControl[] = new Control[1]; DisplayReference.getDefault().execute(new VoidCallable() { public void call() throws Exception { focusControl[0] = display.getFocusControl(); } }); return focusControl[0]; } private void idle() { //TODO: need IdleCondition DisplayReference.getDefault().execute(new VoidCallable() { public void call() throws Exception { while(Display.getDefault().readAndDispatch()); } }); } private void tryTestWithText(final String strText) throws WidgetSearchException { IUIContext ui = getUI(); Text text = window.getText(); //assert initial state assertEquals("", new TextTester().getText(text)); ui.click(new TextLocator()); enterText(ui, strText); idle(); assertEquals(strText, new TextTester().getText(text)); } public void testTextEntry() throws WidgetSearchException { tryTestWithText("�f�b�l���s�f�b�ʫȮb�b�l�[��"); } @RunOn(value=OS.ALL, but={OS.OSX}) public void testEndKeyEntry() throws Exception { IUIContext ui = getUI(); Text text = window.getText(); ui.click(new TextLocator()); ui.enterText("foo"); ui.keyClick(WT.ARROW_LEFT); ui.keyClick(WT.ARROW_LEFT); ui.keyClick(WT.ARROW_LEFT); // TODO[pq]: push this condition into the text locator ui.assertThat(new CaretIsAtIndexCondition(text, 0)); ui.keyClick(WT.END); ui.assertThat(new CaretIsAtIndexCondition(text, 3)); } public void testComplexTextEntry() throws WidgetSearchException { tryTestWithText("a!\"$%&/()=?*'_:;><,.-#+|~\\}][{'\")"); } public void testPeriodTextEntry() throws WidgetSearchException { tryTestWithText("periods:........,numpad periods:..........."); } public void testMinusTextEntry() throws WidgetSearchException { char keypadSubtract = (char)SWT.KEYPAD_SUBTRACT; String keypadSubtractSequence = new String(new char[] {keypadSubtract, keypadSubtract, keypadSubtract, keypadSubtract, keypadSubtract, keypadSubtract, keypadSubtract, keypadSubtract, keypadSubtract }); tryTestWithText("minus:--------------,numpad minus:"+keypadSubtractSequence); } public void testVK_MinusTextEntry2() throws WidgetSearchException { char keypadVKMinus = (char)KeyEvent.VK_MINUS; String keypadVKMinusSequence = new String(new char[] {keypadVKMinus, keypadVKMinus, keypadVKMinus, keypadVKMinus, keypadVKMinus, keypadVKMinus, keypadVKMinus, keypadVKMinus, keypadVKMinus }); tryTestWithText("minus:--------------,vk minus:"+keypadVKMinusSequence); } public void testPlusTextEntry() throws WidgetSearchException { char keypadAdd = (char)SWT.KEYPAD_ADD; String keypadAddSequence = new String(new char[] {keypadAdd, keypadAdd, keypadAdd, keypadAdd, keypadAdd, keypadAdd, keypadAdd, keypadAdd, keypadAdd }); tryTestWithText("add:++++++++,numpad add:"+keypadAddSequence); } public void testMultiplyTextEntry() throws WidgetSearchException { char keypadMultiply = (char)SWT.KEYPAD_MULTIPLY; String keypadMultiplySequence = new String(new char[] {keypadMultiply, keypadMultiply, keypadMultiply, keypadMultiply, keypadMultiply, keypadMultiply, keypadMultiply, keypadMultiply, keypadMultiply }); tryTestWithText("multiply:********,numpad multiply:"+keypadMultiplySequence); } public void testDivideTextEntry() throws WidgetSearchException { char keypadDivide = (char)SWT.KEYPAD_DIVIDE; String keypadDivideSequence = new String(new char[] {keypadDivide, keypadDivide, keypadDivide, keypadDivide, keypadDivide, keypadDivide, keypadDivide, keypadDivide, keypadDivide }); tryTestWithText("divide:///////////,numpad divide:"+keypadDivideSequence); } public void testContextMenuSelection1() throws WidgetSearchException { IUIContext ui = getUI(); Text text = window.getText(); boolean previousState = window.ALPHA; ui.contextClick(new WidgetReference(text), new MenuItemLocator("alpha")); assertFalse(previousState == window.ALPHA); } public void testContextMenuFailedSelection() { IUIContext ui = getUI(); Text text = window.getText(); try { ui.contextClick(new WidgetReference(text), new MenuItemLocator("bogus")); fail("should have thrown a WNF exception"); } catch (MultipleWidgetsFoundException e) { fail("should not have thrown " + e); } catch (WidgetNotFoundException e) { //pass } catch (WidgetSearchException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }