| /******************************************************************************* |
| * Copyright (c) 2004, 2007 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ui.tests.dnd; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IWorkbenchPreferenceConstants; |
| import org.eclipse.ui.internal.WorkbenchPage; |
| import org.eclipse.ui.internal.WorkbenchWindow; |
| import org.eclipse.ui.internal.dnd.TestDropLocation; |
| import org.eclipse.ui.internal.util.PrefUtil; |
| import org.eclipse.ui.part.FileEditorInput; |
| import org.eclipse.ui.tests.api.MockEditorPart; |
| import org.eclipse.ui.tests.autotests.AbstractTestLogger; |
| import org.eclipse.ui.tests.autotests.UITestCaseWithResult; |
| import org.eclipse.ui.tests.harness.util.FileUtil; |
| |
| /** |
| * Tests a single drag-drop scenario, given a dragSource capable of initiating the drag and |
| * a dropTarget that can locate the drop location. DragTestSuite will create a large number |
| * of DragTests by matching combintations of drag sources with drop targets. |
| *<p></p> |
| * <p> |
| * <b>TEST NAMES:</b> |
| * </p> |
| * <p> |
| * The name of the test indicates what drag scenario was being attempted. For example, the |
| * test "drag Navigator to right of editor area" drags the Navigator view over |
| * the editor area, dropping it near the right edge. Drag sources are described as follows: |
| * </p> |
| * <p></p> |
| * <p> |
| * [maximized] viewname [folder] |
| * </p> |
| * <p></p> |
| * <p>Drag sources prefixed by "maximized" were maximized at the time the drag started. |
| * The word [folder] indicates that folder containing the given editor or view was being dragged. |
| * Otherwise, the view itself was being dragged.</p> |
| * <p></p> |
| * <p>Drop targets are described as follows:</p> |
| * <p></p> |
| * <p> |
| * [left|right|top|bottom|center] of targetname |
| * </p> |
| * <p></p> |
| * <p>Drop targets are always on top of the target. That is, "right of Navigator" means "on top of |
| * the navigator view near its right edge" -- NOT "to the right of the Navigator view". When the |
| * drop target is on an edge, it is always located 1 pixel away from the middle of that edge.</p> |
| * |
| *<p></p> |
| * <p> |
| * <b>WHAT TO DO IF THIS TEST FAILS:</b> |
| * </p> |
| * <p> |
| * If a drag operation did not have the intended effect, the test will fail with |
| * a result like: |
| * </p> |
| * <p></p> |
| * <p> |
| * Expecting 'layout ((((*Navigator)-active (*Problems))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))' and found 'layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))-active (*Navigator))' |
| * </p> |
| * <p></p> |
| * <p> |
| * The expected and actual results are ASCII pictures of the layout. A stack of views or editors |
| * is shown as a list enclosed in brackets, with an asterisk indicating the selected pane. The stack |
| * may be prefixed by the words "active" or "active_nofocus" if they currently have the active or |
| * active_nofocus appearance. Inactive stacks have no prefix. |
| * </p> |
| * <p></p> |
| * <p> |
| * For example, (Problems, *Console, Properties) indicates a stack containing the Problems, Console, and Properties views, |
| * where the Console view was currently selected. The root layout and editor areas are shown as "layout (...)". A vertical sash is shown as a |
| * bar "|" and a horizontal sash is shown using a dash "-". All drag tests are done in the Drag Test |
| * Perspective. |
| * </p> |
| * <p> |
| * The initial layout is: |
| * </p> |
| * <p></p> |
| * <p> |
| * layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties)) |
| * </p> |
| * <p></p> |
| * <p> |
| * Where editor 0 is "Mock Editor 1", and editors 1 and 2 are shown as "Mock Editor 2". |
| * </p> |
| * <p></p> |
| * <p> |
| * If you see a message like "dragtests.xml is out of date", this indicates that new tests |
| * were added without describing their intended behavior in dragtests.xml. In that case, ensure that |
| * there are currently no failures and regenerate dragtests.xml as described below. |
| * </p> |
| * <p></p> |
| * <p> |
| * <b>WHAT TO DO IF THE INTENTED BEHAVIOR CHANGES:</b> |
| * </p> |
| * <p> |
| * If new tests are added or the existing drag/drop behavior is changed, it will |
| * be necessary to update dragtests.xml. Do this as follows:</p> |
| * <ul> |
| * <li>include org.eclipse.ui.tests with your other plugins and launch an inner workspace</li> |
| * <li>Go to customize perspective... -> commands -> Drag Test. This will add the "Drag-Drop Snapshot" item to your menubar.</li> |
| * <li>Select "Drag-Drop Snapshot"</li> |
| * <li>Select a file where the new shapshot will be saved, and click Okay</li> |
| * <li>DO NOT use the mouse while generating dragtests.xml. This |
| * can interfere with the tests and cause an incorrect behavior to be recorded as the expected behavior. |
| * In particular, focus changes should be avoided.</li> |
| * <li>Wait for several minutes while the test runs</li> |
| * <li>When the test is complete, copy the file over the old data/dragtests.xml file</li> |
| * </ul> |
| * <p> |
| * At this point, the current drag/drop behavior will be considered the correct behavior, |
| * and deviations will cause the test suites to fail. |
| * </p> |
| * |
| * @since 3.0 |
| */ |
| public class DragTest extends UITestCaseWithResult { |
| TestDragSource dragSource; |
| |
| TestDropLocation dropTarget; |
| |
| String intendedResult; |
| |
| // |
| static IProject project; |
| |
| static IFile file1, file2; |
| |
| IEditorPart editor1, editor2; |
| |
| static IFile file3; |
| |
| IEditorPart editor3; |
| |
| static WorkbenchWindow window; |
| |
| static WorkbenchPage page; |
| |
| public DragTest(TestDragSource dragSource, TestDropLocation dropTarget, AbstractTestLogger log, String suffix) { |
| super("drag " + dragSource.toString() + " to " + dropTarget.toString() + suffix, log); |
| this.dragSource = dragSource; |
| this.dropTarget = dropTarget; |
| } |
| |
| public DragTest(TestDragSource dragSource, TestDropLocation dropTarget, AbstractTestLogger log) { |
| this(dragSource, dropTarget, log, ""); |
| } |
| |
| public void doSetUp() throws Exception { |
| // don't allow UITestCase to manage the deactivation of our window |
| manageWindows(false); |
| //window = (WorkbenchWindow)openTestWindow(); |
| |
| //initialize the window |
| if (window == null) { |
| window = (WorkbenchWindow) fWorkbench.openWorkbenchWindow( |
| "org.eclipse.ui.tests.dnd.dragdrop", getPageInput()); |
| |
| page = (WorkbenchPage) window.getActivePage(); |
| |
| project = FileUtil.createProject("DragTest"); //$NON-NLS-1$ |
| file1 = FileUtil.createFile("DragTest1.txt", project); //$NON-NLS-1$ |
| file2 = FileUtil.createFile("DragTest2.txt", project); //$NON-NLS-1$ |
| file3 = FileUtil.createFile("DragTest3.txt", project); //$NON-NLS-1$ |
| |
| // Disable animations since they occur concurrently and can interferre |
| // with locating drop targets |
| IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); |
| apiStore.setValue( |
| IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, |
| false); |
| } |
| |
| page.resetPerspective(); |
| page.closeAllEditors(false); |
| |
| //ensure that contentoutline is the focus part (and at the top of its stack) |
| page.showView("org.eclipse.ui.views.ContentOutline"); |
| page.hideView(page.findView("org.eclipse.ui.internal.introview")); |
| editor1 = page.openEditor(new FileEditorInput(file1), |
| MockEditorPart.ID1); |
| editor2 = page.openEditor(new FileEditorInput(file2), |
| MockEditorPart.ID2); |
| editor3 = page.openEditor(new FileEditorInput(file3), |
| MockEditorPart.ID2); |
| |
| window.getShell().setActive(); |
| DragOperations |
| .drag(editor2, new EditorDropTarget(new ExistingWindowProvider(window), 0, SWT.CENTER), false); |
| DragOperations |
| .drag(editor3, new EditorAreaDropTarget(new ExistingWindowProvider(window), SWT.RIGHT), false); |
| } |
| |
| /** |
| * This method is useful in order to 'freeze' the test environment after a particular test in order to |
| * manipulate the environment to figure out what's going on. It essentially opens a new shell and enters |
| * a modal loop on it, preventing the tests from continuing until the 'stall' shell is closed. Note that |
| * using a dialog would prevent us from manipulating the shell that the drag and drop tests are being performed in |
| */ |
| public void stallTest() { |
| // Add the explicit test names that you want to stall on here... |
| // (It's probably easiest to cut them directly from the exected results file) |
| String[] testNames = { |
| }; |
| |
| // Does the name match any of the explicit test names?? |
| boolean testNameMatches = false; |
| for (int i = 0; i < testNames.length; i++) { |
| if (testNames[i].equals(this.getName())) { |
| testNameMatches = true; |
| break; |
| } |
| } |
| |
| // Stall always if no explicit names are supplied. Otherwise only stall when there's a |
| // match. |
| if (testNames.length == 0 || testNameMatches) { |
| Display display = Display.getCurrent(); |
| Shell loopShell = new Shell(display, SWT.SHELL_TRIM); |
| loopShell.setBounds(0,0,200,100); |
| loopShell.setText("Test Stall Shell"); |
| loopShell.setVisible(true); |
| |
| while (loopShell != null && !loopShell.isDisposed()) { |
| if (!display.readAndDispatch()) |
| display.sleep(); |
| } |
| } |
| } |
| |
| public String performTest() throws Throwable { |
| // Uncomment the following line to 'stall' the tests here... |
| //stallTest(); |
| |
| // KLUDGE!! revert to the old min/max when dragging maximized views |
| // see bug 180242. This code should disappear before release... |
| IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); |
| boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX); |
| if (getName().indexOf("drag maximized") >= 0) |
| apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false); |
| |
| dragSource.setPage(page); |
| |
| dragSource.drag(dropTarget); |
| |
| page.testInvariants(); |
| |
| // Uncomment the following line to 'stall' the tests here... |
| //stallTest(); |
| |
| // KLUDGE!! Restore the min/max pref |
| apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState); |
| |
| return DragOperations.getLayoutDescription(page); |
| } |
| } |