/******************************************************************************* * Copyright (c) 2009, 2014 Wind River Systems, Inc. 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.ui.tests.outline; import junit.framework.TestSuite; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.ui.testplugin.EditorTestHelper; import org.eclipse.cdt.ui.tests.BaseUITestCase; import org.eclipse.cdt.internal.ui.editor.CEditor; /** * Basic outline view tests. */ public class BasicOutlineTest extends BaseUITestCase { public static TestSuite suite() { return suite(BasicOutlineTest.class); } private ICProject fCProject; @Override protected void setUp() throws Exception { super.setUp(); restoreAllParts(); fCProject = CProjectHelper.createCCProject(getName()+System.currentTimeMillis(), "bin", IPDOMManager.ID_FAST_INDEXER); } @Override protected void tearDown() throws Exception { closeAllEditors(); PreferenceConstants.getPreferenceStore().setToDefault(PreferenceConstants.OUTLINE_GROUP_MEMBERS); PreferenceConstants.getPreferenceStore().setToDefault(PreferenceConstants.OUTLINE_GROUP_NAMESPACES); if (fCProject != null) { CProjectHelper.delete(fCProject); } super.tearDown(); } protected CEditor openEditor(IFile file) throws PartInitException { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); CEditor editor= (CEditor) IDE.openEditor(page, file); EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(editor), 100, 1000, 10); runEventQueue(500); return editor; } protected ICProject getProject() { return fCProject; } private void waitForIndexer(IProject project, IFile source) throws Exception, CoreException { waitUntilFileIsIndexed(CCorePlugin.getIndexManager().getIndex(fCProject), source); } private void checkTreeItems(TreeItem[] items, String... labels) { assertEquals(items.length, labels.length); int i= 0; for (TreeItem treeItem : items) { assertEquals(labels[i++], treeItem.getText()); } } //#include "user.h" //#include <system.h> //#define MACRO //#define MACRO2() //int main(int argc, char** argv) {} public void testSimpleOutlineContent() throws Exception { StringBuilder[] contents= getContentsForTest(1); IProject project= getProject().getProject(); IFile source= createFile(project, "source.cpp", contents[0].toString()); waitForIndexer(project, source); final IViewPart outline= activateView(IPageLayout.ID_OUTLINE); openEditor(source); Tree tree= checkTreeNode(outline, 0, "user.h").getParent(); checkTreeNode(tree, 1, "system.h"); checkTreeNode(tree, 2, "MACRO"); checkTreeNode(tree, 3, "MACRO2()"); checkTreeNode(tree, 4, "main(int, char**) : int"); } //class Foo { // static int field; // void bar(); // void foo(); //}; //#include "header.h" //void Foo::bar() {} //int Foo::field = 5; //void Foo::foo() {} public void testGroupedMembers() throws Exception { StringBuilder[] contents= getContentsForTest(2); IProject project= getProject().getProject(); IFile header= createFile(project, "header.h", contents[0].toString()); IFile source= createFile(project, "source.cpp", contents[1].toString()); waitForIndexer(project, source); final IViewPart outline= activateView(IPageLayout.ID_OUTLINE); openEditor(source); Tree tree= checkTreeNode(outline, 0, "header.h").getParent(); checkTreeNode(tree, 1, "Foo::bar() : void"); checkTreeNode(tree, 2, "Foo::field : int"); checkTreeNode(tree, 3, "Foo::foo() : void"); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_MEMBERS, true); runEventQueue(500); tree= checkTreeNode(outline, 0, "header.h").getParent(); expandTreeItem(checkTreeNode(outline, 1, "Foo")); checkTreeNode(tree, 1, 0, "bar() : void"); checkTreeNode(tree, 1, 1, "field : int"); checkTreeNode(tree, 1, 2, "foo() : void"); } //namespace ns { //class Foo { // static int field; // void bar(); // void foo(); //}; //}; //#include "header.h" //namespace ns { //void Foo::bar() {} //} //namespace ns { //int Foo::field = 5; //void Foo::foo() {} //} public void testGroupedMembersInNamespace() throws Exception { StringBuilder[] contents= getContentsForTest(2); IProject project= getProject().getProject(); IFile header= createFile(project, "header.h", contents[0].toString()); IFile source= createFile(project, "source.cpp", contents[1].toString()); waitForIndexer(project, source); final IViewPart outline= activateView(IPageLayout.ID_OUTLINE); openEditor(source); TreeItem item= checkTreeNode(outline, 0, "header.h"); Tree tree= item.getParent(); expandTreeItem(checkTreeNode(tree, 1, "ns")); checkTreeNode(tree, 1, 0, "Foo::bar() : void"); expandTreeItem(checkTreeNode(tree, 2, "ns")); checkTreeNode(tree, 2, 0, "Foo::field : int"); checkTreeNode(tree, 2, 1, "Foo::foo() : void"); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_MEMBERS, true); runEventQueue(500); checkTreeNode(outline, 0, "header.h"); expandTreeItem(checkTreeNode(tree, 1, "ns")); expandTreeItem(item= checkTreeNode(tree, 1, 0, "Foo")); checkTreeItems(item.getItems(), "bar() : void"); expandTreeItem(checkTreeNode(tree, 2, "ns")); expandTreeItem(item= checkTreeNode(tree, 2, 0, "Foo")); checkTreeItems(item.getItems(), "field : int", "foo() : void"); } //namespace ns { //class Foo { // static int field; // void bar(); // void foo(); //}; //}; //#include "header.h" //namespace ns { //void Foo::bar() {} //} //namespace ns { //int Foo::field = 5; //void Foo::foo() {} //} public void testGroupedNamespaces() throws Exception { StringBuilder[] contents= getContentsForTest(2); IProject project= getProject().getProject(); IFile header= createFile(project, "header.h", contents[0].toString()); IFile source= createFile(project, "source.cpp", contents[1].toString()); waitForIndexer(project, source); final IViewPart outline= activateView(IPageLayout.ID_OUTLINE); openEditor(source); TreeItem item= checkTreeNode(outline, 0, "header.h"); Tree tree= item.getParent(); expandTreeItem(checkTreeNode(tree, 1, "ns")); checkTreeNode(tree, 1, 0, "Foo::bar() : void"); expandTreeItem(checkTreeNode(tree, 2, "ns")); checkTreeNode(tree, 2, 0, "Foo::field : int"); checkTreeNode(tree, 2, 1, "Foo::foo() : void"); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_NAMESPACES, true); runEventQueue(500); checkTreeNode(outline, 0, "header.h"); expandTreeItem(checkTreeNode(tree, 1, "ns")); checkTreeNode(tree, 1, 0, "Foo::bar() : void"); checkTreeNode(tree, 1, 1, "Foo::field : int"); checkTreeNode(tree, 1, 2, "Foo::foo() : void"); } //namespace ns { //class Foo { // static int field; // void bar(); // void foo(); //}; //}; //#include "header.h" //namespace ns { //void Foo::bar() {} //} //namespace ns { //int Foo::field = 5; //void Foo::foo() {} //} public void testGroupedMembersInGroupedNamespaces() throws Exception { StringBuilder[] contents= getContentsForTest(2); IProject project= getProject().getProject(); IFile header= createFile(project, "header.h", contents[0].toString()); IFile source= createFile(project, "source.cpp", contents[1].toString()); waitForIndexer(project, source); final IViewPart outline= activateView(IPageLayout.ID_OUTLINE); openEditor(source); TreeItem item= checkTreeNode(outline, 0, "header.h"); Tree tree= item.getParent(); expandTreeItem(checkTreeNode(tree, 1, "ns")); checkTreeNode(tree, 1, 0, "Foo::bar() : void"); expandTreeItem(checkTreeNode(tree, 2, "ns")); checkTreeNode(tree, 2, 0, "Foo::field : int"); checkTreeNode(tree, 2, 1, "Foo::foo() : void"); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_MEMBERS, true); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_NAMESPACES, true); runEventQueue(500); checkTreeNode(outline, 0, "header.h"); expandTreeItem(checkTreeNode(tree, 1, "ns")); expandTreeItem(item= checkTreeNode(tree, 1, 0, "Foo")); checkTreeItems(item.getItems(), "bar() : void", "field : int", "foo() : void"); } }