1
/*******************************************************************************
2
* Copyright (c) 2006, 2009 Wind River Systems, Inc. and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Markus Schorn - initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.ui.tests;
13
import java.io.IOException;
14
import java.util.ArrayList;
15
import java.util.List;
17
import org.eclipse.core.commands.ExecutionException;
18
import org.eclipse.core.commands.NotEnabledException;
19
import org.eclipse.core.commands.NotHandledException;
20
import org.eclipse.core.commands.common.NotDefinedException;
21
import org.eclipse.core.resources.IContainer;
22
import org.eclipse.core.resources.IFile;
23
import org.eclipse.core.runtime.CoreException;
24
import org.eclipse.core.runtime.Path;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.SWTException;
27
import org.eclipse.swt.widgets.Composite;
28
import org.eclipse.swt.widgets.Control;
29
import org.eclipse.swt.widgets.Display;
30
import org.eclipse.swt.widgets.Event;
31
import org.eclipse.swt.widgets.Tree;
32
import org.eclipse.swt.widgets.TreeItem;
33
import org.eclipse.ui.IEditorPart;
34
import org.eclipse.ui.IEditorReference;
35
import org.eclipse.ui.IViewPart;
36
import org.eclipse.ui.IViewReference;
37
import org.eclipse.ui.IWorkbenchPage;
38
import org.eclipse.ui.IWorkbenchPartSite;
39
import org.eclipse.ui.IWorkbenchWindow;
40
import org.eclipse.ui.PartInitException;
41
import org.eclipse.ui.PlatformUI;
42
import org.eclipse.ui.WorkbenchException;
43
import org.eclipse.ui.handlers.IHandlerService;
45
import org.eclipse.cdt.core.CCorePlugin;
46
import org.eclipse.cdt.core.dom.ILinkage;
47
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
48
import org.eclipse.cdt.core.index.IIndex;
49
import org.eclipse.cdt.core.index.IIndexFile;
50
import org.eclipse.cdt.core.index.IndexLocationFactory;
51
import org.eclipse.cdt.core.model.CModelException;
52
import org.eclipse.cdt.core.model.CoreModel;
53
import org.eclipse.cdt.core.model.ICProject;
54
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
55
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
56
import org.eclipse.cdt.ui.testplugin.CTestPlugin;
57
import org.eclipse.cdt.ui.testplugin.util.StringAsserts;
59
public class BaseUITestCase extends BaseTestCase {
61
public BaseUITestCase() {
65
public BaseUITestCase(String name) {
70
* @see org.eclipse.cdt.core.testplugin.util.BaseTestCase#setUp()
73
protected void setUp() throws Exception {
75
final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
76
IViewPart view= activePage.findView("org.eclipse.cdt.ui.tests.DOMAST.DOMAST");
78
activePage.hideView(view);
83
* @see org.eclipse.cdt.core.testplugin.util.BaseTestCase#tearDown()
86
protected void tearDown() throws Exception {
92
* Reads a section in comments form the source of the given class. Fully
93
* equivalent to <code>readTaggedComment(getClass(), tag)</code>
96
protected String readTaggedComment(final String tag) throws IOException {
97
return TestSourceReader.readTaggedComment(CTestPlugin.getDefault().getBundle(), "ui", getClass(), tag);
101
* Reads multiple sections in comments from the source of the given class.
104
public StringBuffer[] getContentsForTest(int sections) throws IOException {
105
return TestSourceReader.getContentsForTest(CTestPlugin.getDefault().getBundle(), "ui", getClass(), getName(), sections);
108
protected IFile createFile(IContainer container, String fileName, String contents) throws Exception {
109
return TestSourceReader.createFile(container, new Path(fileName), contents);
112
protected IASTTranslationUnit createIndexBasedAST(IIndex index, ICProject project, IFile file) throws CModelException, CoreException {
113
return TestSourceReader.createIndexBasedAST(index, project, file);
116
protected void waitForIndexer(IIndex index, IFile file, int maxmillis) throws Exception {
117
boolean firstTime= true;
118
long endTime= System.currentTimeMillis() + maxmillis;
119
while (firstTime || System.currentTimeMillis() < endTime) {
124
if (CCorePlugin.getIndexManager().isIndexerSetupPostponed(CoreModel.getDefault().create(file.getProject())))
126
index.acquireReadLock();
128
IIndexFile pfile= index.getFile(ILinkage.CPP_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
129
if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) {
132
pfile= index.getFile(ILinkage.C_LINKAGE_ID, IndexLocationFactory.getWorkspaceIFL(file));
133
if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) {
138
index.releaseReadLock();
139
int time= (int) (endTime- System.currentTimeMillis());
141
CCorePlugin.getIndexManager().joinIndexer(time, NPM);
145
throw new Exception("Indexer did not complete in time!");
148
protected void runEventQueue(int time) {
149
final long endTime= System.currentTimeMillis()+time;
151
while (Display.getCurrent().readAndDispatch());
152
long diff= endTime-System.currentTimeMillis();
157
Thread.sleep(Math.min(20, diff));
158
} catch (InterruptedException e) {
164
protected void expandTreeItem(Tree tree, int idx) {
165
expandTreeItem(tree, new int[] {idx});
168
protected void expandTreeItem(Tree tree, int idx1, int idx2) {
169
expandTreeItem(tree, new int[] {idx1, idx2});
172
protected void expandTreeItem(Tree tree, int[] idxs) {
173
TreeItem item= tree.getItem(idxs[0]);
175
expandTreeItem(item);
176
for (int i=1; i < idxs.length; i++) {
177
item= item.getItem(idxs[i]);
179
expandTreeItem(item);
183
protected void expandTreeItem(TreeItem item) {
184
Event event = new Event();
186
item.getParent().notifyListeners(SWT.Expand, event);
187
item.setExpanded(true);
191
protected void selectTreeItem(Tree tree, int idx) {
192
selectTreeItem(tree, new int[] {idx});
195
protected void selectTreeItem(Tree tree, int idx1, int idx2) {
196
selectTreeItem(tree, new int[] {idx1, idx2});
199
protected void selectTreeItem(Tree tree, int[] idxs) {
200
TreeItem item= tree.getItem(idxs[0]);
202
for (int i=1; i < idxs.length; i++) {
203
item= item.getItem(idxs[i]);
206
tree.setSelection(item);
207
Event event = new Event();
209
item.getParent().notifyListeners(SWT.Selection, event);
213
protected void closeEditor(IEditorPart editor) {
214
IWorkbenchPartSite site;
216
if (editor != null && (site= editor.getSite()) != null && (page= site.getPage()) != null) {
217
page.closeEditor(editor, false);
221
protected void closeAllEditors() {
222
IWorkbenchWindow[] windows= PlatformUI.getWorkbench().getWorkbenchWindows();
223
for (int i= 0; i < windows.length; i++) {
224
IWorkbenchPage[] pages= windows[i].getPages();
225
for (int j= 0; j < pages.length; j++) {
226
IWorkbenchPage page= pages[j];
227
page.closeAllEditors(false);
232
protected void restoreAllParts() throws WorkbenchException {
233
IWorkbenchPage page= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
237
IViewReference[] viewRefs= page.getViewReferences();
238
for (int i = 0; i < viewRefs.length; i++) {
239
IViewReference ref = viewRefs[i];
240
page.setPartState(ref, IWorkbenchPage.STATE_RESTORED);
242
IEditorReference[] editorRefs= page.getEditorReferences();
243
for (int i = 0; i < editorRefs.length; i++) {
244
IEditorReference ref = editorRefs[i];
245
page.setPartState(ref, IWorkbenchPage.STATE_RESTORED);
250
protected IViewPart activateView(String id) throws PartInitException {
251
IViewPart view= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(id);
257
protected void executeCommand(IViewPart viewPart, String commandID) throws ExecutionException, NotDefinedException, NotEnabledException, NotHandledException {
258
IHandlerService hs= (IHandlerService)viewPart.getSite().getService(IHandlerService.class);
260
hs.executeCommand(commandID, null);
263
private Control[] findControls(Control w, Class<?> clazz) {
264
ArrayList<Control> result= new ArrayList<Control>();
265
findControls(w, clazz, result);
266
return result.toArray(new Control[result.size()]);
269
private void findControls(Control w, Class<?> clazz, List<Control> result) {
270
if (clazz.isInstance(w)) {
273
if (w instanceof Composite) {
274
Composite comp= (Composite) w;
275
Control[] children= comp.getChildren();
276
for (int i = 0; i < children.length; i++) {
277
findControls(children[i], clazz, result);
282
final protected TreeItem checkTreeNode(IViewPart part, int i0, String label) {
285
StringBuilder cands= new StringBuilder();
286
for (int i=0; i<400; i++) {
288
Control[] trees= findControls(part.getSite().getShell(), Tree.class);
289
for (int j = 0; j < trees.length; j++) {
291
tree= (Tree) trees[j];
292
root= tree.getItem(i0);
293
if (label.equals(root.getText())) {
299
cands.append(root.getText());
301
catch (SWTException e) {
302
// in case widget was disposed, item may be replaced
304
catch (IllegalArgumentException e) {
305
// item does not yet exist.
310
assertNotNull("No tree in viewpart", tree);
311
assertNotNull("Tree node " + label + "{" + i0 + "} does not exist!", root);
312
assertEquals(label, cands.toString());
316
final protected TreeItem checkTreeNode(Tree tree, int i0, String label) {
318
for (int millis=0; millis < 5000; millis= millis==0 ? 1 : millis*2) {
319
runEventQueue(millis);
321
root= tree.getItem(i0);
322
if (label.equals(root.getText())) {
326
catch (SWTException e) {
327
// in case widget was disposed, item may be replaced
329
catch (IllegalArgumentException e) {
330
// item does not yet exist.
333
assertNotNull("Tree node " + label + "{" + i0 + "} does not exist!", root);
334
assertEquals(label, root.getText());
338
final protected TreeItem checkTreeNode(Tree tree, int i0, int i1, String label) {
340
String itemText= null;
341
for (int millis=0; millis < 5000; millis= millis==0 ? 1 : millis*2) {
342
runEventQueue(millis);
343
TreeItem root= tree.getItem(i0);
345
TreeItem firstItem= root.getItem(0);
346
final String text= firstItem.getText();
347
if (text.length() > 0 && !text.equals("...")) {
348
item= root.getItem(i1);
349
itemText= item.getText();
350
assertNotNull("Unexpected tree node " + itemText, label);
351
if (label.equals(itemText)) {
355
assertEquals(label, itemText);
359
} catch (IllegalArgumentException e) {
361
fail("Tree node " + label + "{" + i0 + "," + i1 + "} does not exist!");
364
} catch (SWTException e) {
365
// widget was disposed, try again.
368
assertEquals("Timeout expired waiting for tree node {" + i0 + "," + i1 + "}", label, itemText);
372
public static void assertEqualString(String actual, String expected) {
373
StringAsserts.assertEqualString(actual, expected);